Talaan ng mga Nilalaman:

Mataas na Resolusyon PWM Signal Generation para sa RC Servos Na May Mga Device na STM32: 3 Hakbang
Mataas na Resolusyon PWM Signal Generation para sa RC Servos Na May Mga Device na STM32: 3 Hakbang

Video: Mataas na Resolusyon PWM Signal Generation para sa RC Servos Na May Mga Device na STM32: 3 Hakbang

Video: Mataas na Resolusyon PWM Signal Generation para sa RC Servos Na May Mga Device na STM32: 3 Hakbang
Video: Essential Scale-Out Computing by James Cuff 2024, Nobyembre
Anonim
Mataas na Resolusyon PWM Signal Generation para sa RC Servos Na May Mga Device na STM32
Mataas na Resolusyon PWM Signal Generation para sa RC Servos Na May Mga Device na STM32
Mataas na Resolusyon PWM Signal Generation para sa RC Servos Na May Mga Device na STM32
Mataas na Resolusyon PWM Signal Generation para sa RC Servos Na May Mga Device na STM32
Mataas na Resolusyon PWM Signal Generation para sa RC Servos Na May Mga Device na STM32
Mataas na Resolusyon PWM Signal Generation para sa RC Servos Na May Mga Device na STM32

Sa kasalukuyan, nagtatayo ako ng isang RC transmitter / receiver batay sa SX1280 RF chip. Ang isa sa mga layunin para sa proyekto ay nais kong 12 bit resolusyon ng servo mula sa mga stick lahat hanggang sa mga servo. Bahagyang dahil ang mga modernong digital servos ay may 12 bit resolusyon pangalawa ang isang high-end transmitter ay gumagamit ng 12 bits pa rin. Iniimbestigahan ko kung paano ako makakabuo ng mga signal ng PWM na may mataas na resolusyon sa mga STM32 na aparato. Gumagamit ako ng black pill (STM32F103C8T8) sa ngayon para sa prototype.

Hakbang 1: Listahan ng Mga Bahagi

Hardware

  • Anumang STM32F103 development board (asul na tableta, itim na tableta, atbp.)
  • Isang USB power bank bilang power supply
  • Programmer ng STM32 (Segger j-link, ST-LINK / V2, o simpleng isang clone ng st-link)

Software

  • STM32CubeMX
  • Atollic TrueSTUDIO para sa STM32
  • Pinagmulan ng proyekto mula sa github

Hakbang 2: Ang Malinaw na Solusyon

Ang Malinaw na Solusyon
Ang Malinaw na Solusyon
Ang Malinaw na Solusyon
Ang Malinaw na Solusyon
Ang Malinaw na Solusyon
Ang Malinaw na Solusyon

Marahil ang pinakamadaling solusyon ay ang paggamit ng isa sa timer na maaaring makabuo ng mga signal ng PWM, tulad ng TIM1-3 sa isang STM32F103. Para sa isang modernong digital servo ang frame rate ay maaaring bumaba sa 5 ms o higit pa, ngunit para sa isang lumang analog servo dapat itong 20 ms o 50 Hz. Kaya, bilang isang pinakamasamang pangyayari sa kaso ay mabuo natin iyon. Sa 72 MHz na orasan at 16 bit timer counter resolution kailangan namin upang itakda ang prescaler ng timer sa minimum na 23 upang masakop ang rate ng 20 ms frame. Pinili ko ang 24 dahil pagkatapos para sa 20 ms kailangan kong itakda ang counter nang eksakto sa 60000. Maaari mong makita ang pag-setup ng CubeMX at ang nabuong mga signal ng 1 at 1.5 ms PWM sa mga screenshot. Sa kasamaang palad, para sa 1ms ang counter ng timer ay dapat itakda sa 3000, na magbibigay sa amin ng 11 bit na resolusyon. Hindi masama, ngunit ang layunin ay 12 bit, kaya't subukan natin ang iba pa.

Siyempre Kung pipiliin ko ang isang micro controller na may 32 bit timer counter, tulad ng STM32L476 ang resolusyon na ito ay maaaring mas mataas at malulutas ang problema.

Ngunit narito, nais kong magmungkahi ng isang alternatibong solusyon na higit na magpapataas sa resolusyon kahit sa STM32F103.

Hakbang 3: Mga timer sa Cascading para sa Mas Mataas na Resolusyon

Mga timer sa Cascading para sa Mas Mataas na Resolusyon
Mga timer sa Cascading para sa Mas Mataas na Resolusyon
Mga timer sa Cascading para sa Mas Mataas na Resolusyon
Mga timer sa Cascading para sa Mas Mataas na Resolusyon
Mga timer sa Cascading para sa Mas Mataas na Resolusyon
Mga timer sa Cascading para sa Mas Mataas na Resolusyon

Ang pangunahing problema sa nakaraang solusyon ay ang rate ng frame (20 ms) ay medyo mataas kumpara sa tunay na nabuong PWM signal (sa pagitan ng 1 at 2 ms), kaya nagsasayang kami ng ilang mga pinahahalagahan na bit para sa natitirang 18 ms kapag naghihintay kami ang susunod na frame. Maaari itong malutas sa pamamagitan ng mga cascading timer gamit ang tampok na link ng timer para sa pagsabay.

Ang ideya ay gagamitin ko ang TIM1 bilang master upang makabuo ng frame rate (20 ms) at TIM2, TIM3 upang makayanan ang mga signal ng PWM bilang mga alipin. Kapag pinalitaw ng master ang mga alipin ay bumubuo lamang sila ng isang PWM signal sa isang mode ng pulso. Samakatuwid kailangan ko lamang masakop ang 2 ms sa mga timer. Sa kabutihang palad maaari mong i-cascade ang mga timer na iyon sa hardware kaya't ang pagsasabay na ito ay hindi nangangailangan ng anumang interbensyon mula sa processor at napakat tumpak din nito, ang jitter ay nasa rehiyon ng ps. Maaari mong makita ang pag-set up ng CubeMX sa mga screenshot.

Tulad ng nakikita mo pinili ko ang 3 bilang prescalar kaya para sa 2 ms kailangan kong magtakda ng 48000 sa counter ng timer. Nagbibigay ito sa amin ng 24000 para sa 1 ms na talagang higit na kailangan namin para sa resolusyon na 14 bit. Tadaaaa…

Mangyaring tingnan ang mga screenshot ng oscilloscope sa intro para sa pangwakas na resulta. Ang channel 3 (lila) ay ang nakakagambala ng master timer na magpapalitaw ng mga salves upang makabuo ng isang pulso. Ang Channel 1 at 4 (dilaw at berde na sinag) ay ang aktwal na mga signal ng PWM na nabuo ng iba't ibang mga timer. Tandaan na sila ay naka-sync ngunit ang mga ito ay naka-sync sa mga sumusunod na gilid, iyon ay dahil sa PWM mode 2. Hindi ito isang problema, dahil ang rate ng PWM para sa partikular na servo ay tama pa rin.

Ang iba pang benepisyo ng solusyon na ito ay upang baguhin ang frame rate ay nangangahulugang baguhin ang panahon sa TIM1 lamang. Para sa mga modernong digital servo maaari kang bumaba sa kahit na 200-300 Hz, ngunit mangyaring kumunsulta sa manwal ng servo kung nais mong maayos ang tono.

Inirerekumendang: