Web nejen o robotice

Ří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:

  1. Frekvence - určuje, kolikrát za sekundu se opakuje celý cyklus
  2. 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á:
    • Pulz šířky 1 ms = maximální rychlost ve směru hodinových ručiček
    • Pulz šířky 1,5 ms = zastavení
    • Pulz šířky 2 ms = maximální rychlost proti směru hodinových ručiček7 12

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í:

  1. Kvalitní napájení: Zajistěte stabilní napájecí napětí (nejlépe oddělené od napájení řídící logiky).
  2. 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ů.
  3. 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í:

  1. 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.
  2. 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í:

  1. Oddělené napájení: Používejte oddělené napájení pro motory a řídící elektroniku.
  2. 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é)

  1. 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
  2. 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é)

  1. 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
  2. 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

  1. PWM regulátor otáček pro DC motory
    • Pracovní napětí: 5-35V
    • Proud: Až 5A
    • Frekvence PWM: Nastavitelná
    • Výkon: Až 80W
    • Rozsah regulace: 10-95% změnou střídy15 16

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.


  1. https://dratek.cz/223-pwm-regulatory-rychlosti/ 

  2. https://botland.cz/blog/co-je-to-signal-pwm/ 

  3. https://www.ignitepathways.org/post/pwm-and-robotics 

  4. https://navody.dratek.cz/technikuv-blog/porovnani-pwm-regulatoru-rychlosti.html 

  5. https://cs.wikipedia.org/wiki/Pulzně_%C5%A1%C3%AD%C5%99kov%C3%A1_modulace 

  6. https://www.bighobby.cz/modelarska-poradna/jak-vybrat-spravne-servo/ 

  7. https://www.pololu.com/product/2820 

  8. https://components101.com/motors/mg996r-servo-motor-datasheet 

  9. https://www.kjell.com/globalassets/mediaassets/701916_87897_datasheet_en.pdf 

  10. https://botland.cz/blog/arduino-rizeni-dc-motoru/ 

  11. https://randomnerdtutorials.com/raspberry-pi-pico-servo-motor-micropython/ 

  12. https://stackoverflow.com/questions/45488233/controlling-continuous-servo-using-python-in-raspberry-pi-but-the-continuous-ser 

  13. https://forum.arduino.cc/t/servo-jitter-because-of-pwm/549105 

  14. https://randomnerdtutorials.com/micropython-esp32-esp8266-dc-motor-l298n/ 

  15. https://www.hadex.cz/m455a-regulator-otacek-pwm-stejnosmernych-dc-motoru-5-35v-do-5a/ 

  16. https://www.laskakit.cz/pwm-regulator-otacek-motoru-10a--80w/ 

  17. http://kabinet.fyzika.net/ESP32/ESP32-dc_motor/ESP32-rizeni-DC-motoru.php 

  18. https://www.youtube.com/watch?v=PGge5wJntog 

  19. https://vytapeni.tzb-info.cz/mereni-a-regulace/11990-pwm-signal-a-prace-s-nim 

  20. https://www.kondik.cz/slovnik-pojmu/pwm/ 

  21. https://robodoupe.cz/2016/pulzne-sirkova-modulace/ 

  22. https://resources.pcb.cadence.com/blog/2020-pulse-width-modulation-characteristics-and-the-effects-of-frequency-and-duty-cycle 

  23. https://robodoupe.cz/2018/microbit-a-pwm/ 

  24. https://dratek.cz/arduino/1141-pwm-regulator-otacek-motoru-dc-6v-28v-3a.html 

  25. https://www.instructables.com/How-to-use-Pulse-Width-Modulation/ 

  26. https://shop.atoselektro.cz/regulator-otacek-pwm-stejnosmernych-motoru-6-60v-30a_d494565.html 

  27. https://dspace.cvut.cz/bitstream/handle/10467/23427/F3-BP-2014-Pavlik-Tomas-prace.pdf?sequence=3\&isAllowed=y 

  28. https://www.playembedded.org/blog/pwm-101-from-duty-cycle-to-motor-control/ 

  29. https://www.gme.cz/v/1508923/modul-pwm-regulatoru-6-28v-3a 

  30. https://botland.cz/blog/co-je-to-signal-pwm-2/ 

  31. https://www.bequiet.com/cz/insidebequiet/1688 

  32. https://dratek.cz/arduino/3169-pwm-generator-signalu-s-lcd-displejem-nastavitelny.html 

  33. https://automatizace.hw.cz/motory-jejich-rizeni-s-mcu-3-cast-ridici-algoritmy-regulace-s-mcu 

  34. https://www.svarecikukla.cz/slovnik-pojmu/pwm/ 

  35. https://botland.cz/content/230-vyber-spravneho-motoru-dc-vs-stepper-vs-servo 

  36. https://botland.cz/135-servomechanismy 

  37. https://robotika.cz/articles/digitalservo/cs 

  38. https://www.raveo.cz/s-servo-2-generace/ 

  39. https://www.auselectronicsdirect.com.au/assets/brochures/TA0132.pdf 

  40. https://www.pelikandaniel.com/rc/?sec=page\&id=22 

  41. https://robotika.vosrk.cz/guide/arduino/lesson09/cs 

  42. https://eluc.ikap.cz/lekce/pouziti-modulu-pulzne-sirkove-modulace-pwm 

  43. https://www.vovcr.cz/odz/tech/586/page18.html 

  44. https://en.wikipedia.org/wiki/Pulse-width_modulation 

  45. https://pypi.org/project/micropython-servo/ 

  46. https://www.upesy.com/blogs/tutorials/esp32-servo-motor-sg90-on-micropython 

  47. https://docs.micropython.org/en/latest/pyboard/tutorial/servo.html 

  48. https://forums.raspberrypi.com/viewtopic.php?t=301066 

  49. https://github.com/cnadler86/MicroPython_Motor 

  50. https://www.youtube.com/watch?v=wWnDKsClpwQ