Servomotorer er meget nyttige i elektronik og indlejrede systemer. Du kan finde brugen af servomotor overalt omkring dig, de bruges i legetøj, robotter, cd-bakke til computer, biler, fly osv. Årsagen til dette brede anvendelsesområde er, at servomotoren er meget pålidelig og præcis. Vi kan dreje det til en hvilken som helst bestemt vinkel. De fås i bred vifte, fra motorer med højt moment og lavt drejningsmoment. I denne vejledning skal vi interface en servomotor til 8051 mikrokontroller (AT89S52).
Først skal vi forstå funktionsprincippet for servomotorer. Servomotor fungerer på PWM (pulsbreddemodulation) princip, betyder, at dens rotationsvinkel styres af varigheden af den påførte puls til dens kontrol-PIN. Grundlæggende består servomotor af jævnstrømsmotor, som styres af en variabel modstand (potentiometer) og nogle gear. DC-motorens højhastighedskraft omdannes til drejningsmoment ved hjælp af gear. Vi ved, at ARBEJDE = KRAFT X AFSTAND, i jævnstrømsmotor Kraft er mindre og afstand (hastighed) er høj, og i Servo er kraften høj, og afstanden er mindre. Potentiometer er forbundet til udgangsakslen på Servo for at beregne vinklen og stoppe DC-motoren i den krævede vinkel.
Servomotor kan drejes fra 0 til 180 grader, men den kan gå op til 210 grader afhængigt af fabrikanten. Denne grad af rotation kan styres ved at anvende en LOGIC niveau 1-puls i en varighed mellem 1 ms og 2 ms. En 1 ms kan rotere servo til 0 grad, 1,5 ms kan rotere til 90 grader og 2 ms puls kan rotere den til 180 grader. Varighed mellem 1 og 2 ms kan dreje servomotoren til enhver vinkel mellem 0 og 180 grader.
Kredsløbsdiagram og arbejdsforklaring
Servomotor har tre ledninger rød til Vcc (strømforsyning), Brun til jord, og orange er kontrolkabel. Kontroltråd kan forbindes til 8051, vi har tilsluttet den til pin 2.1 af 8051. Nu skal vi holde denne pin til Logic 1 i 1 ms for at rotere den 0 grad, 1,5 ms for 90 grader, 2 ms for 180 grader. Vi har brugt på chiptimere på 8051 til at skabe forsinkelse. Vi har oprettet forsinkelse på 50us gennem funktionen "servo_delay", og brugt "for" loop til at skabe forsinkelse i multiple af 50us.
Vi bruger Timer 0 og i Mode 1, så vi har sat 01H i TMOD-registeret. Mode 1 er 16 bit timer mode og TH0 indeholder High byte og TL0 indeholder Low byte af 16 bit timer. Vi har sat FFD2 i 16 bit timer register, FF i TH0 og D2 i TL0. At sætte FFD2 skaber forsinkelsen på ca. 50 os med krystallen på 11.0592MHz. TR0 og TF0 er bitene i TCON-registeret, TR-pin bruges til at starte timeren, når den er indstillet, og stop, når den nulstilles (0). TF er overløbsflag, indstillet af hardware ved overløb og skal nulstilles med software. Grundlæggende fortæller TF afslutningen af Timer og indstilles af hardware, når 16 timer transit fra FFFFH til 0000H. Du kan læse om “8051 Timers” for at forstå beregningen af værdien i timersregistrene for at oprette 50 us-forsinkelsen.
Nu målt fra CRO vil 13 sløjfer af servo_delay-funktion give forsinkelsen på 1 ms, så vi er startet fra 1 ms (13 sløjfer) og gået til 2 ms (26 sløjfer) for at rotere servoen fra 0 til 180 grader. Men vi har langsomt øget forsinkelsen fra 1 ms, vi har delt 1 ms til 2 ms vindue i 7 dele som 1.14ms, 1.28 ms, 1.42ms og så videre, så servoen roterer i multiplum på ca. 26 grader (180/7). Efter 180 vender den automatisk tilbage til 0 grader.