Cuprins:

Generare de semnal PWM de înaltă rezoluție pentru servere RC cu dispozitive STM32: 3 pași
Generare de semnal PWM de înaltă rezoluție pentru servere RC cu dispozitive STM32: 3 pași

Video: Generare de semnal PWM de înaltă rezoluție pentru servere RC cu dispozitive STM32: 3 pași

Video: Generare de semnal PWM de înaltă rezoluție pentru servere RC cu dispozitive STM32: 3 pași
Video: Alegere osciloscop pentru proiectare, dezvoltare, testare, depanare sisteme audio podcast [30] 2024, Noiembrie
Anonim
Generare semnal PWM de înaltă rezoluție pentru servere RC cu dispozitive STM32
Generare semnal PWM de înaltă rezoluție pentru servere RC cu dispozitive STM32
Generare semnal PWM de înaltă rezoluție pentru servere RC cu dispozitive STM32
Generare semnal PWM de înaltă rezoluție pentru servere RC cu dispozitive STM32
Generare semnal PWM de înaltă rezoluție pentru servere RC cu dispozitive STM32
Generare semnal PWM de înaltă rezoluție pentru servere RC cu dispozitive STM32

În prezent, construiesc un transmițător / receptor RC bazat pe cipul RF SX1280. Unul dintre obiectivele proiectului este acela că vreau o rezoluție servo de 12 biți de pe stick-uri până la servouri. În parte, deoarece serverele digitale moderne au rezoluție de 12 biți, în al doilea rând, un emițător high-end folosește oricum 12 biți. Cercetam cum pot genera semnale PWM de înaltă rezoluție pe dispozitivele STM32. În prezent, folosesc pilula neagră (STM32F103C8T8) pentru prototip.

Pasul 1: Lista pieselor

Hardware

  • Orice placă de dezvoltare STM32F103 (pastilă albastră, pastilă neagră etc.)
  • O bancă de alimentare USB ca sursă de alimentare
  • Programator STM32 (Segger j-links, ST-LINK / V2 sau pur și simplu o clonă st-link)

Software

  • STM32CubeMX
  • Atollic TrueSTUDIO pentru STM32
  • Sursa proiectului din github

Pasul 2: Soluția evidentă

Soluția evidentă
Soluția evidentă
Soluția evidentă
Soluția evidentă
Soluția evidentă
Soluția evidentă

Probabil cea mai ușoară soluție este să utilizați unul dintre temporizatoarele care pot genera semnale PWM, cum ar fi TIM1-3 pe un STM32F103. Pentru un servo digital modern, frecvența cadrelor poate scădea la aproximativ 5 ms, dar pentru un servo analogic vechi ar trebui să fie de 20 ms sau 50 Hz. Deci, ca cel mai rău scenariu, să generăm asta. Cu ceas de 72 MHz și rezoluția contorului de 16 biți, trebuie să setăm precalerul temporizatorului la minimum 23 pentru a acoperi rata de cadre de 20 ms. Am selectat 24 deoarece pentru 20 ms trebuie să setez contorul exact la 60000. Puteți vedea setarea CubeMX și semnalele PWM generate de 1 și 1,5 ms în capturile de ecran. Din păcate, pentru 1 ms, contorul temporizatorului ar trebui să fie setat la 3000, ceea ce ne-ar oferi doar o rezoluție de 11 biți. Nu este rău, dar obiectivul a fost de 12 biți, așa că hai să încercăm altceva.

Desigur, dacă aș alege un microcontroler cu contor de timer pe 32 de biți, cum ar fi STM32L476, această rezoluție poate fi mult mai mare și problema ar fi rezolvată.

Dar aici, aș dori să propun o soluție alternativă care va crește rezoluția chiar și pe STM32F103.

Pasul 3: Cronometre în cascadă pentru rezoluție mai mare

Cronometre în cascadă pentru rezoluție mai mare
Cronometre în cascadă pentru rezoluție mai mare
Cronometre în cascadă pentru rezoluție mai mare
Cronometre în cascadă pentru rezoluție mai mare
Cronometre în cascadă pentru rezoluție mai mare
Cronometre în cascadă pentru rezoluție mai mare

Principala problemă cu soluția anterioară este că rata de cadru (20 ms) este relativ ridicată în comparație cu semnalul PWM generat efectiv (între 1 și 2 ms), deci pierdem niște biți valoroși pentru restul de 18 ms când așteptăm următorul cadru. Acest lucru poate fi rezolvat prin cronometre în cascadă folosind funcția de sincronizare a legăturii pentru sincronizare.

Ideea este că voi folosi TIM1 ca master pentru a genera rata de cadre (20 ms) și TIM2, TIM3 pentru a face față semnalelor PWM ca sclavi. Când masterul declanșează sclavii, generează doar un semnal PWM într-un singur mod de impuls. Prin urmare, trebuie să acopăr doar 2 ms în acele temporizatoare. Din fericire, puteți încadra acele temporizatoare în hardware, astfel încât această sincronizare nu are nevoie de nicio intervenție din partea procesorului și este foarte precisă, jitter-ul se află în regiunea ps. Puteți vedea configurarea CubeMX în capturile de ecran.

După cum puteți vedea, am selectat 3 ca prescalar, așa că pentru cei 2 ms trebuie să setez 48000 în contorul temporizatorului. Acest lucru ne oferă 24000 pentru 1 ms, ceea ce este de fapt mai mult decât avem nevoie pentru rezoluția de 14 biți. Tadaaaa …

Vă rugăm să aruncați o privire la capturile de ecran ale osciloscopului din introducere pentru rezultatul final. Canalul 3 (violet) este întreruperea temporizatorului principal, care va declanșa salvarea pentru a genera un impuls. Canalele 1 și 4 (fascicul galben și verde) sunt semnale reale PWM generate de diferite temporizatoare. Rețineți că sunt sincronizate, dar sunt sincronizate la marginile finale, adică din cauza modului PWM 2. Aceasta nu este o problemă, deoarece rata PWM pentru un anumit servo este încă corectă.

Un alt beneficiu al acestei soluții este acela că modificarea ratei de cadre ar însemna schimbarea perioadei numai în TIM1. Pentru servo-urile digitale moderne puteți coborâ chiar la 200-300 Hz, dar vă rugăm să consultați manualul servo-ului dacă doriți să reglați bine.

Recomandat: