Řízení PWM motorů v robotice: Komplexní průvodce
Reklama:Pulzně šířková modulace (PWM) představuje základní technologii pro efektivní řízení motorů v moderní robotice. Tato metoda umožňuje precizní ovládání rychlosti a polohy motorů prostřednictvím digitálních signálů, což je klíčové pro konstrukci přesných a energeticky efektivních robotických systémů. V tomto článku se podrobně seznámíme s principem PWM, jejím využitím pro různé typy motorů a praktickými aspekty implementace. Pokryjeme rozdíly mezi průběžnými a neprůběžnými servomotory, ukážeme si konkrétní ukázky kódu v MicroPythonu a zaměříme se na běžné problémy a jejich řešení. Článek poskytuje ucelený přehled jak pro začátečníky, tak pro pokročilé robotiky, kteří chtějí optimalizovat své projekty.
Co je to PWM a jak se používá k řízení motorů
PWM (Pulse Width Modulation) neboli pulzně šířková modulace je diskrétní modulace pro přenos analogového signálu pomocí dvouhodnotového signálu5. Jedná se o metodu řízení elektronických obvodů pomocí manipulace se samotným řídicím signálem, přesněji řečeno s jeho technickými parametry2. V podstatě jde o techniku pro získání analogových výsledků s digitálními prostředky3.
PWM funguje na principu rychlého spínání a vypínání napájecího napětí. Vytváří obdélníkový signál, který střídavě přepíná mezi zapnutým a vypnutým stavem. Klíčovými parametry tohoto signálu jsou:
- Frekvence - určuje, kolikrát za sekundu se opakuje celý cyklus
- Střída (duty cycle) - poměr doby trvání logické 1 (zapnuto) k celkové periodě signálu4
Při řízení motorů pomocí PWM se využívá skutečnosti, že průměrná hodnota napětí dodávaného do motoru je závislá na střídě PWM signálu. Když je střída 0%, motor je zcela vypnutý. Při střídě 100% běží motor na plný výkon4. Nastavením střídy mezi těmito hodnotami můžeme plynule regulovat výkon motoru.
Výhodou PWM regulace oproti lineární regulaci je její vysoká energetická účinnost. Motor je v každém okamžiku buď plně zapnutý nebo plně vypnutý, což minimalizuje tepelné ztráty na regulačním prvku17. Tento typ regulace je velmi úsporný, protože dochází k minimálním tepelným ztrátám a navíc je motor schopen poskytnout vyšší výkon18.
U servomotorů se PWM signál používá mírně odlišným způsobem - zde šířka pulzu určuje požadovanou pozici serva. Standardní RC servo očekává signál s frekvencí 50 Hz (perioda 20 ms) a podle šířky pulzu (typicky 1-2 ms) nastavuje svoji pozici9 11.
Údaje udávané u PWM motorů a jejich význam
Při výběru a používání PWM motorů je důležité rozumět parametrům, které výrobci udávají. Tyto údaje nám pomohou určit vhodnost daného motoru pro konkrétní aplikaci.
Frekvence PWM signálu
Frekvence udává, kolikrát za sekundu se opakuje celý cyklus PWM signálu. U standardních servomotorů se typicky používá frekvence 50 Hz, což odpovídá periodě 20 ms9 11. U některých aplikací může být požadována jiná frekvence.
Střída (Duty Cycle)
Střída je poměr doby trvání logické 1 (vysoké úrovně) k celkové periodě signálu4. Udává se v procentech. Například pokud máme signál s periodou 1 000 ms a doba trvání logické 1 je 150 ms, pak střída má hodnotu 15 %4.
Šířka pulzu
U servomotorů se často místo střídy udává přímo šířka pulzu v milisekundách, kde:
- 1 ms typicky odpovídá pozici 0°
- 1,5 ms odpovídá středové pozici (90°)
- 2 ms odpovídá pozici 180°9
Pracovní napětí motoru
Určuje rozsah napětí, při kterém motor správně funguje. Například servo SG90 může pracovat při napětí 4,8-6 V9. Překročení tohoto rozsahu může vést k poškození motoru nebo k nestabilnímu chování.
Točivý moment (kroutící moment)
Udává sílu motoru, často v kg/cm nebo Ncm. Například servo MG996R má maximální točivý moment 11 kg/cm při 6V8. Tento údaj říká, jakou silou může motor působit na vzdálenost 1 cm od osy rotace.
Rychlost otáčení
U standardních serv se udává čas potřebný k otočení o určitý úhel, například 0,12 s/60° u serva SG90 při 4,8V9. U kontinuálních serv se uvádí maximální rychlost otáčení, například 130 RPM (otáček za minutu) u serva FS90R7.
Rozsah pohybu
U standardních serv určuje, v jakém úhlovém rozsahu se může servo pohybovat, typicky 0-180°8 9. U kontinuálních serv tento údaj není relevantní, protože se mohou otáčet neomezeně.
Proud
Udává maximální proud, který může motor odebírat. Tento parametr je klíčový pro dimenzování napájecích zdrojů a ovládací elektroniky. Například servo SG90 má maximální odběr proud menší než 600 mA9.
Rozdělení motorů na průběžné serva a neprůběžné serva
V robotice se setkáváme s různými typy motorů řízenými pomocí PWM. Základní rozdělení podle způsobu ovládání a funkce je následující:
Neprůběžné serva (standardní serva)
Standardní servomotory, označované jako neprůběžné, jsou navrženy pro polohování v omezeném rozsahu. Jejich hlavní charakteristiky jsou:
- Omezený rozsah pohybu: Typicky 0-180° (někdy pouze 0-120° nebo jiný omezený rozsah)8 9
- Polohové řízení: PWM signál určuje absolutní pozici, do které se má servo nastavit
- Zpětná vazba: Obsahují interní potenciometr, který poskytuje zpětnou vazbu o aktuální pozici
- PWM parametry: Standardně pracují s frekvencí 50 Hz a šířkou pulzu 1-2 ms, kde:
- Pulz šířky 1 ms = pozice 0°
- Pulz šířky 1,5 ms = pozice 90° (středová poloha)
- Pulz šířky 2 ms = pozice 180°9
Typickými zástupci jsou serva jako SG90 (mikro servo) nebo MG996R (servo s kovovými převody)8[ ^9].
Průběžné serva (kontinuální serva)
Kontinuální nebo průběžná serva jsou upravena tak, aby se mohla otáčet neomezeně v obou směrech. Jejich hlavní charakteristiky jsou:
- Neomezený rozsah pohybu: Mohou se otáčet kontinuálně v libovolném směru
- Rychlostní řízení: PWM signál neurčuje pozici, ale rychlost a směr otáčení
- Bez zpětné vazby o pozici: Standardně neposkytují informaci o aktuální poloze
- PWM parametry: Také pracují s frekvencí 50 Hz, ale interpretace šířky pulzu je jiná:
Typickým zástupcem je FEETECH FS90R mikro kontinuální rotační servo7.
DC motory s PWM řízením
Kromě serv se v robotice často používají i stejnosměrné (DC) motory řízené pomocí PWM. Tyto motory nemají vestavěnou řídicí elektroniku a vyžadují externí ovladač. Jejich charakteristiky jsou:
- Neomezený rozsah pohybu: Mohou se otáčet kontinuálně
- Rychlostní řízení: PWM signál určuje rychlost otáčení
- Změna směru: Pro změnu směru je potřeba změnit polaritu napájení (např. pomocí H-můstku)
- Bez zpětné vazby: Standardně neposkytují informaci o aktuální rychlosti nebo pozici
- PWM parametry: Frekvence může být různá, typicky 1000 Hz14
Pro řízení DC motorů se často používají specializované ovladače jako L298N14 17.
Ukázkové programy v MicroPythonu na ovládání motorů
Program pro ovládání standardního serva (neprůběžného)
Pro Raspberry Pi Pico v MicroPythonu lze standardní servo ovládat následujícím způsobem:
from machine import Pin, PWM
import time
# Nastavení pinu pro servo
servo_pin = PWM(Pin(15)) # Použití pinu GP15
servo_pin.freq(50) # Frekvence 50Hz pro standardní serva
def set_position(position):
# Převod pozice (0-180) na šířku pulzu (1000-2000 mikrosekund)
# Pro servo je typicky 1000us = 0°, 1500us = 90°, 2000us = 180°
pulse_width = 1000 + (position * 1000 // 180)
# Převod šířky pulzu na střídu (0-65535)
duty = pulse_width * 65535 // 20000
servo_pin.duty_u16(duty)
# Ukázka pohybu serva
while True:
# Pohyb na pozici 0°
set_position(0)
print("Pozice: 0°")
time.sleep(1)
# Pohyb na pozici 90°
set_position(90)
print("Pozice: 90°")
time.sleep(1)
# Pohyb na pozici 180°
set_position(180)
print("Pozice: 180°")
time.sleep(1)
Tento kód využívá PWM funkcionalitu MicroPythonu pro nastavení šířky pulzu odpovídající požadované pozici serva. Funkce set_position
převádí úhel (0-180°) na odpovídající šířku pulzu v rozmezí 1000-2000 mikrosekund11.
Program pro ovládání kontinuálního serva (průběžného)
Kontinuální servo lze ovládat podobným způsobem, ale s jiným přístupem k interpretaci PWM signálu:
from machine import Pin, PWM
import time
# Nastavení pinu pro kontinuální servo
cont_servo_pin = PWM(Pin(14)) # Použití pinu GP14
cont_servo_pin.freq(50) # Frekvence 50Hz
def set_speed(speed):
# speed: -100 až 100, kde:
# -100 = maximální rychlost ve směru hodinových ručiček
# 0 = zastavení
# 100 = maximální rychlost proti směru hodinových ručiček
# Převod rychlosti na šířku pulzu (1000-2000 mikrosekund)
if speed == 0:
pulse_width = 1500 # Středová hodnota = zastavení
else:
pulse_width = 1500 + (speed * 5) # 5 mikrosekund na jednotku rychlosti
# Převod šířky pulzu na střídu (0-65535)
duty = pulse_width * 65535 // 20000
cont_servo_pin.duty_u16(duty)
# Ukázka ovládání rychlosti kontinuálního serva
while True:
# Otáčení proti směru hodinových ručiček
print("Otáčení proti směru hodinových ručiček")
set_speed(100)
time.sleep(2)
# Zastavení
print("Zastavení")
set_speed(0)
time.sleep(1)
# Otáčení ve směru hodinových ručiček
print("Otáčení ve směru hodinových ručiček")
set_speed(-100)
time.sleep(2)
# Zastavení
print("Zastavení")
set_speed(0)
time.sleep(1)
V tomto případě funkce set_speed
převádí vstupní hodnotu rychlosti (-100 až 100) na šířku pulzu, která řídí rychlost a směr otáčení kontinuálního serva. Pro zastavení servo, musíme nastavit šířku pulzu na "nulovou" hodnotu 1,5 ms a nechat jej běžet na této hodnotě12.
Program pro ovládání DC motoru pomocí PWM a driveru L298N
Pro DC motory potřebujeme kromě PWM signálu také ovládání směru, což typicky zajišťuje H-můstkový driver jako L298N:
from machine import Pin, PWM
import time
# Nastavení pinů pro ovládání DC motoru přes L298N driver
# ENA pin pro PWM regulaci rychlosti
ena_pin = PWM(Pin(13))
ena_pin.freq(1000) # Frekvence PWM 1kHz
# IN1 a IN2 piny pro určení směru
in1_pin = Pin(12, Pin.OUT)
in2_pin = Pin(11, Pin.OUT)
def set_motor(speed):
# speed: -100 až 100, kde:
# -100 = maximální rychlost vzad
# 0 = zastavení
# 100 = maximální rychlost vpřed
if speed > 0:
# Směr dopředu
in1_pin.value(1)
in2_pin.value(0)
# Nastavení rychlosti
duty = int(abs(speed) * 65535 // 100)
elif speed < 0:
# Směr dozadu
in1_pin.value(0)
in2_pin.value(1)
# Nastavení rychlosti
duty = int(abs(speed) * 65535 // 100)
else:
# Zastavení
in1_pin.value(0)
in2_pin.value(0)
duty = 0
ena_pin.duty_u16(duty)
# Ukázka ovládání DC motoru
while True:
# Motor dopředu, postupné zrychlování
print("Postupné zrychlování vpřed")
for speed in range(0, 101, 10):
set_motor(speed)
time.sleep(0.2)
time.sleep(1)
# Zastavení
print("Zastavení")
set_motor(0)
time.sleep(1)
# Motor dozadu, postupné zrychlování
print("Postupné zrychlování vzad")
for speed in range(0, -101, -10):
set_motor(speed)
time.sleep(0.2)
time.sleep(1)
V tomto případě používáme kombinaci PWM signálu pro řízení rychlosti (pin ENA) a dvou digitálních pinů (IN1, IN2) pro určení směru otáčení DC motoru. Pomocí pulzně šířkové modulace (PWM) můžeme skutečně řídit rychlost motorů10 14.
Úskalí při používání PWM motorů v robotice
Při práci s PWM motory v robotice se můžeme setkat s několika problémy, které je třeba řešit:
Skokové nastavení pozice servomotoru
Problém: Když pošlete servomotoru příkaz k přesunu na novou pozici, pohyb může být příliš rychlý a trhaný, což může způsobit mechanické problémy nebo nežádoucí chování robota.
Řešení: Implementace plynulého přechodu mezi pozicemi:
def smooth_move(servo, start_pos, end_pos, steps=50, delay_ms=20):
"""Plynulý přechod serva z jedné pozice do druhé"""
step_size = (end_pos - start_pos) / steps
for i in range(steps + 1):
pos = start_pos + i * step_size
servo.set_position(int(pos))
time.sleep_ms(delay_ms)
Tato funkce rozdělí pohyb do mnoha malých kroků, čímž zajistí plynulý přechod mezi pozicemi.
Jitter (chvění) servomotoru
Problém: Servomotory mohou vykazovat jitter (chvění nebo vibrace), když jsou napájené nebo když se snaží udržet pozici13.
Řešení:
- Kvalitní napájení: Zajistěte stabilní napájecí napětí (nejlépe oddělené od napájení řídící logiky).
- Správná frekvence a délka pulzů: Ujistěte se, že používáte správnou frekvenci PWM signálu (typicky 50 Hz) a přesné šířky pulzů.
- Eliminace zbytečných aktualizací PWM: Aktualizujte PWM signál pouze když je potřeba změnit pozici.
Problém může být způsoben tím, že provádíte PWM od 0 do 20000 mikrosekund, zatímco servo rozumí pouze pulsům od 1000 do 2000 mikrosekund13.
Problém se zastavením kontinuálního serva
Problém: Kontinuální serva mohou mít problém s úplným zastavením nebo mohou "plížit" i při pulzu 1,5 ms.
Řešení:
- Kalibrace střední polohy: Většina kontinuálních serv má trimr pro nastavení středové hodnoty. V případě serva FS90R lze výchozí klidový bod upravit pomocí potenciometru7.
- Programová korekce: Pro zastavení kontinuálního serva nastavte šířku pulzu na "nulovou" hodnotu 1,5 ms a nechte jej běžet na této hodnotě12.
Vysoký proudový odběr
Problém: Motory mohou vyžadovat vysoký proudový odběr, zejména při rozběhu nebo pod zátěží, což může způsobit pokles napětí nebo resetování mikrokontroléru.
Řešení:
- Oddělené napájení: Používejte oddělené napájení pro motory a řídící elektroniku.
- Dostatečný napájecí zdroj: Ujistěte se, že napájecí zdroj může dodat dostatečný proud.
Zpětné napětí
Problém: Při náhlé změně rychlosti nebo zastavení motoru může vzniknout zpětné napětí, které může poškodit řídící elektroniku.
Řešení: Antiparalelně k motoru musí být dioda, která vybíjí napěťové špičky na motoru, aby se nepoškodil tranzistor, protože ten jinak hodně topí, když tam dioda není18.
Běžně dostupné PWM motory a jejich srovnání
Standardní servomotory (neprůběžné)
- SG90 mikro servo
- Pracovní napětí: 4,8-6V
- Napětí signálu: 3,3-5V kompatibilní
- Točivý moment: 1,8 kg/cm (při 4,8V), 2,4 kg/cm (při 6V)
- Rychlost: 0,12s/60° (při 4,8V), 0,10s/60° (při 6V)
- Rozsah: 0-180°
- Hmotnost: 11g
- Převody: Plastové
- Použití: Malé robotické projekty, modelářství9
- MG996R standard servo
- Pracovní napětí: 4,8-7,2V
- Napětí signálu: 5V
- Točivý moment: 9,4 kg/cm (při 4,8V), 11 kg/cm (při 6V)
- Rychlost: 0,17s/60° (při 6V)
- Rozsah: 0-180°
- Hmotnost: 55g
- Převody: Kovové
- Použití: Větší robotické rameno, projekty vyžadující vyšší sílu8
Kontinuální servomotory (průběžné)
- FEETECH FS90R mikro kontinuální servo
- Pracovní napětí: 4,8-6V
- Napětí signálu: 3,3-5V kompatibilní
- Točivý moment: 1,5 kg/cm (při 6V)
- Rychlost: 130 RPM (při 6V, bez zátěže)
- Hmotnost: 9g
- Výchozí klidový bod: 1,5 ms, ale lze upravit pomocí potenciometru
- Použití: Malé mobilní roboty, otočné mechanismy7
- DF15RSMG kontinuální servo
- Pracovní napětí: 4,8-6V
- Napětí signálu: 3,3-5V kompatibilní
- PWM parametry: Pro zastavení serva nastavte šířku pulzu na 1,5 ms
- Převody: Kovové
- Použití: Mobilní robotické platformy s vyšším zatížením12
DC motory s PWM řízením
- PWM regulátor otáček pro DC motory
Závěr
PWM řízení motorů představuje efektivní a flexibilní způsob ovládání různých typů motorů v robotice. Díky schopnosti modulovat výkon pomocí změny střídy signálu můžeme dosáhnout plynulé regulace rychlosti u DC motorů nebo přesného polohování u servomotorů.
Při výběru vhodného motoru pro konkrétní aplikaci je třeba zohlednit parametry jako pracovní napětí, točivý moment, rychlost a váhu. Pro náročnější aplikace jsou pak důležité i aspekty jako kvalita převodů (plastové vs. kovové) nebo možnosti ochrany proti přetížení.
Pro úspěšné použití PWM řízení v robotických projektech je klíčové porozumět základním principům této technologie a být si vědom potenciálních problémů, jako je jitter servomotorů nebo obtíže se zastavením kontinuálních serv. Správná implementace, včetně plynulých přechodů mezi pozicemi a zajištění kvalitního napájení, může tyto problémy výrazně zmírnit.
S rostoucími možnostmi moderních mikrokontrolérů a širokou dostupností různých typů PWM motorů se tato technologie stává stále přístupnější i pro amatérské robotické projekty, zatímco poskytuje výkon a přesnost potřebnou i pro náročnější aplikace.
-
https://navody.dratek.cz/technikuv-blog/porovnani-pwm-regulatoru-rychlosti.html ↩↩↩↩
-
https://cs.wikipedia.org/wiki/Pulzně_%C5%A1%C3%AD%C5%99kov%C3%A1_modulace ↩
-
https://www.bighobby.cz/modelarska-poradna/jak-vybrat-spravne-servo/ ↩
-
https://components101.com/motors/mg996r-servo-motor-datasheet ↩↩↩↩↩
-
https://www.kjell.com/globalassets/mediaassets/701916_87897_datasheet_en.pdf ↩↩↩↩↩↩↩↩↩↩
-
https://randomnerdtutorials.com/raspberry-pi-pico-servo-motor-micropython/ ↩↩↩
-
https://stackoverflow.com/questions/45488233/controlling-continuous-servo-using-python-in-raspberry-pi-but-the-continuous-ser ↩↩↩↩
-
https://forum.arduino.cc/t/servo-jitter-because-of-pwm/549105 ↩↩
-
https://randomnerdtutorials.com/micropython-esp32-esp8266-dc-motor-l298n/ ↩↩↩
-
https://www.hadex.cz/m455a-regulator-otacek-pwm-stejnosmernych-dc-motoru-5-35v-do-5a/ ↩
-
https://www.laskakit.cz/pwm-regulator-otacek-motoru-10a--80w/ ↩
-
http://kabinet.fyzika.net/ESP32/ESP32-dc_motor/ESP32-rizeni-DC-motoru.php ↩↩
-
https://vytapeni.tzb-info.cz/mereni-a-regulace/11990-pwm-signal-a-prace-s-nim ↩
-
https://resources.pcb.cadence.com/blog/2020-pulse-width-modulation-characteristics-and-the-effects-of-frequency-and-duty-cycle ↩
-
https://dratek.cz/arduino/1141-pwm-regulator-otacek-motoru-dc-6v-28v-3a.html ↩
-
https://www.instructables.com/How-to-use-Pulse-Width-Modulation/ ↩
-
https://shop.atoselektro.cz/regulator-otacek-pwm-stejnosmernych-motoru-6-60v-30a_d494565.html ↩
-
https://dspace.cvut.cz/bitstream/handle/10467/23427/F3-BP-2014-Pavlik-Tomas-prace.pdf?sequence=3\&isAllowed=y ↩
-
https://www.playembedded.org/blog/pwm-101-from-duty-cycle-to-motor-control/ ↩
-
https://www.gme.cz/v/1508923/modul-pwm-regulatoru-6-28v-3a ↩
-
https://dratek.cz/arduino/3169-pwm-generator-signalu-s-lcd-displejem-nastavitelny.html ↩
-
https://automatizace.hw.cz/motory-jejich-rizeni-s-mcu-3-cast-ridici-algoritmy-regulace-s-mcu ↩
-
https://botland.cz/content/230-vyber-spravneho-motoru-dc-vs-stepper-vs-servo ↩
-
https://www.auselectronicsdirect.com.au/assets/brochures/TA0132.pdf ↩
-
https://eluc.ikap.cz/lekce/pouziti-modulu-pulzne-sirkove-modulace-pwm ↩
-
https://www.upesy.com/blogs/tutorials/esp32-servo-motor-sg90-on-micropython ↩
-
https://docs.micropython.org/en/latest/pyboard/tutorial/servo.html ↩