
Jag exprimenterar med att styra en servomotor.
Syftet är att få bättre kunskap om motordynamik och PID-reglering.
Servomotorn jag använder kommer från en plotter och har en upplösning på 4000steg/varv, det är en vanlig dc-motor.
Mycket av det jag skriver är min uppfattning och inte nödvändigtvis 100% korrekt.
När man ska servostyra en motor kan man antingen låta regler-algoritmen styra spänningen(dutycycle om man kör PWM) eller styra strömmen.
Skillnaden är väldigt stor.
Om man räknar bort friktion och effektförluster så agerar en elmotor så här:
Styra med spänning: Motorn accelererar väldigt snabbt och drar mycket ström i början och når det varvtal som motsvarar spänningen på i princip samma tid oavsett vilken spänning man lägger över motorn, när motorn har nått rätt varvtal drar den ingen ström alls.
Styra med ström(strömmen = kraften): Motorn accelererar linjärt hela tiden och kommer efter oändligt lång tid att snurra oändligt snabbt, ingen ström betyder att motorn kommer forsätta snurra med nuvarande varvtal.
En fördel med att styra med spänning är att motorn i realtid drar mer ström om man bromsar den så regler-algoritmen får lite hjälp av elektroniken.
En fördel med att styra med ström är att förhållandet mellan strömmen och hur motorn agerar är enklare att definiera och är "linjärare".
I min testrigg har jag en H-brygga för PWM till vänster på plattan och en H-brygga för konstant ström (linjär reglering med en opamp därav kylfläns+fläkt) till höger på plattan.
http://ake.myftp.org/forum/Servomotor_labbplatta.jpg
här följer några varvtals-tester med PWM, varje sträck är 200rpm och tidsaxel-strecken är 0.1sek.
Vi ser att inbromsningen med 0% duty är praktiskt taget linjär ända ner till 0 men om jag polvänder H-bryggan med 0% duty så bromsar motorn mer och inte helt linjärt.
http://ake.myftp.org/forum/ServoHastighetskurva01.gif
http://ake.myftp.org/forum/ServoHastighetskurva01.txt
Med accelerationen som uppstår här smäller det till ordentligt i motorn, 40% ger 2500rpm.
http://ake.myftp.org/forum/ServoHastighetskurva02.gif
http://ake.myftp.org/forum/ServoHastighetskurva02.txt
Här ser vi att retardationen är i princip lika stor oavsett hur mycket man minskar dutycycle, logiskt men ändå intressant.
http://ake.myftp.org/forum/ServoHastighetskurva03.gif
http://ake.myftp.org/forum/ServoHastighetskurva03.txt
Motorn bromsar väldigt kraftigt även med en så låg duty som 8%.
http://ake.myftp.org/forum/ServoHastighetskurva04.gif
http://ake.myftp.org/forum/ServoHastighetskurva04.txt
Hyffsat linjärt och förutsäjbart över 200rpm.
http://ake.myftp.org/forum/ServoHastighetskurva05.gif
http://ake.myftp.org/forum/ServoHastighetskurva05.txt
Ökning med 0.8%-enheter varje 0.1sek.
http://ake.myftp.org/forum/ServoHastighetskurva06.gif
http://ake.myftp.org/forum/ServoHastighetskurva06.txt
Det är lite svajigt med konstant spänning, ett svaj är ett varv på motorn.
http://ake.myftp.org/forum/ServoHastighetskurva07.gif
Med konstant ström från labbagget blir det mycket stabilare.
http://ake.myftp.org/forum/ServoHastighetskurva08.gif
Konstant ström med H-bryggan, ser bra ut.
http://ake.myftp.org/forum/ServoHastighetskurva09.gif
Här styr jag med ström, skillnaden mot att styra med spänning är stor.
http://ake.myftp.org/forum/ServoHastighetskurva10.gif
http://ake.myftp.org/forum/ServoHastighetskurva10.txt
http://ake.myftp.org/forum/ServoHastighetskurva11.gif
http://ake.myftp.org/forum/ServoHastighetskurva11.txt
Jag har implementerat en PID-kontroller i en Pic18F4520 för att styra motorns position.
Ett program i VB skickar Hastighets-info till Picen via RS232 och Picen skickar tillbaka 1 valbar parameter varje PID-loop till datorn som ritas ut på skärmen.
Man kan även ändra PID-parametrarna från programmet.
Testförloppet är 1.5sek, Pid-loopen går på 2000Hz, det ritas ut i 3 rader där varje rad är 1000 pixlar.
Jag använder en enkel PID-algoritm som ser ut så här:
Kod: Markera allt
P=2.625
I=0.0488
D=15.75
Felet = BörPos - ÄrPos
Integrator = Integrator + Felet
Derivata = Felet - FörraFelet
FörraFelet = Felet
Resultat = Felet * P + Integrator * I - Derivata * D ;Resultat (+-255) styr motor-strömmen direkt utan någon anpassning.
Om jag ökar integratorn måste jag även öka P och D för att det ska funka men motorn låter mer och blir mycket oroligare.
Det jag tror att jag ska testa är en smartare integrator.
Positionen kommer från motorns encoder men upplösningen är för låg på skärmen för att man ska se positions-avvikelserna.
http://ake.myftp.org/forum/ServoTest1_Pos.gif
En pixel = ett servosteg fel
http://ake.myftp.org/forum/ServoTest1_Err.gif
PID-summan styr motor-strömmen, max ström = 1A.
http://ake.myftp.org/forum/ServoTest1_PIDsum.gif
Filmen är egentligen meningslös för man ser inte hur motorn snurrar.
http://ake.myftp.org/forum/Servomotor1.MOV
En fråga till er som kan det här med servostyrning, I mitt test får jag ett max fel på c:a +-20 servosteg vid acceleration.
Om jag bråkar med motorn får jag lätt ett fel på +-40 servosteg.
Frågan som är väldigt subjektiv lyder: hur många steg fel är rimligt med en vältrimmad lite mer avancerad regleralgoritm?
Fortsättning följer.....