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álu1. 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 prvku5. 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ýkon6.

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 pozici7 8.

Ú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 ms7 8. 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°7

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 V7. 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 6V9. 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,8V7. U kontinuálních serv se uvádí maximální rychlost otáčení, například 130 RPM (otáček za minutu) u serva FS90R10.

Rozsah pohybu

U standardních serv určuje, v jakém úhlovém rozsahu se může servo pohybovat, typicky 0-180°9 7. 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 proudu menší než 600 mA7.

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)9 7
  • 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°7

Typickými zástupci jsou serva jako SG90 (mikro servo) nebo MG996R (servo s kovovými převody)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ček10 11

Typickým zástupcem je FEETECH FS90R mikro kontinuální rotační servo10.

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 Hz12

Pro řízení DC motorů se často používají specializované ovladače jako L298N12 5.

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

# Nastaveni pinu pro servo
servo_pin = PWM(Pin(15))  # Pouziti pinu GP15
servo_pin.freq(50)  # Frekvence 50Hz pro standardni serva

def set_position(position):
    # Prevod pozice (0-180) na sirku pulzu (1000-2000 mikrosekund)
    # Pro servo je typicky 1000us = 0 stupnu, 1500us = 90, 2000us = 180
    pulse_width = 1000 + (position * 1000 // 180)
    # Prevod sirky pulzu na stridu (0-65535)
    duty = pulse_width * 65535 // 20000
    servo_pin.duty_u16(duty)

# Ukazka pohybu serva
while True:
    # Pohyb na pozici 0 stupnu
    set_position(0)
    print("Pozice: 0")
    time.sleep(1)

    # Pohyb na pozici 90 stupnu
    set_position(90)
    print("Pozice: 90")
    time.sleep(1)

    # Pohyb na pozici 180 stupnu
    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 mikrosekund8.

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

# Nastaveni pinu pro kontinualni servo
cont_servo_pin = PWM(Pin(14))  # Pouziti pinu GP14
cont_servo_pin.freq(50)  # Frekvence 50Hz

def set_speed(speed):
    # speed: -100 az 100, kde:
    # -100 = maximalni rychlost ve smeru hodinovych rucicek
    # 0 = zastaveni
    # 100 = maximalni rychlost proti smeru hodinovych rucicek

    # Prevod rychlosti na sirku pulzu (1000-2000 mikrosekund)
    if speed == 0:
        pulse_width = 1500  # Stredova hodnota = zastaveni
    else:
        pulse_width = 1500 + (speed * 5)  # 5 mikrosekund na jednotku rychlosti

    # Prevod sirky pulzu na stridu (0-65535)
    duty = pulse_width * 65535 // 20000
    cont_servo_pin.duty_u16(duty)

# Ukazka ovladani rychlosti kontinualniho serva
while True:
    # Otaceni proti smeru hodinovych rucicek
    print("Otaceni proti smeru hodinovych rucicek")
    set_speed(100)
    time.sleep(2)

    # Zastaveni
    print("Zastaveni")
    set_speed(0)
    time.sleep(1)

    # Otaceni ve smeru hodinovych rucicek
    print("Otaceni ve smeru hodinovych rucicek")
    set_speed(-100)
    time.sleep(2)

    # Zastaveni
    print("Zastaveni")
    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ě11.

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

# Nastaveni pinu pro ovladani DC motoru pres 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 urceni smeru
in1_pin = Pin(12, Pin.OUT)
in2_pin = Pin(11, Pin.OUT)

def set_motor(speed):
    # speed: -100 az 100, kde:
    # -100 = maximalni rychlost vzad
    # 0 = zastaveni
    # 100 = maximalni rychlost vpred

    if speed > 0:
        # Smer dopredu
        in1_pin.value(1)
        in2_pin.value(0)
        # Nastaveni rychlosti
        duty = int(abs(speed) * 65535 // 100)
    elif speed < 0:
        # Smer dozadu
        in1_pin.value(0)
        in2_pin.value(1)
        # Nastaveni rychlosti
        duty = int(abs(speed) * 65535 // 100)
    else:
        # Zastaveni
        in1_pin.value(0)
        in2_pin.value(0)
        duty = 0

    ena_pin.duty_u16(duty)

# Ukazka ovladani DC motoru
while True:
    # Motor dopredu, postupne zrychlovani
    print("Postupne zrychlovani vpred")
    for speed in range(0, 101, 10):
        set_motor(speed)
        time.sleep(0.2)

    time.sleep(1)

    # Zastaveni
    print("Zastaveni")
    set_motor(0)
    time.sleep(1)

    # Motor dozadu, postupne zrychlovani
    print("Postupne zrychlovani 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ů13 12.

Ú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):
    """Plynuly prechod serva z jedne pozice do druhe"""
    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 pozici14.

Ř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 mikrosekund14.

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í potenciometru10.
  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ě11.

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í6.

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

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é mechanismy10
  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ím11

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.