Sadržaj:

Generisanje PWM signala visoke rezolucije za RC servosisteme sa STM32 uređajima: 3 koraka
Generisanje PWM signala visoke rezolucije za RC servosisteme sa STM32 uređajima: 3 koraka

Video: Generisanje PWM signala visoke rezolucije za RC servosisteme sa STM32 uređajima: 3 koraka

Video: Generisanje PWM signala visoke rezolucije za RC servosisteme sa STM32 uređajima: 3 koraka
Video: Основы горизонтально масштабируемых вычислений Джеймса Каффа 2024, Juli
Anonim
Generisanje PWM signala visoke rezolucije za RC servo uređaje sa STM32 uređajima
Generisanje PWM signala visoke rezolucije za RC servo uređaje sa STM32 uređajima
Generisanje PWM signala visoke rezolucije za RC servosisteme sa STM32 uređajima
Generisanje PWM signala visoke rezolucije za RC servosisteme sa STM32 uređajima
Generisanje PWM signala visoke rezolucije za RC servo uređaje sa STM32 uređajima
Generisanje PWM signala visoke rezolucije za RC servo uređaje sa STM32 uređajima

Trenutno gradim RC predajnik/prijemnik na bazi SX1280 RF čipa. Jedan od ciljeva projekta je da želim 12 -bitnu servo rezoluciju od štapova do servosa. Djelomično zato što moderni digitalni servo uređaji imaju 12-bitnu rezoluciju, drugo, vrhunski odašiljač ionako koristi 12 bita. Istraživao sam kako mogu generirati PWM signale visoke rezolucije na STM32 uređajima. Trenutno koristim crnu pilulu (STM32F103C8T8) za prototip.

Korak 1: Lista dijelova

Hardver

  • Bilo koja razvojna ploča STM32F103 (plava pilula, crna pilula itd.)
  • USB banka za napajanje kao izvor napajanja
  • STM32 programer (Segger j-links, ST-LINK/V2 ili jednostavno st-link klon)

Softver

  • STM32CubeMX
  • Atolični TrueSTUDIO za STM32
  • Izvor projekta iz github -a

Korak 2: Očigledno rješenje

Očigledno rješenje
Očigledno rješenje
Očigledno rješenje
Očigledno rješenje
Očigledno rješenje
Očigledno rješenje

Vjerojatno je najjednostavnije rješenje upotrijebiti jedan od mjerača vremena koji može generirati PWM signale, poput TIM1-3 na STM32F103. Za moderan digitalni servo brzina kadrova može pasti na oko 5 ms, ali za stari analogni servo trebao bi biti 20 ms ili 50 Hz. Dakle, u najgorem slučaju, hajde da to generiramo. Sa 72 MHz taktom i 16 -bitnom rezolucijom brojača vremena moramo postaviti predskaler tajmera na minimum 23 kako bismo pokrili brzinu kadrova od 20 ms. Odabrao sam 24 jer tada za 20 ms moram postaviti brojač točno na 60000. Na snimkama zaslona možete vidjeti postavke CubeMX -a i generirane PWM signale od 1 i 1,5 ms. Nažalost, za 1 ms brojač tajmera trebao bi biti postavljen na 3000, što bi nam dalo samo 11 bitnu rezoluciju. Nije loše, ali cilj je bio 12 -bitni, pa pokušajmo nešto drugo.

Naravno, ako bih odabrao mikro kontroler sa 32 -bitnim brojačem vremena, poput STM32L476, ova rezolucija može biti mnogo veća i problem bi bio riješen.

Ali ovdje bih želio predložiti alternativno rješenje koje će dodatno povećati rezoluciju čak i na STM32F103.

Korak 3: Kaskadni mjerači vremena za veću rezoluciju

Kaskadni mjerači vremena za veću rezoluciju
Kaskadni mjerači vremena za veću rezoluciju
Kaskadni mjerači vremena za veću rezoluciju
Kaskadni mjerači vremena za veću rezoluciju
Kaskadni mjerači vremena za veću rezoluciju
Kaskadni mjerači vremena za veću rezoluciju

Glavni problem prethodnog rješenja je to što je brzina kadrova (20 ms) relativno visoka u odnosu na stvarno generirani PWM signal (između 1 i 2 ms), pa gubimo neke vrijedne bitove za preostalih 18 ms kada čekamo sledeći kadar. To se može riješiti kaskadnim mjeračima vremena pomoću funkcije povezivanja tajmera za sinhronizaciju.

Ideja je da ću koristiti TIM1 kao master za generiranje frame rate -a (20 ms) i TIM2, TIM3 za nošenje sa PWM signalima kao slave. Kada master aktivira podređene uređaje, oni generiraju samo PWM signal u jednom impulsnom načinu rada. Stoga u tim timerima moram pokriti samo 2 ms. Srećom, te tajmere možete kaskadno postaviti u hardver, tako da ova sinhronizacija ne zahtijeva nikakvu intervenciju procesora, a također je i vrlo precizna, džiter je u ps području. Postavke CubeMX -a možete vidjeti na snimcima ekrana.

Kao što vidite, odabrao sam 3 kao preskalarne pa za 2 ms moram postaviti 48000 u brojaču tajmera. To nam daje 24000 za 1 ms, što je zapravo više od onoga što nam je potrebno za 14 -bitnu rezoluciju. Tadaaaa…

Za konačni rezultat pogledajte snimke ekrana osciloskopa u uvodu. Kanal 3 (ljubičasti) je prekid glavnog tajmera koji će pokrenuti salve da generiraju jedan impuls. Kanal 1 i 4 (žuti i zeleni zrak) su stvarni PWM signali koje generiraju različiti tajmeri. Imajte na umu da su sinhronizirani, ali su sinkronizirani na zadnjim rubovima, to je zbog PWM moda 2. To nije problem, jer je PWM stopa za određeni servo još uvijek točna.

Druga korist ovog rješenja je da bi promjena frame rate -a značila promjenu perioda samo u TIM1. Za moderne digitalne servomotore možete se spustiti na čak 200-300 Hz, ali molimo vas da pogledate priručnik za servo ako želite fino podesiti.

Preporučuje se: