Inhoudsopgave:

Hoge resolutie PWM-signaalgeneratie voor RC-servo's met STM32-apparaten - Ajarnpa
Hoge resolutie PWM-signaalgeneratie voor RC-servo's met STM32-apparaten - Ajarnpa

Video: Hoge resolutie PWM-signaalgeneratie voor RC-servo's met STM32-apparaten - Ajarnpa

Video: Hoge resolutie PWM-signaalgeneratie voor RC-servo's met STM32-apparaten - Ajarnpa
Video: Essential Scale-Out Computing by James Cuff 2024, Juli-
Anonim
Hoge resolutie PWM-signaalgeneratie voor RC-servo's met STM32-apparaten
Hoge resolutie PWM-signaalgeneratie voor RC-servo's met STM32-apparaten
Hoge resolutie PWM-signaalgeneratie voor RC-servo's met STM32-apparaten
Hoge resolutie PWM-signaalgeneratie voor RC-servo's met STM32-apparaten
Hoge resolutie PWM-signaalgeneratie voor RC-servo's met STM32-apparaten
Hoge resolutie PWM-signaalgeneratie voor RC-servo's met STM32-apparaten

Momenteel ben ik een RC-zender/ontvanger aan het bouwen op basis van de SX1280 RF-chip. Een van de doelen van het project is dat ik een 12-bits servoresolutie wil van de sticks helemaal tot aan de servo's. Deels omdat moderne digitale servo's een resolutie van 12 bits hebben, gebruikt een high-end zender sowieso 12 bits. Ik was aan het onderzoeken hoe ik PWM-signalen met hoge resolutie kan genereren op STM32-apparaten. Ik gebruik momenteel zwarte pil (STM32F103C8T8) voor het prototype.

Stap 1: Onderdelenlijst

Hardware

  • Elk STM32F103-ontwikkelbord (blauwe pil, zwarte pil, enz.)
  • Een USB powerbank als voeding
  • STM32 programmeur (Segger j-links, ST-LINK/V2 of gewoon een st-link kloon)

Software

  • STM32CubeMX
  • Atollic TrueSTUDIO voor STM32
  • Projectbron van github

Stap 2: De voor de hand liggende oplossing

De voor de hand liggende oplossing
De voor de hand liggende oplossing
De voor de hand liggende oplossing
De voor de hand liggende oplossing
De voor de hand liggende oplossing
De voor de hand liggende oplossing

De gemakkelijkste oplossing is waarschijnlijk om een van de timers te gebruiken die PWM-signalen kunnen genereren, zoals TIM1-3 op een STM32F103. Voor een moderne digitale servo kan de framesnelheid dalen tot 5 ms of zo, maar voor een oude analoge servo zou dit 20 ms of 50 Hz moeten zijn. Dus laten we als worstcasescenario dat genereren. Met een kloksnelheid van 72 MHz en een resolutie van 16 bit timer-teller moeten we de prescaler van de timer op minimaal 23 zetten om de framesnelheid van 20 ms te dekken. Ik heb 24 gekozen omdat ik dan voor 20 ms de teller precies op 60000 moet zetten. Je kunt de CubeMX-opstelling en de gegenereerde 1 en 1,5 ms PWM-signalen zien in de screenshots. Helaas moet de teller van de timer voor 1 ms worden ingesteld op 3000, wat ons slechts een resolutie van 11 bits zou geven. Niet slecht, maar het doelpunt was 12 bit, dus laten we iets anders proberen.

Als ik een microcontroller met 32 bit timer-teller zou kiezen, zoals STM32L476, kan deze resolutie natuurlijk veel hoger zijn en zou het probleem zijn opgelost.

Maar hier zou ik een alternatieve oplossing willen voorstellen die de resolutie verder zal verhogen, zelfs op de STM32F103.

Stap 3: Trapsgewijze timers voor hogere resolutie

Trapsgewijze timers voor hogere resolutie
Trapsgewijze timers voor hogere resolutie
Trapsgewijze timers voor hogere resolutie
Trapsgewijze timers voor hogere resolutie
Trapsgewijze timers voor hogere resolutie
Trapsgewijze timers voor hogere resolutie

Het grootste probleem met de vorige oplossing is dat de framesnelheid (20 ms) relatief hoog is in vergelijking met het daadwerkelijk gegenereerde PWM-signaal (tussen 1 en 2 ms), dus we verspillen enkele waardevolle bits voor de resterende 18 ms wanneer we wachten op het volgende kader. Dit kan worden opgelost door timers te laten cascaderen met behulp van de timer-link-functie voor synchronisatie.

Het idee is dat ik TIM1 als master gebruik om de framesnelheid (20 ms) te genereren en TIM2, TIM3 om de PWM-signalen als slaves te verwerken. Wanneer de master de slaves triggert, genereren ze slechts een PWM-signaal in één pulsmodus. Daarom hoef ik in die timers maar 2 ms af te dekken. Gelukkig kun je die timers in hardware cascaderen, zodat deze synchronisatie geen tussenkomst van de processor nodig heeft en het is ook heel precies, de jitter zit in de ps-regio. U kunt de CubeMX-opstelling zien op de schermafbeeldingen.

Zoals je kunt zien, heb ik 3 als prescalar geselecteerd, dus voor de 2 ms moet ik 48000 instellen in de teller van de timer. Dit geeft ons 24000 voor 1 ms, wat eigenlijk meer is wat we nodig hebben voor een resolutie van 14 bits. Tadaaa…

Bekijk de screenshots van de oscilloscoop in de intro voor het eindresultaat. Het kanaal 3 (paars) is de onderbreking van de mastertimer die de zalven zal triggeren om één puls te genereren. Kanaal 1 en 4 (gele en groene straal) zijn de eigenlijke PWM-signalen die door verschillende timers worden gegenereerd. Merk op dat ze gesynchroniseerd zijn, maar ze zijn gesynchroniseerd aan de achterranden, dat komt door de PWM-modus 2. Dit is geen probleem, omdat de PWM-snelheid voor de specifieke servo nog steeds correct is.

Een ander voordeel van deze oplossing is dat het wijzigen van de framesnelheid zou betekenen dat de periode alleen in TIM1 wordt gewijzigd. Voor moderne digitale servo's kun je zelfs tot 200-300 Hz gaan, maar raadpleeg de handleiding van de servo als je wilt finetunen.

Aanbevolen: