Använda en PIC mikrokontroller för att styra en Hobby Servo (4 / 6 steg)
Steg 4: Firmware
Bifogat är den firmware jag använt för denna lilla demo. Jag använde gratis MPLAB IDE med C18 kompilatorn (gratis för studenter). Båda finns att ladda ner från webbplatsen mikrochip. Logiken går så här:1. försening för någonstans mellan 10 och 20 ms (i detta fall, 12)
2. om knappen (PIN-kod 4) skjuts, mäta spänning på potentiometern (pin 2)
3. Ställ styrsignalen hög (5 v)
4. dröjsmål under en lång tid proportionell mot spänningen mätt i steg 2
5. Ställ styrsignalen låg (mark)
6. gå tillbaka till steg 1
Kanske är lite mer information på analog-till-digital konvertering i ordning. Så vi vet redan att spänningen på pin 2 kommer att vara någonstans mellan 0 och 5 volt på grund av spänningsdelare. PIC'S A/D omvandling fungerar (begreppsmässigt) ungefär som en omvänd spänningsavdelare. Det rapporterar spänningen som en del av dess matningsspänningen. Dock är andelen skalas så för att vara mellan 0 och 255 (vilket är 8 bitar av information, storleken på en osignerad karaktär). Med andra ord, är den följande jämställdheten inställd:
(stift 2 spänning) / 5v = POT_VALUE / 255
eller:
POT_VALUE = 255 * ((pin 2 voltage) / 5v)
PIC faktiskt gör en 10-bitars A/D omvandling, men 8 bitar är mycket granulat nog för våra syften, så de två minst signifikanta bitarna av A/D omvandling inte används i denna kod. De senaste två siffror dessutom förmodligen mätning av buller i stället för själva signalen, så vi inte saknar så mycket genom att ignorera dem.
Förseningarna beräknas baserat på den tid det tar för att slutföra en instruktion på bild med en 4 MHz klocka. Jag minns inte varför, men på något sätt detta fungerar till 1/6 oss per instruktion cykel. Så om vi dröjer för 5400 cykler, det är 5400 cykler * 1/6 US / cykel = 900 US = 0.9 ms. en annan viktig bit är att hitta konstanten proportionalitetsprincipen som skalar POT_VALUE (på ett utbud av 255-0 = 255) till vår puls bredd (på en mängd 2.1 ms-0.9 ms = 1200 oss); eller, att formulera frågan ett annat sätt: hur många cykler bör vi dröjer för varje räkning av POT_VALUE?
(1200 US * 6 cykler / oss) / 255 räknar = 28 cykler/räkna
De av er efter tillsammans med koden kommer att märka att jag faktiskt dröja 20 cyklar per räkning, inte 28. Detta är ett experimentellt bestämd värde (jag tittade på signalen med ett oscilloskop) som justerar för alla faktorer resonemang tidpunkten, främst overhead från de for-loop på linje 68.