Sisällysluettelo:
2025 Kirjoittaja: John Day | [email protected]. Viimeksi muokattu: 2025-01-13 06:57
Rakennan tällä hetkellä SX1280 RF -siruun perustuvaa RC -lähetintä/vastaanotinta. Yksi projektin tavoitteista on, että haluan 12 -bittisen servotarkkuuden tikkuista aina servoihin asti. Osittain siksi, että nykyaikaisilla digitaalisilla servoilla on 12-bittinen resoluutio, toiseksi huippuluokan lähetin käyttää joka tapauksessa 12 bittiä. Tutkin, kuinka voin tuottaa korkean resoluution PWM -signaaleja STM32 -laitteille. Käytän prototyyppiä varten tällä hetkellä mustaa pilleriä (STM32F103C8T8).
Vaihe 1: Osaluettelo
Laitteisto
- Mikä tahansa STM32F103 -kehityskortti (sininen pilleri, musta pilleri jne.)
- USB -virtapankki virtalähteenä
- STM32-ohjelmoija (Segger j-links, ST-LINK/V2 tai yksinkertaisesti st-link-klooni)
Ohjelmisto
- STM32CubeMX
- Atollic TrueSTUDIO STM32: lle
- Projektin lähde githubista
Vaihe 2: Selvä ratkaisu
Luultavasti helpoin ratkaisu on käyttää yhtä ajastimesta, joka voi tuottaa PWM-signaaleja, kuten TIM1-3 STM32F103: ssa. Nykyaikaisen digitaalisen servon kuvataajuus voi laskea noin 5 ms: iin, mutta vanhan analogisen servon sen pitäisi olla 20 ms tai 50 Hz. Joten pahimmassa tapauksessa kehitämme sen. 72 MHz: n kellon ja 16 -bittisen ajastinlaskurin tarkkuuden vuoksi meidän on asetettava ajastimen esiasetin vähintään 23: een 20 ms: n kuvataajuuden kattamiseksi. Valitsin 24, koska sitten 20 ms: n ajan minun on asetettava laskuri täsmälleen 60000: een. Näet CubeMX -asetukset ja luodut 1 ja 1,5 ms PWM -signaalit kuvakaappauksissa. Valitettavasti 1 ms: n ajastinlaskurin tulisi olla 3000, mikä antaisi meille vain 11 -bittisen resoluution. Ei paha, mutta tavoite oli 12 -bittinen, joten kokeillaan jotain muuta.
Tietenkin Jos valitsisin mikro -ohjaimen, jossa on 32 -bittinen ajastinlaskuri, kuten STM32L476, tämä resoluutio voi olla paljon suurempi ja ongelma ratkaistaan.
Mutta tässä haluaisin ehdottaa vaihtoehtoista ratkaisua, joka lisää entisestään jopa STM32F103: n resoluutiota.
Vaihe 3: Cascading -ajastimet parempaa resoluutiota varten
Suurin ongelma edellisessä ratkaisussa on se, että kehysnopeus (20 ms) on suhteellisen korkea verrattuna todellisuudessa luotuun PWM -signaaliin (1-2 ms), joten tuhlaamme joitain arvokkaita bittejä jäljellä oleville 18 ms: lle odottaessamme seuraava kehys. Tämä voidaan ratkaista porrastamalla ajastimia käyttämällä ajastinlinkkiominaisuutta synkronointia varten.
Ajatuksena on, että käytän TIM1: tä isäntänä kehysnopeuden (20 ms) ja TIM2, TIM3 selviytymään PWM -signaaleista orjina. Kun isäntä laukaisee orjat, ne tuottavat vain PWM -signaalin yhdessä pulssitilassa. Siksi minun on katettava vain 2 ms näissä ajastimissa. Onneksi voit laskea nämä ajastimet laitteistoon, joten tämä synkronointi ei vaadi prosessorin väliintuloa ja se on myös erittäin tarkka, värinä on ps -alueella. Näet CubeMX -asetukset kuvakaappauksissa.
Kuten näette, valitsin esikalariksi 3, joten 2 ms: n ajan minun on asetettava 48000 ajastinlaskuriin. Tämä antaa meille 24000 1 ms, joka on itse asiassa enemmän mitä tarvitsemme 14 -bittiselle resoluutiolle. Tadaaaa…
Katso intro -oscilloskoopin kuvakaappaukset lopputuloksesta. Kanava 3 (violetti) on pääajastimen keskeytys, joka laukaisee salvat tuottamaan yhden pulssin. Kanava 1 ja 4 (keltainen ja vihreä säde) ovat eri ajastimien tuottamia todellisia PWM -signaaleja. Huomaa, että ne ovat synkronoituja, mutta ne synkronoidaan takareunoilla, mikä johtuu PWM -tilasta 2. Tämä ei ole ongelma, koska tietyn servon PWM -nopeus on edelleen oikea.
Tämän ratkaisun toinen etu on se, että kehysnopeuden muuttaminen merkitsisi vain TIM1 -ajanjakson muuttamista. Nykyaikaisilla digitaalisilla servoilla voit laskea jopa 200-300 Hz: iin, mutta tarkista servon käyttöopas, jos haluat hienosäätää.