Jag hade räknat lite fel i Servotest10 (0.23 i tidigare inlägg skulle vara 0.41) så nu med korrekta parametrar blir resultatet otroligt bra.
En liten sammanfattning om hur det hela fungerar:
Ärpositionen i systemet baseras på medelvärdet av 64 enkoder-avläsningar i varje reglerloop för att få decimaler.
Medelvärdet hjälper inte i riktigt låga hastigheter så metoden är inte klockren och kräver dessutom mycket CPU-kraft.
Strömvärdet (-255 -> +255) till motorn bestäms av BörStyrning + FriktionsKomp + PidP + PidI + PidD.
Börstyrningen:
Strömmen är linjär(nästan exakt iaf) med kraften ,kraften är linjär med accelerationen om man bortser från friktionen.
Alltså blir Börstyrning = Acceleration * 0.41(i mitt fall) , Accelerationen är Börpos - Föregående Börpos.
Börstyrningen ska påverka strömmen tidigare (i mitt fall c:a 2-3 reglerloopar tidigare) än PID'en eftersom det finns en delay från nytt ström-värde till att PID'en kan se effekten av det.
Friktionskomp:
Den utgår ifrån att man har en konstant friktion i systemet (den förändras dock lite av hastigheten).
För att definiera friktionen har jag tittat på Excel-dok. Motor_Acceleration2.
Den mörkblåa linjen är hastigheten och den gula linjen är accelerationen, Ljusblåa strecket är hastighet 0, strömvärdet till motorn är konstant.
Utan friktion skulle gul vara en rak horizontell linje.
Röd linje är en förenklad definition av friktionen.
Som ni ser får motorn hjälp av friktionen när den ska minska farten och blir motarbetad av friktionen när den ska öka farten.
Jag ville göra det så korrekt som möjligt så jag valde att definiera som i det översta alt. men det visar sig i princip onödigt, det blir lika bra eller ibland bättre av alt. längst ner.
Vill man använda alt. i mitten så är det egentligen mer korrekt än alt. längst ner men skillnaden är inte märkbar.
Alt. längst ner blir alltså:
If BörHastigheten = 0 Then FriktionsKomp = 0
If BörHastigheten > 0 Then FriktionsKomp = 23
If BörHastigheten < 0 Then FriktionsKomp = -23
Observera att jag använder BörHastigheten och inte ÄrHastigheten, dessa kommer vara lika men BörH. har inget brus i låga farter.
Ett roligt test av F.komp är att köra motorn utan BörStyrning och PID vilket gör motorn friktionslös, då måste man givetvis basera F.komp på ÄrHastigheten (Alt. i mitten gav bäst resultat).
Så här ser det ut.
http://ake.myftp.org/forum/Snurrande_Mo ... iktion.MOV
PID'en ser ut så här:
P=6.25
I=1
D=55
Felet = BörPos - ÄrPos
FörraFelet = Felet
FeletI = Felet
If FeletI < -4 then FeletI = -4 ;Begränsar hur snabbt Integrator kan ändra värde
If FeletI > 4 then FeletI = 4
Integrator = Integrator + FeletI
IF Integrator > 255 then Integrator = 255
IF Integrator < -255 then Integrator = -255
PidP = Felet * P
PidI = Integrator * I
PidD = (Felet - FörraFelet) * D
Obelastad, Maxfelet är så lite som 1 servosteg men det ligger på gränsen till att bli 2 steg fel på vissa ställen.
http://ake.myftp.org/forum/ServoTest11_ ... yrning.gif
Bromsad, det ser väldigt bra ut med tanke på hur extrem rörelsen är.
http://ake.myftp.org/forum/ServoTest11_ ... _kraft.gif