Innehållsförteckning:
Video: Högupplöst PWM -signalgenerering för RC -servon med STM32 -enheter: 3 steg
2024 Författare: John Day | [email protected]. Senast ändrad: 2024-01-30 12:41
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
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
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:
Högupplöst frekvensräknare: 5 steg (med bilder)
Högupplöst frekvensräknare: Denna instruerbara visar en ömsesidig frekvensräknare som kan mäta frekvenser snabbt och med rimlig precision. Den är gjord med standardkomponenter och kan göras på en helg (det tog lite längre tid :-)) EDIT: Koden är nu tillgänglig
Högupplöst webbkamera: 9 steg (med bilder)
Högupplöst webbkamera: Under några år använde jag en RPi -baserad webbkamera (med PiCam -modulen). De producerade bilderna var okej men då var det ögonblicket då jag inte längre var nöjd med kvaliteten. Jag bestämde mig för att göra en högupplöst webbkamera. Följande delar med
Väggfäste för iPad som kontrollpanel för hemautomation, med servostyrd magnet för att aktivera skärmen: 4 steg (med bilder)
Väggfäste för iPad Som kontrollpanel för hemautomation, med servostyrd magnet för att aktivera skärmen: På senare tid har jag ägnat ganska mycket tid åt att automatisera saker i och runt mitt hus. Jag använder Domoticz som min hemautomationsapplikation, se www.domoticz.com för mer information. I min sökning efter en instrumentpanelapplikation som visar all Domoticz -information tillsammans
OpenLogger: En högupplöst, Wi-Fi-aktiverad, öppen källkod, bärbar datalogger: 7 steg
OpenLogger: En högupplöst, Wi-Fi-aktiverad, öppen källkod, bärbar datalogger: OpenLogger är en bärbar, öppen källkod, låg kostnad, högupplöst dataloggare som är utformad för att ge högkvalitativa mätningar utan att kräva dyr programvara eller skrivprogramvara från början. Om du är ingenjör, vetenskapsman eller entusiast som inte
Övertyga dig själv om att bara använda en 12V-till-AC-omriktare för LED-ljussträngar istället för att koppla om dem för 12V: 3 steg
Övertyga dig själv om att bara använda en 12V-till-AC-linjeomvandlare för LED-ljussträngar istället för att koppla om dem för 12V: Min plan var enkel. Jag ville klippa upp en väggdriven LED-ljussträng i bitar och sedan dra om den för att gå av 12 volt. Alternativet var att använda en kraftomvandlare, men vi vet alla att de är fruktansvärt ineffektiva, eller hur? Höger? Eller är de det?