Servomotorer är mycket användbara i elektronik och inbyggda system. Du kan hitta användningen av Servomotor överallt runt dig, de används i leksaker, robotar, CD-fack på dator, bilar, flygplan etc. Anledningen till detta breda omfång är att servomotorn är mycket pålitlig och exakt. Vi kan rotera den till en viss vinkel. De finns i ett brett spektrum, från motorer med högt vridmoment och lågt vridmoment. I den här guiden ska vi koppla en servomotor till 8051 mikrokontroller (AT89S52).
Först måste vi förstå arbetsprincipen för servomotorer. Servomotorn fungerar på PWM (pulsbreddsmodulation) princip, betyder att dess rotationsvinkel styrs av varaktigheten för den applicerade pulsen till dess kontroll-PIN. I grund och botten består servomotorn av likströmsmotor som styrs av ett variabelt motstånd (potentiometer) och några växlar. DC-motorns höghastighetskraft omvandlas till vridmoment av Gears. Vi vet att ARBETE = KRAFT X DISTANS, i likströmsmotor Kraft är mindre och avstånd (hastighet) är högt och i Servo är kraft högt och avstånd är mindre. Potentiometer är ansluten till servoens utgående axel för att beräkna vinkeln och stoppa DC-motorn i önskad vinkel.
Servomotorn kan roteras från 0 till 180 grader, men den kan gå upp till 210 grader, beroende på tillverkare. Denna grad av rotation kan kontrolleras genom att applicera en LOGIC nivå 1-puls under en varaktighet mellan 1ms och 2ms. En 1 ms kan rotera servo till 0 grader, 1,5 ms kan rotera till 90 grader och 2 ms puls kan rotera den till 180 grader. Varaktighet mellan 1 och 2 ms kan rotera servomotorn till valfri vinkel mellan 0 och 180 grader.
Kretsschema och arbetsförklaring
Servomotorn har tre ledningar Röd för Vcc (strömförsörjning), Brun för mark och Orange är styrledning. Styrtråd kan anslutas till 8051, vi har anslutit den till stift 2.1 av 8051. Nu måste vi hålla denna stift till Logic 1 i 1 ms för att rotera den 0 grader, 1,5 ms för 90 grader, 2 ms för 180 grader. Vi har använt på chip-timer av 8051 för att skapa fördröjning. Vi har skapat fördröjning på 50us genom funktionen "servo_delay" och använt "for" loop för att skapa fördröjning i multipel av 50us.
Vi använder Timer 0 och i Mode 1, så vi har lagt 01H i TMOD-registret. Läge 1 är 16 bitars timer-läge och TH0 innehåller hög byte och TL0 innehåller låg byte med 16 bitars timer. Vi har lagt FFD2 i ett 16-bitars timerregister, FF i TH0 och D2 i TL0. Att sätta FFD2 skapar en fördröjning på ca. 50 oss med kristallen 11.0592MHz. TR0 och TF0 är bitarna i TCON-registret, TR-stift används för att starta timern när den ställs in och stoppas vid återställning (0). TF är överflödesflagga, ställs in av maskinvara vid överflöd och måste återställas med programvara. I grund och botten berättar TF slutförandet av Timer och ställs in av hårdvara när 16 timer passerar från FFFFH till 0000H. Du kan läsa om "8051 Timers" för att förstå beräkningen av värde i timersregister, för att skapa 50 us-förseningen.
Nu mätt från CRO kommer 13 loopar av servo_delay-funktionen att ge fördröjningen på 1 ms, så vi har börjat från 1 ms (13 loopar) och gått till 2 ms (26 loopar) för att rotera servon från 0 till 180 grader. Men vi har långsamt ökat fördröjningen från 1ms, vi har delat fönstret 1ms till 2 ms i 7 delar som 1.14ms, 1.28 ms, 1.42ms och så vidare, så servon kommer att rotera i multipel av ca. 26 grader (180/7). Efter 180 återgår den automatiskt till 0 grader.