- Vad är en servomotor?
- Gränssnitts servomotorer med mikrokontroller:
- Programmering av servomotor med PICF877A PIC-mikrokontroller:
- Kretsschema:
- Simulering och hårdvaruinstallation:
Detta är vår 11: e handledning om inlärning av PIC-mikrokontroller med MPLAB och XC8. I den här handledningen lär vi oss hur man styr servomotor med PIC Microcontroller. Om du redan har arbetat med servomotorer kan du hoppa över den första halvan av denna handledning, men om du inte är ny på servomotorn, fortsätt läsa.
Hittills har vi täckt många grundläggande handledning som LED blinkar med PIC, Timers i PIC, gränssnitt LCD, gränssnitt 7-segment, ADC med PIC etc. börja lära sig.
I vår tidigare handledning lärde vi oss att generera PWM-signaler med PIC Microcontroller, signalerna genererades baserat på det värde som lästes från potentiometern. Om du har förstått alla program då, Grattis du har redan kodat för en Servomotor också. JA, Servomotorer svarar på PWM-signalerna (som vi skapar med hjälp av timers här) vi lär oss varför och hur i denna handledning. Vi kommer att simulera och bygga hårdvaruinstallationen för detta projekt och du hittar den detaljerade videon i slutet av denna handledning.
Vad är en servomotor?
En servomotor är en typ av ställdon (mestadels cirkulär) som möjliggör vinkelkontroll. Det finns många typer av servomotorer tillgängliga, men i denna handledning kan vi koncentrera oss på hobby servomotorerna som visas nedan.
Hobbyservos är populära eftersom de är den billiga metoden för rörelsekontroll. De tillhandahåller en hyllningslösning för de flesta R / C- och robothobbyisternas behov. De eliminerar också behovet av att skräddarsy ett styrsystem för varje applikation.
De flesta hobby servomotorer har en rotationsängel på 0-180 ° men du kan också få 360 ° servomotor om du är intresserad. Denna handledning använder en 0- 180 ° servomotor. Det finns två typer av servomotorer baserade på växeln, den ena är servomotorn av plastväxel och den andra är servomotorn av metallväxel. Metallväxlar används på platser där motorn utsätts för mer slitage, men det kostar bara till ett högt pris.
Servomotorer är märkta i kg / cm (kilogram per centimeter). De flesta hobbymotorer har 3 kg / cm eller 6 kg / cm eller 12 kg / cm. Denna kg / cm visar hur mycket din servomotor kan lyfta på ett visst avstånd. Till exempel: En 6 kg / cm servomotor ska kunna lyfta 6 kg om lasten är upphängd 1 cm från motoraxeln, desto större avstånd desto mindre viktförmåga. Lär dig här grunderna för servomotor.
Gränssnitts servomotorer med mikrokontroller:
Gränssnittshobby Servomotorer med MCU är väldigt enkelt. Servos har tre ledningar som kommer ut ur dem. Varav två kommer att användas för matning (positiv och negativ) och en kommer att användas för signalen som ska skickas från MCU. I denna handledning kommer vi att använda en MG995 Servomotor av metallväxel som oftast används för RC-bilar humanoida bots etc. Bilden på MG995 visas nedan:
Färgkodningen på din servomotor kan skilja sig åt och kontrollera därför ditt respektive datablad.
Alla servomotorer fungerar direkt med dina + 5V försörjningsskenor men vi måste vara försiktiga med mängden ström som motorn skulle förbruka. Om du planerar att använda mer än två servomotorer ska en korrekt servosköld utformas. I denna handledning använder vi helt enkelt en servomotor för att visa hur vi programmerar vår PIC MCU för att styra motorn. Kontrollera nedanstående länkar för att ansluta servomotor till annan mikrokontroller:
- Servomotor gränssnitt med 8051 mikrokontroller
- Servomotorstyrning med Arduino
- Raspberry Pi Servomotorhandledning
- Servomotor med AVR-mikrokontroller
Programmering av servomotor med PICF877A PIC-mikrokontroller:
Innan vi kan börja programmera för Servomotorn bör vi veta vilken typ av signal som ska skickas för styrning av Servomotorn. Vi bör programmera MCU: n för att skicka PWM-signaler till servomotorns signalkabel. Det finns en styrkrets inuti servomotorn som läser PWM-signalens arbetscykel och placerar servomotorns axel på respektive plats som visas på bilden nedan
Varje servomotor arbetar på olika PWM-frekvenser (den vanligaste frekvensen är 50 Hz som används i denna handledning), så få databladet för din motor för att kontrollera vilken PWM-period din servomotor fungerar.
Detaljerna om PWM-signalen för vår Tower pro MG995 visas nedan.
Av detta kan vi dra slutsatsen att vår motor fungerar med en PWM-period på 20 ms (50Hz). Så frekvensen för vår PWM-signal bör ställas in på 50Hz. Frekvensen av PWM som vi hade ställt in i vår tidigare handledning var 5 KHz, med samma kommer inte att hjälpa oss här.
Men vi har ett problem här. Den PIC16F877A kan inte generera lågfrekventa PWM-signaler med hjälp av CCP-modulen. Enligt databladet är det lägsta möjliga värdet som kan ställas in för PWM-frekvensen 1,2 KHz. Så vi måste släppa idén att använda CCP-modulen och hitta ett sätt att skapa våra egna PWM-signaler.
Därför kommer vi i denna handledning att använda timermodulen för att generera PWM-signaler med 50Hz- frekvens och variera deras arbetscykel för att styra servomotorns ängel. Om du är nybörjare med timers eller ADC med PIC kan du falla tillbaka till den här självstudien, för jag kommer att hoppa över det mesta eftersom vi redan har täckt dem där.
Vi initialiserar vår timer-modul med en förskalare på 32 och låter den rinna ut för varje gång. Enligt vårt datablad bör PWM endast ha en period på 20 ms. Så vår tid och ledighet tillsammans bör vara exakt lika med 20 ms.
OPTION_REG = 0b00000100; // Timer0 med extern freq och 32 som prescaler TMR0 = 251; // Ladda tidsvärdet för 1us delayValue kan vara mellan 0-256 endast TMR0IE = 1; // Aktivera timeravbrottsbit i PIE1-registret GIE = 1; // Aktivera Global Interrupt PEIE = 1; // Aktivera perifer avbrott
Så inuti vår avbrottsrutinfunktion slår vi på stiftet RB0 under den angivna tiden och stänger av den under reaming-tiden (20ms - on_time). Värdet på tiden kan specificeras med hjälp av Potentiometer och ADC-modulen. Avbrottet visas nedan.
oid interrupt timer_isr () {if (TMR0IF == 1) // Timern har överflödat {TMR0 = 252; / * Ladda timervärdet, (Obs: Tidsvärdet är 101 inställt på 100 eftersom TImer0 behöver två instruktionscykler för att börja öka TMR0 * / TMR0IF = 0; // Rensa timeravbrottsflaggräkning ++;} om (räkna> = on_time) { RB0 = 1; // kompletterar värdet för att blinka lysdioderna} om (count> = (on_time + (200-on_time))) {RB0 = 0; count = 0;}}
Inuti vår medan loop vi bara läsa värdet på potentiometer med hjälp av ADC-modulen och uppdatera i tid för PWM hjälp av avläst värde.
medan (1) {pot_value = (ADC_Read (4)) * 0,039; on_time = (170-pot_värde); }
På detta sätt har vi skapat en PWM-signal vars period är 20 ms och har en variabel arbetscykel som kan ställas in med en potentiometer. Komplett kod har angivits nedan i kodavsnittet.
Låt oss nu verifiera utdata med proteus-simulering och gå vidare till vår hårdvara.
Kretsschema:
Om du redan har stött på PWM-självstudierna kommer schemat för denna handledning att vara densamma förutom att vi lägger till en servomotor istället för LED-lampan.
Simulering och hårdvaruinstallation:
Med hjälp av Proteus-simulering kan vi verifiera PWM-signalen med hjälp av ett oscilloskop och även kontrollera servomotorns roterande ängel. Några ögonblicksbilder av simuleringen visas nedan, där servomotorns roterande ängel och PWM-arbetscykel kan märkas för att förändras baserat på potentiometern. Kontrollera vidare hela videon, av rotation vid olika PWM, i slutet.
Som vi kan se blir servorotationsängeln förändrad baserat på potentiometervärdet. Låt oss nu gå vidare till vår hårdvaruinstallation.
I hårdvaruinstallationen har vi precis tagit bort LED-kortet och lagt till Servomotorn som visas i schemat ovan.
Hårdvaran visas på bilden nedan:
Den videon nedan visar hur servomotorn reagerar på de olika positionerna för potentiometer.
Nu räcker det!! Vi har kopplat en servomotor med en PIC Microcontroller, nu kan du använda din egen kreativitet och ta reda på applikationer för detta. Det finns många projekt där ute som använder en servomotor.