Servomotorer er veldig nyttige i elektronikk og innebygde systemer. Du kan finne bruken av Servomotor overalt rundt deg, de brukes i leker, roboter, CD-skuff på datamaskinen, biler, fly etc. Årsaken til dette brede omfanget er at servomotoren er veldig pålitelig og presis. Vi kan rotere den til en hvilken som helst bestemt vinkel. De er tilgjengelige i et bredt spekter, fra motorer med høyt dreiemoment og lavt dreiemoment. I denne opplæringen skal vi grensesnitt en servomotor til 8051 mikrokontroller (AT89S52).
Først må vi forstå arbeidsprinsippet til servomotorer. Servomotor fungerer på PWM (pulsbreddemodulasjon) prinsipp, betyr at rotasjonsvinkelen styres av varigheten av påført puls til kontroll-PIN-koden. I utgangspunktet består servomotoren av DC-motor som styres av en variabel motstand (potensiometer) og noen gir. DC-motorens høyhastighetskraft omdannes til dreiemoment av Gears. Vi vet at WORK = FORCE X DISTANCE, i DC motor Kraft er mindre og avstand (hastighet) er høy og i Servo er kraft høy og avstand mindre. Potensiometer er koblet til utgangsakselen til Servo, for å beregne vinkelen og stoppe DC-motoren i ønsket vinkel.
Servomotor kan roteres fra 0 til 180 grader, men den kan gå opp til 210 grader, avhengig av produsent. Denne rotasjonsgraden kan kontrolleres ved å bruke en LOGIC nivå 1-puls i en varighet mellom 1ms og 2ms. En 1 ms kan rotere servo til 0 grader, 1,5 ms kan rotere til 90 grader og 2 ms puls kan rotere den til 180 grader. Varighet mellom 1 til 2 ms kan rotere servomotoren til en hvilken som helst vinkel mellom 0 og 180 grader.
Kretsdiagram og arbeidsforklaring
Servomotoren har tre ledninger rød for Vcc (strømforsyning), brun for bakken og oransje er kontrolltråd. Kontrollkabel kan kobles til 8051, vi har koblet den til pinne 2.1 av 8051. Nå må vi holde denne pinnen til Logic 1 i 1 ms for å rotere den 0 grader, 1,5 ms for 90 grader, 2 ms for 180 grader. Vi har brukt på chip Timers på 8051 for å skape forsinkelse. Vi har opprettet forsinkelse på 50us gjennom funksjonen "servo_delay", og brukt "for" loop for å skape forsinkelse i multiple på 50us.
Vi bruker Timer 0 og i Mode 1, så vi har satt 01H i TMOD-registeret. Mode 1 er 16 bit timer modus og TH0 inneholder High byte og TL0 inneholder Low byte på 16 bit timer. Vi har satt FFD2 i 16 bit timer register, FF i TH0 og D2 i TL0. Å sette FFD2 vil skape forsinkelsen på ca. 50 oss med krystall på 11.0592MHz. TR0 og TF0 er bitene i TCON-registeret, TR-pinnen brukes til å starte tidtakeren når den er satt og stopper når den tilbakestilles (0). TF er overløpsflagg, angitt av maskinvare når overløp og må tilbakestilles med programvare. I utgangspunktet forteller TF fullføringen av Timer, og stilles inn av maskinvare når 16 timer går fra FFFFH til 0000H. Du kan lese om “8051 Timers” for å forstå beregningen av verdien i timersregistrene, for å opprette 50 us-forsinkelsen.
Nå målt fra CRO vil 13 løkker med servo_forsinkelsesfunksjon gi forsinkelsen på 1 ms, så vi har startet fra 1 ms (13 løkker) og gått til 2 ms (26 løkker) for å rotere servoen fra 0 til 180 grader. Men vi har sakte økt forsinkelsen fra 1ms, vi har delt 1ms til 2 ms vindu i 7 deler som 1.14ms, 1.28 ms, 1.42ms og så videre, så servoen vil rotere i multiplum på ca. 26 grader (180/7). Etter 180 vil den automatisk gå tilbake til 0 grader.