RPi-Pico Drehstromgenerator                 


Elektronik-Labor  Projekte  Mikrocontroller  Raspberry            




Beim Ausschlachten einer alten Festplatte (Video, ab Minute 12) ist mir ein Dreiphasen-Motor in die Hände gefallen. Er ist extrem gut gelagert und leichtgängig. Da kam der Gedanke auf, ihn mit einem Drehstromgenerator in Gang zu setzen. Weil es ein Synchronmotor ist, muss er langsam angefahren werden. Die Frequenz muss also bis zum Sollwert kontinuierlich erhöht werden. Dafür sollte ein DDS-Generator mit drei Phasen an drei PWM-Ausgängen verwendet werden.



Der einfachste aller möglichen Motortreiber besteht aus drei komplementären Emitterfolgern, ähnlich wie man es in Gegentaktendstufen macht. Sie sollen hier direkt mit den PWM-Signalen angesteuert werden. Eine gewisse Glättung soll durch die Induktivität der Motorspulen erreicht werden. Ein Nachteil ist der Spannungsverlust von ca. 0,7 V pro Transistor. Aus einem PWM-Signal von 3,3 Vss wird am Ausgang eines von 1,9 Vss. Die Motorspulen haben ca. 6 Ohm, sodass ein maximaler Strom von 300 mA fließen kann, den die Transistoren gerade noch schaffen.

#DDS4.py Motortreiber
from machine import Pin, Timer, PWM
import time

pwm0 = PWM(Pin(0))
pwm0.freq(5000)
pwm1 = PWM(Pin(2))
pwm1.freq(5000)
pwm2 = PWM(Pin(4))
pwm2.freq(5000)

tim = Timer()
x =[128,176,217,245,254,245,217,176,128,80,39,11,2,11,38,80,128]
t=0
def tick(timer):
    global t
    global f
    t += f
    t1 = int(t / 100) & 15
    t2 = (t1 + 5) & 15
    t3 = (t1 + 10) & 15
    pwm0.duty_u16(256*x[t1])
    pwm1.duty_u16(256*x[t2])
    pwm2.duty_u16(256*x[t3])
   
tim.init(freq=1600, mode=Timer.PERIODIC, callback=tick)

for f in range(31):
    time.sleep(0.2)
    print(f, " Hz")
while 1:
    time.sleep (1)


Die Sinustabelle besteht aus 16 Werten für eine volle Schwingung, damit man die letzten vier Bits des Adresszeigers mit & 15 isolieren kann. Die fortlaufen ausgegebenen Stützwerte sollten in drei glichen Abständen an die drei PWM-Ausgänge ausgegeben werden, sodass Phasendifferenzen von 120 Grad entstehen. Weil man aber 16 nicht durch 3 teilen kann, werden die Positionen 0, 5 und 10 verwendet. Die kleine Ungenauigkeit in den Phasendifferenzen stört den Motor nicht. Hier werden also drei Sinussignale mit genauen Frequenzen in Hertz erzeugt. In der Schleife fährt die Frequenz von 0 Hz bis 30 Hz hoch. Bei 1 Hz ruckelt der Motor noch deutlich sichtbar, ab 5 Hz läuft er schon rund. Die maximal erreichbare Frequenz ist 40 Hz, weil dann die Induktionsspannung ähnlich groß wird wie die erzeugte Spannung. Für höhere Drehgeschwindigkeiten müsste ich mehr Spannung liefern.



Die letzte Frequenz von 30 Hz bleibt beliebig lange erhalten. Der Motor läuft dabei völlig stabil und geräuschlos. Man kann ihn mit der Hand anhalten, aber danach läuft er nicht mehr von allein an. Man kann ihn aber manuell anwerfen. Oder man startet das Programm neu, dann läuft er von allein wieder an. Auch eine der beiden Platten kann man auflegen, sie läuft dann problemlos mit.





Elektronik-Labor  Projekte  Mikrocontroller  Raspberry