Innehållsförteckning:

Högupplöst PWM -signalgenerering för RC -servon med STM32 -enheter: 3 steg
Högupplöst PWM -signalgenerering för RC -servon med STM32 -enheter: 3 steg

Video: Högupplöst PWM -signalgenerering för RC -servon med STM32 -enheter: 3 steg

Video: Högupplöst PWM -signalgenerering för RC -servon med STM32 -enheter: 3 steg
Video: Магадан. Магаданский заповедник. Нерестилища лососёвых рыб. Nature of Russia. 2024, November
Anonim
Högupplöst PWM -signalgenerering för RC -servon med STM32 -enheter
Högupplöst PWM -signalgenerering för RC -servon med STM32 -enheter
Högupplöst PWM -signalgenerering för RC -servon med STM32 -enheter
Högupplöst PWM -signalgenerering för RC -servon med STM32 -enheter
Högupplöst PWM -signalgenerering för RC -servon med STM32 -enheter
Högupplöst PWM -signalgenerering för RC -servon med STM32 -enheter

För närvarande bygger jag en RC -sändare/mottagare baserad på SX1280 RF -chip. Ett av målen för projektet är att jag vill ha 12 bitars servoupplösning från pinnarna hela vägen ner till servon. Dels för att moderna digitala servon har 12 bitars upplösning, för det andra använder en avancerad sändare ändå 12 bitar. Jag undersökte hur jag kan generera högupplösta PWM -signaler på STM32 -enheter. Jag använder svart piller (STM32F103C8T8) för närvarande för prototypen.

Steg 1: Dellista

Hårdvara

  • Alla STM32F103 utvecklingskort (blått piller, svart piller, etc.)
  • En USB -powerbank som strömförsörjning
  • STM32 programmerare (Segger j-links, ST-LINK/V2, eller helt enkelt en st-link klon)

programvara

  • STM32CubeMX
  • Atollic TrueSTUDIO för STM32
  • Projektkälla från github

Steg 2: Den uppenbara lösningen

Den uppenbara lösningen
Den uppenbara lösningen
Den uppenbara lösningen
Den uppenbara lösningen
Den uppenbara lösningen
Den uppenbara lösningen

Förmodligen är den enklaste lösningen att använda en av timern som kan generera PWM-signaler, som TIM1-3 på en STM32F103. För en modern digital servo kan bildhastigheten gå ner till 5 ms eller så, men för en gammal analog servo bör den vara 20 ms eller 50 Hz. Så, i värsta fall, låt oss generera det. Med 72 MHz klocka och 16 bitars timerräknare upplösning måste vi ställa in timerns förkalkylator till minimum 23 för att täcka 20 ms bildfrekvens. Jag valde 24 eftersom jag sedan i 20 ms måste ställa in räknaren exakt till 60000. Du kan se CubeMX -inställningen och de genererade 1 och 1,5 ms PWM -signalerna i skärmdumparna. Tyvärr bör timermätaren för 1 ms ställas in på 3000, vilket skulle ge oss endast 11 bitars upplösning. Inte illa, men målet var 12 bitar, så låt oss prova något annat.

Naturligtvis Om jag skulle välja en mikrokontroller med 32 -bitars timerräknare, som STM32L476, kan denna upplösning vara mycket högre och problemet skulle lösas.

Men här skulle jag vilja föreslå en alternativ lösning som kommer att öka upplösningen ytterligare även på STM32F103.

Steg 3: Cascading Timers för högre upplösning

Cascading Timers för högre upplösning
Cascading Timers för högre upplösning
Cascading Timers för högre upplösning
Cascading Timers för högre upplösning
Cascading Timers för högre upplösning
Cascading Timers för högre upplösning

Huvudproblemet med tidigare lösning är att bildhastigheten (20 ms) är relativt hög jämfört med den faktiskt genererade PWM -signalen (mellan 1 och 2 ms), så vi slösar bort några värderade bitar för de återstående 18 ms när vi väntar på nästa ram. Detta kan lösas genom att kaskade timers använder timerlänkfunktionen för synkronisering.

Tanken är att jag ska använda TIM1 som master för att generera bildhastigheten (20 ms) och TIM2, TIM3 för att klara PWM -signalerna som slavar. När mastern triggar slavarna genererar de bara en PWM -signal i ett pulsläge. Därför behöver jag bara täcka 2 ms i dessa timers. Lyckligtvis kan du kaskadera dessa timers i hårdvara så att denna synkronisering inte behöver ingripa från processorn och det är också mycket exakt, jittern är i ps -regionen. Du kan se CubeMX -inställningen på skärmdumparna.

Som du kan se valde jag 3 som prescalar så för 2 ms måste jag ställa in 48000 i timermätaren. Detta ger oss 24000 för 1 ms vilket faktiskt är mer vad vi behöver för 14 bitars upplösning. Tadaaaa…

Ta en titt på oscilloskopets skärmdumpar i introduktionen för det slutliga resultatet. Kanalen 3 (lila) är mastertimerns avbrott som kommer att trigga salvorna att generera en puls. Kanal 1 och 4 (gul och grön stråle) är de faktiska PWM -signalerna som genereras av olika tidtagare. Observera att de är synkroniserade men de synkroniseras vid bakkanterna, det är på grund av PWM -läge 2. Detta är inte ett problem, eftersom PWM -hastigheten för den specifika servon fortfarande är korrekt.

En annan fördel med denna lösning är att ändra ramfrekvensen skulle innebära att endast ändra perioden i TIM1. För moderna digitala servon kan du gå ner till till och med 200-300 Hz, men se servohandboken om du vill finjustera.

Rekommenderad: