29. Lektion: Puls Weiten Modulation (PWM)Aus Attraktor WikiVersion vom 29. Januar 2024, 17:30 Uhr von Kapest (Diskussion | Beiträge) InhaltsverzeichnisPulsWeitenModulation (PWM) was ist das?PWM bedeutet, dass in regelmässigen Abständen ein Impuls definierter Länge ausgegeben wird. Diese Konzept wird z.B. zur Steuerung von Servos, aber auch zur Erzeugung analoger Spannungen eingesetzt.
PWM im PicoEs gibt 8 unabhängige PWM-Generatoren, so genannte Slices, die jeweils zwei Kanäle haben, so dass insgesamt 16 PWM-Kanäle zur Verfügung stehen, die von 8 Hz bis 62,5 MHz bei einer machine.freq() von 125 MHz getaktet werden können. Beschränkungen der PWMAufgrund der diskreten Natur der Computerhardware können nicht alle Frequenzen mit absoluter Genauigkeit erzeugt werden. In der Regel wird die PWM-Frequenz durch Teilung einer ganzzahligen Basisfrequenz durch einen ganzzahligen Teiler ermittelt. Wenn die Basisfrequenz beispielsweise 80 MHz beträgt und die gewünschte PWM-Frequenz 300 kHz ist, muss der Teiler eine nicht ganzzahlige Zahl sein 80000000 / 300000 = 266,67. Nach dem Runden wird der Teiler auf 267 gesetzt und die PWM-Frequenz ist 80000000 / 267 = 299625,5 Hz, nicht 300kHz. Wenn der Teiler auf 266 gesetzt wird, dann ist die PWM-Frequenz 80000000 / 266 = 300751,9 Hz, aber wieder nicht 300kHz.
# beide der folgenden Codezeilen ergeben das selbe 50% duty cycle. pwm=PWM(Pin(13), freq=300_000, duty_u16=2**16//2) wm=PWM(Pin(13), freq=300_000, duty_u16=2**16//2 + 255) Die höchste Frequenz für die vollen 16-Bit Duty-Cycle beträgt 953,6743 Hz: >>> 125e6/2/2**16 953.6743 Eine Instanz von PWM erzeugenmachine.PWM(dest, *, freq, duty_u16, duty_ns, invert)
from machine import Pin, PWM # create PWM object from a pin and set the frequency of slice 0 # and duty cycle for channel A >>> pwm0 = PWM(Pin(0), freq=2000, duty_u16=32768) >>> print(pwm0) <PWM slice=0 channel=0 invert=0> Die Parameter ändernpwm0.freq() # get the current frequency of slice 0 pwm0.freq(1000) # set/change the frequency of slice 0 pwm0.duty_u16() # get the current duty cycle of channel A, range 0-65535 pwm0.duty_u16(200) # set the duty cycle of channel A, range 0-65535 pwm0.duty_u16(0) # stop the output at channel A print(pwm0) # show the properties of the PWM object. pwm0.deinit() # turn off PWM of slice 0, stopping channels A and B Slices & ChannelsWas sind Slices und Channels? Die Doku von Micropython.org hat bei mir noch einigen Nebel hinterlassen. Deshalb habe ein wenig herumgespielt: >>> from machine import Pin, PWM >>> pwm0 = PWM(Pin(0), freq=2000, duty_u16=32768) >>> print(pwm0) <PWM slice=0 channel=0 invert=0> >>> pwm1 = PWM(Pin(1), freq=2000, duty_u16=32768) >>> print(pwm1) <PWM slice=0 channel=1 invert=0> >>> pwm2 = PWM(Pin(2), freq=2000, duty_u16=32768) >>> print(pwm2) <PWM slice=1 channel=0 invert=0> >>> pwm4 = PWM(Pin(4), freq=2000, duty_u16=32768) >>> print(pwm4) <PWM slice=2 channel=0 invert=0> >>> pwm10 = PWM(Pin(10), freq=2000, duty_u16=32768) >>> print(pwm10) <PWM slice=5 channel=0 invert=0> # Wenn's nervt: >>> pwm10.deinit() # Dann ist Ruhe. # Die Frequenz ist in einem Slice immer gleich: >>> pwm0.freq(1000) >>> pwm0.freq() 1000 >>> pwm1.freq() 1000 >>> pwm1.freq(5000) >>> pwm0.freq() 5000 >>> pwm1.freq() 5000 # Hinterm Horizont geht's weiter >>> pwmy = PWM(Pin(16), freq=2000, duty_u16=32768) >>> print(pwmy) <PWM slice=0 channel=0 invert=0> >>> pwmx = PWM(Pin(22), freq=2000, duty_u16=32768) >>> print(pwmx) <PWM slice=3 channel=0 invert=0> # Siehe da >>> pwm1.freq() 2000 Praktische AnwendungWir wollen die LED auf dem Demoboard dimmen: # pwm_test_01.py from machine import Pin, PWM from time import sleep_ms pwm = PWM(Pin(22), freq=100000, duty_ns=9999) for i in range(0,10000): pwm.duty_ns(i) print(pwm.duty_ns()) sleep_ms(10) # Ausgabe: 3928 3928 3936 3936 3936 3936 3936 3936 3936 3936 3944 3944 3944 3944 3944 3944 3944 3944 3952 3952 Und jetzt noch mal quadratisch: from machine import Pin, PWM from time import sleep_ms pwm = PWM(Pin(22), freq=100000, duty_ns=9999) for i in range(256): pwm.duty_u16(i*i) print(i, pwm.duty_u16()) sleep_ms(20)
Links:
Zurück zur "Micropython Kurs 2023 Teil 2" Startseite |