Ultrasonic hinder att undvika Robot (11 / 16 steg)
Steg 11: Kontroll och problem av servomotor
Reglerteknik och min genomförande
Hur vet vi hur man styr något? Tittar vi upp dess datablad. Det är precis vad jag gjorde (länge sedan) med denna servo, och fick reda på att jag behövde en 50Hz signal för rörlig tull cykel. Det är lite långsam för en hårdvara PWM modulen som vi är på kort med ändå (vi behöver dem för spår-köra motorerna), servo signalen måste vara lite slog - programvara som genereras.
Att veta detta, beräknat jag en timer för att generera ett avbrott varje 20ms. För denna uppgift använde jag gratis Timer3 modulen av mikrokontroller. Att veta att:
Fosc = 48 [MHz], finner vi att Fosc / 4 = 12 [MHz], och härifrån vi beräkna Tinstruction = 83,33 [ns]
Detta är den tid som behövs för en instruktion att slutföra i PIC och tid-basen för alla interna timern moduler. Vi vet också, att Timer3 är en 16-bitars timer/counter, så det kan räkna till 65535, och svämma över + ge ett avbrott på den nästa inkrement. Vi måste konfigurera den så det ger detta avbrott var 20 [ms]. För detta räknat jag antalet timer steg som behövs för 20 [ms] ska gå:
20 [ms] / 83,33 [ns] = 240096
Detta är ett värde som inte passar i 16-bitars räknare kedjan, så vi kommer att sakta öka hastigheten ner på något sätt: detta är lätt att göra med prescalers. Genom att tilldela en 1:4 prescaler denna timer, vi berättar PIC att öka timern registrera värdet i en takt fyra gånger långsammare än denna inre klocka av 83,33 [ns].
240096 / 4 = 60024
Detta kan översättas till: med greve hastigheten sjönk till 332.33 [ns], timern kommer att behöva vidta 60024 åtgärder tills våra 20 [ms] förflyter. Vi har att utlösa ett avbrott, när detta händer, och när avbrott förekommer? När timern svämmar över. Som sagt, subtrahera vi detta värde från spillområdet värde 65536:
65536 - 60024 = 5512 = 0x1588
Om vi sätter detta till TMR3 counter kedjan varje gång flaggan avbrott blir angetts av händelsen overflow, vi kommer att få en trevlig 20 [ms] avbryta som kan användas för denna servo algoritm.
Nästa, vi måste ta itu med att ändra intermittensen. Detta skulle ha varit mycket lätt att göra om jag hade en jämför modul tillgänglig, men tyvärr jag inte. För att övervinna detta, definieras jag en variabel som jag växlas varje gång ett avbrott kom. Att veta värdet av denna variabel tillät mig att skilja mellan två olika interrrupts: en som utlöste en stigande kant i början av 20 [ms] period, och som utlöste fallande kanten baserat på krävs intermittensen. Eftersom stigande kanten är obligatoriskt, varje gång avbrottet utlöses, en vår variabel är "0", vi skickar i/o pin till hög status. Baserat på krävs på tiden (Låt oss ta 1 [ms] för nu), vi snabbt beräkna en ny timer init räknarvärdet, så timern svämmar över igen efter denna tidsperiod. För 1 [ms] är detta beräkningen följande:
1 [ms] / 333.3 [ns] = 3000
Så satt vi TMR3's counter register till:
TMR3 = 65536-3000 = 62536
och vänta på nästa avbryta. När det uppstår, skickar vi IO pin låg stat och konfigurera TMR3 counter kedjan igen med nummer för 20 [ms]. Vi har att beakta, att 1 [ms] av 20 [ms] redan passerat, så matte kommer att se ut så här för den andra TMR3 uppdateringen:
TMR3 = 5512 + 3000
När vi är klar med detta, vi växla våra variabel igen och vänta på ett avbrott. Detta kommer att utlösa en stigande kant och 20 [ms] börjar period. Då beräknar vi den nya TMR3, och detta går på och så vidare, i en oändlig loop. Genom att titta i databladet jag berättade om tidigare, kan vi hitta den maximala längden av denna plikt cykel, programvara begränsningar kan skrivas till förhindra servo från att slå i ändarna och kämpar för att gå längre (och konsumerar 650mA...).
Servo är feedback är inte så bra alls, så servo kommer att skaka även när det blir samma skyldighet för evigt - detta måste lösas på något sätt. Jag satte en programvara räknare som ökar när 20 [ms] period börjar, och lagt till lite kod som bara tillåter en signal med en viss skyldighet att skickas ett begränsat antal gånger. Efter 20 cykler, jag antar att axeln är på önskad plats, och jag sluta skicka signaler = motorn inte skaka eller buzz.
Problem
Flera problem inträffade tills jag äntligen fick flytta servo på en repeterbar sätt. Jag Använd servomotorer innan utan problem, visste vilken typ av styrsignaler måste tillhandahållas, men bara kunde vända servo då och då, slumpmässigt. På en power-up fungerade det på de kommande fem så inte är fallet. Jag misstänkte inspänning sloka, 5 [V] buck output voltage sloka, och gjorde alla slags tester för att eliminera dem en efter en. Slutligen, efter att ha provat olika batterityper, slutade jag upp att sätta en skrymmande 3300 [uF] kondensator servo pin sidhuvud - och voilá, det slutligen blev mer lydig.
På denna punkt är det bra att byta till ett labb PSU, om tillgänglig
Vad kan du göra för att felsöka i situationer som denna? Om du misstänker, att det finns någon slags överspänningsskydd i din krets, finns det några knep du kan använda för att spåra upp felet. Först, det hjälper mycket om du har ett laboratorium strömförsörjning med nuvarande gräns funktionen, Detta förhindrar spränga saker. Helt enkelt använda batterier (jag försökt med Li-Ion också) är lite farligt eftersom de ger så mycket som de kan, vid en kort, och kommer förmodligen att bränna allt i deras väg.
Test 1.
Här var uppenbart Testserien: kontinuitet tester, tester mot shorts, vanliga saker. Lamporna blinkar, så 5V buck järnväg fick bli OK, fortfarande jag gjorde dessa för att vara säker. Jag också dubbel kollade att styrsignalen verkligen blir till servo gula stift - det gjorde. Dåliga anslutningar teori var trasig.
Test 2.
Det var ett ögonblick när jag trodde att mina batterier helt enkelt inte kan ge tillräckligt med juice att flytta servo. För att bekräfta/byst detta, jag slutade titta på den SG90 parameterlista, och fann att den nuvarande stall är 650 [mA]! Jag trodde, att detta kommer att vara problemet, och batterierna inte kan försäkra samma nuvarande som min PSU - detta behövs ett test.
Jag tog en 1.2 ohm motstånd, och lägga den i serie med robotar negativ input tråd. Mätningen hade vara låg-sida, eftersom omfattning marken sonden och PSU marken var ansluten via jorden. Genom att mäta spänningen över en serie motstånd av känt värde, kan man beräkna den ström som flyter genom den, den aktuella förbrukningen av roboten i detta fall. Jag tog två mätningar, en med Li-Ion batteripack, och en med PSU, kan du se dessa bifogas detta steg. En med spänningen / division 1 [V] är testet med batteriet, den andra med 500 [mV] per division är PSU. Eftersom batteriet hade lägre spänning än inställningen PSU, och DC-DC omvandlare hade att dra extra ström till upprätthålla deras produktion regleras: du kan se en 4 [A] topp!
Detta innebär att batteriet kan ge tillräckligt för hela kretsen till start, inklusive den ursprungliga överbelastning på servo när det börjar vrida skaftet. Denna teori var så trasig också.
Testa 3.
Efter att ha funderat hur länge 5 [V] spår är och hur hög stall är nuvarande av detta servo, insåg jag, att en lokal skrymmande kondensator skulle vara en bra idé. Detta skulle bidra med lokala spontana nuvarande drar. Eftersom detta innebar att borra hål och montering av en ny gemensam jordbrukspolitik, var jag lite emot det. Men när en smart vän kom med detta mycket förslag utan att jag ens nämna denna teori, beslöt jag att bita ihop och ge detta ett försök. Jag tog en hög kvalitet (räddas från ett moderkort) 3300 [uF] / 6.3 [V] kondensator, borrade några hål för det mycket nära servo utdata pin huvudet och lödda sak i. Jag aktiverat makten och det fungerade! Denna teori är bekräftat för att vara sant, och gå igenom med det visat för att arbeta som smort.
Avslutning och efterbehandling denna testserie
När jag såg detta arbetar med Li-Ion batteri, och testet var repeterbara, började jag fundera på hur man montera de enorma batterierna på roboten. Jag försökte att sätta dem på baksidan, men som resulterade i roboten att få obalanserad - så jag bestämd till ger en annan sköt till Ni-MH-batterier, och använda robotar 4 x AA cell hållare för strömkälla. Jag gjorde nödvändiga ändringar, ansluten batterierna, och igen: den arbetat! Problemet löst, och utseendet på bot är allvarligt bättre!