Indholdsfortegnelse:

Højopløselig PWM -signalgenerering til RC -servoer med STM32 -enheder: 3 trin
Højopløselig PWM -signalgenerering til RC -servoer med STM32 -enheder: 3 trin

Video: Højopløselig PWM -signalgenerering til RC -servoer med STM32 -enheder: 3 trin

Video: Højopløselig PWM -signalgenerering til RC -servoer med STM32 -enheder: 3 trin
Video: Doublefinale, STF's klubturnering 2013 2024, Juli
Anonim
Højopløselig PWM -signalgenerering til RC -servoer med STM32 -enheder
Højopløselig PWM -signalgenerering til RC -servoer med STM32 -enheder
Højopløselig PWM -signalgenerering til RC -servoer med STM32 -enheder
Højopløselig PWM -signalgenerering til RC -servoer med STM32 -enheder
Højopløselig PWM -signalgenerering til RC -servoer med STM32 -enheder
Højopløselig PWM -signalgenerering til RC -servoer med STM32 -enheder

I øjeblikket bygger jeg en RC -sender/modtager baseret på SX1280 RF -chippen. Et af målene for projektet er, at jeg vil have 12 bit servo -opløsning fra pindene helt ned til servoerne. Dels fordi moderne digitale servoer har 12 bit opløsning, for det andet bruger en high-end sender 12 bits alligevel. Jeg undersøgte, hvordan jeg kan generere højopløselige PWM -signaler på STM32 -enheder. Jeg bruger i øjeblikket sort pille (STM32F103C8T8) til prototypen.

Trin 1: Deleliste

Hardware

  • Enhver STM32F103 udviklingstavle (blå pille, sort pille osv.)
  • En USB powerbank som strømforsyning
  • STM32 programmerer (Segger j-links, ST-LINK/V2 eller simpelthen en st-link klon)

Software

  • STM32CubeMX
  • Atollic TrueSTUDIO til STM32
  • Projektkilde fra github

Trin 2: Den åbenlyse løsning

Den åbenlyse løsning
Den åbenlyse løsning
Den åbenlyse løsning
Den åbenlyse løsning
Den åbenlyse løsning
Den åbenlyse løsning

Sandsynligvis den nemmeste løsning er at bruge en af timeren, der kan generere PWM-signaler, som TIM1-3 på en STM32F103. For en moderne digital servo kan billedhastigheden gå ned til 5 ms eller deromkring, men for en gammel analog servo bør den være 20 ms eller 50 Hz. Så lad os generere det som et værst tænkeligt scenario. Med et 72 MHz ur og en 16 bit timer tælleropløsning skal vi indstille timeren til forvalteren til minimum 23 for at dække billedhastigheden på 20 ms. Jeg valgte 24, fordi jeg derefter i 20 ms skal indstille tælleren nøjagtigt til 60000. Du kan se CubeMX -opsætningen og de genererede 1 og 1,5 ms PWM -signaler i skærmbillederne. Desværre skulle timertælleren i 1 ms indstilles til 3000, hvilket kun ville give os 11 bit opløsning. Ikke dårligt, men målet var 12 bit, så lad os prøve noget andet.

Selvfølgelig Hvis jeg ville vælge en mikrocontroller med 32 bit timer tæller, ligesom STM32L476, kan denne opløsning være meget højere, og problemet ville blive løst.

Men her vil jeg gerne foreslå en alternativ løsning, der vil øge opløsningen yderligere på STM32F103.

Trin 3: Kaskadetimere til højere opløsning

Kaskadetimere til højere opløsning
Kaskadetimere til højere opløsning
Kaskadetimere til højere opløsning
Kaskadetimere til højere opløsning
Kaskadetimere til højere opløsning
Kaskadetimere til højere opløsning

Hovedproblemet med tidligere løsning er, at billedhastigheden (20 ms) er relativt høj i forhold til det faktisk genererede PWM -signal (mellem 1 og 2 ms), så vi spilder nogle værdifulde bits for de resterende 18 ms, når vi venter på den næste ramme. Dette kan løses ved at kaskade timere ved hjælp af timerlink -funktionen til synkronisering.

Ideen er, at jeg vil bruge TIM1 som master til at generere billedhastigheden (20 ms) og TIM2, TIM3 til at klare PWM -signalerne som slaver. Når masteren udløser slaverne, genererer de kun et PWM -signal i en pulsfunktion. Derfor behøver jeg kun at dække 2 ms i disse timere. Heldigvis kan du kaskade disse timere i hardware, så denne synkronisering ikke behøver nogen indgriben fra processoren, og det er også meget præcist, rystelsen er i ps -regionen. Du kan se CubeMX -opsætningen på skærmbillederne.

Som du kan se, valgte jeg 3 som prescalar, så for de 2 ms skal jeg indstille 48000 i timertælleren. Dette giver os 24000 for 1 ms, hvilket faktisk er mere, hvad vi har brug for til 14 bit opløsning. Tadaaaa…

Tag et kig på oscilloskopets skærmbilleder i introen for det endelige resultat. Kanalen 3 (lilla) er master -timers afbrydelse, som vil udløse salverne til at generere en puls. Kanal 1 og 4 (gul og grøn stråle) er de faktiske PWM -signaler genereret af forskellige timere. Bemærk, at de er synkroniseret, men de er synkroniseret ved bagkanterne, det er på grund af PWM -tilstand 2. Dette er ikke et problem, fordi PWM -hastigheden for den pågældende servo stadig er korrekt.

En anden fordel ved denne løsning er, at ændring af billedfrekvensen ville betyde kun at ændre perioden i TIM1. For moderne digitale servoer kan du gå ned til endda 200-300 Hz, men se venligst servoens manual, hvis du vil finjustere.

Anbefalede: