Innholdsfortegnelse:

Høyoppløselig PWM -signalgenerering for RC -servoer med STM32 -enheter: 3 trinn
Høyoppløselig PWM -signalgenerering for RC -servoer med STM32 -enheter: 3 trinn

Video: Høyoppløselig PWM -signalgenerering for RC -servoer med STM32 -enheter: 3 trinn

Video: Høyoppløselig PWM -signalgenerering for RC -servoer med STM32 -enheter: 3 trinn
Video: Review of DPS5020 50V 20A DC Buck converter with PC USB and Mobile app software | WattHour 2024, November
Anonim
Høyoppløselig PWM -signalgenerering for RC -servoer med STM32 -enheter
Høyoppløselig PWM -signalgenerering for RC -servoer med STM32 -enheter
Høyoppløselig PWM -signalgenerering for RC -servoer med STM32 -enheter
Høyoppløselig PWM -signalgenerering for RC -servoer med STM32 -enheter
Høyoppløselig PWM -signalgenerering for RC -servoer med STM32 -enheter
Høyoppløselig PWM -signalgenerering for RC -servoer med STM32 -enheter

For tiden bygger jeg en RC -sender/mottaker basert på SX1280 RF -brikken. Et av målene for prosjektet er at jeg vil ha 12 biters servooppløsning fra pinnene helt ned til servoene. Dels fordi moderne digitale servoer har 12 biters oppløsning, for det andre bruker en high-end sender 12 bits uansett. Jeg undersøkte hvordan jeg kan generere høyoppløselige PWM -signaler på STM32 -enheter. Jeg bruker svart pille (STM32F103C8T8) for øyeblikket for prototypen.

Trinn 1: Deleliste

Maskinvare

  • Enhver STM32F103 utviklingstavle (blå pille, svart pille, etc.)
  • En USB -strømbank som strømforsyning
  • STM32 programmerer (Segger j-links, ST-LINK/V2, eller bare en st-link klon)

Programvare

  • STM32CubeMX
  • Atollic TrueSTUDIO for STM32
  • Prosjektkilde fra github

Trinn 2: Den åpenbare løsningen

Den åpenbare løsningen
Den åpenbare løsningen
Den åpenbare løsningen
Den åpenbare løsningen
Den åpenbare løsningen
Den åpenbare løsningen

Sannsynligvis den enkleste løsningen er å bruke en av timeren som kan generere PWM-signaler, som TIM1-3 på en STM32F103. For en moderne digital servo kan bildefrekvensen gå ned til 5 ms eller så, men for en gammel analog servo bør den være 20 ms eller 50 Hz. Så, i verste fall, la oss generere det. Med 72 MHz -klokke og 16 -biters timer -oppløsning må vi stille timerenes forhåndskalkulator til minimum 23 for å dekke 20 ms bildefrekvensen. Jeg valgte 24 fordi jeg i 20 ms må sette telleren nøyaktig til 60000. Du kan se CubeMX -oppsettet og de genererte 1 og 1,5 ms PWM -signalene i skjermbildene. Dessverre, for 1 ms bør tidtelleren settes til 3000, noe som ville gi oss bare 11 biters oppløsning. Ikke verst, men målet var 12 bit, så la oss prøve noe annet.

Selvfølgelig Hvis jeg ville velge en mikrokontroller med 32 -biters timerteller, som STM32L476, kan denne oppløsningen være mye høyere og problemet ville bli løst.

Men her vil jeg foreslå en alternativ løsning som vil øke oppløsningen ytterligere selv på STM32F103.

Trinn 3: Cascading -tidtakere for høyere oppløsning

Kaskadetimere for høyere oppløsning
Kaskadetimere for høyere oppløsning
Kaskadetimere for høyere oppløsning
Kaskadetimere for høyere oppløsning
Kaskadetimere for høyere oppløsning
Kaskadetimere for høyere oppløsning

Hovedproblemet med forrige løsning er at bildefrekvensen (20 ms) er relativt høy sammenlignet med det faktisk genererte PWM -signalet (mellom 1 og 2 ms), så vi sløser med noen verdsatte biter for de resterende 18 ms når vi venter på neste ramme. Dette kan løses ved å kaskade timere ved hjelp av timerkoblingsfunksjonen for synkronisering.

Tanken er at jeg skal bruke TIM1 som master for å generere bildefrekvensen (20 ms) og TIM2, TIM3 for å takle PWM -signalene som slaver. Når masteren utløser slaver, genererer de bare et PWM -signal i en pulsmodus. Derfor trenger jeg bare å dekke 2 ms i disse timerne. Heldigvis kan du kaskade disse tidtakerne i maskinvare, slik at denne synkroniseringen ikke trenger inngrep fra prosessoren, og det er også veldig presist, jitteren er i ps -regionen. Du kan se CubeMX -oppsettet på skjermbildene.

Som du kan se valgte jeg 3 som prescalar, så for 2 ms må jeg sette 48000 i timertelleren. Dette gir oss 24000 for 1 ms som faktisk er mer det vi trenger for 14 biters oppløsning. Tadaaaa…

Ta en titt på oscilloskopets skjermbilder i introen for det endelige resultatet. Kanal 3 (lilla) er master -timers avbrudd som vil utløse salvene til å generere en puls. Kanal 1 og 4 (gul og grønn stråle) er de faktiske PWM -signalene som genereres av forskjellige tidtakere. Vær oppmerksom på at de er synkronisert, men de er synkronisert ved bakkantene, det er på grunn av PWM -modus 2. Dette er ikke et problem, fordi PWM -frekvensen for den aktuelle servoen fortsatt er korrekt.

Andre fordeler med denne løsningen er at å endre bildefrekvensen ville bety å endre perioden bare i TIM1. For moderne digitale servoer kan du gå ned til og med 200-300 Hz, men vennligst se servoens manual hvis du vil finjustere.

Anbefalt: