Servomotor-styrning, PID, diverse tester

Robot, CNC, Pneumatik, Hydraulik, mm
JBV
Inlägg: 411
Blev medlem: 4 maj 2006, 11:44:28
Ort: Älvsbyn

Inlägg av JBV »

Har inte en dc motor ett fast förhållande mellan vridmoment och hur många A den drar? oberoende av varvtalet? I sådant fall så bör man ju kunna räkna ut verkligt utnyttjat vridmoment väldigt exakt!?

Bestämmer inte loopen bara hur många V man skickar på motorn? Kan uppenbarligen för lite om sånt här :D Allt man "vet" är från surfande hehe
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

Jag har 2st H-bryggor, den ena driver med PWM (spänning) och den andra driver med ström.
Jag har ännu bara använt ström-bryggan i pid-testerna.

Ja, du har rätt och jag ska fundera mer på det.
Det man isf gör är att använda både spänningen och strömmen i beräkningen, i mitt fall har jag bara tillgång till strömmen och då kan man nog bara göra som jag har gjort.
Tack för att du delar med dig av dina funderingar JBV!
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

Då var det dags igen.

Nu har jag skippat allt konstigt och kör bara med P+I+D men positionen som allt baseras på är medelvärdet av 64 avläsningar från encodern, dvs positionen blir en halv PID-loop gammal men jag får några decimalbitar på köpet.
PID-loopen går i 2000Hz och encodern läses av 128000 gr/sekund.

Integratorn har fått en gräns så att värdet inte kan bli för stort, jag har även en gräns för hur snabbt värdet får ändras.

En annan förändring är att istället för att rörelsemönstret beskrivs i form av fartvärden och tid så har jag valt att ange acceleration och tid, vilket eliminerar omöjliga accelerationer (så länge man håller sig innom motorns kapacitet).

Rörelsemönstret i exemplet innehåller en mjuk acceleration och inbromsning, 8st snabba positioneringar(på 0.5sek totalt), mjuk acceleration och inbromsning lika som den första men åt andra hållet.

Det som är riktigt intressant är att positions-felet(den svarta linjen) i den mjuka accelerationen ger ett fel på 2 servosteg i början, därefter ligger motorn på exakt rätt steg hela vägen tills den ska sluta accelerera, där får den 1steg fel.
Man kan även bromsa motorn lite utan att resultatet försämras.
Hela servo-regleringen bygger på att man kompenserar för felet och i mitt exempel har jag ju 0 i fel under långa tider ändå kompenseras det korrekt så mina simulerade decimaler gör verkligen nytta.

I mittenfältet ser man dom 8 snabba positioneringarna, det ser inte lika lysande ut och egentligen sämre ut än tidigare tester med lite släng av självsvängning och ganska stort fel.
Jag tror att en sak som försvårar det hela är att rörelsemönstret är accelererande vilket gör att PID'en inte får ett "stillastående mål".
Så nästa steg är att skapa strömmen till motorn baserat på Börpositionen så att den teoretiskt ska följa banan även utan encoder och strömmen ska kompenseras med hur mycket fel motorn står.
Jag är övertygad om att resultatet kommer bli exteremt bra.

Det ser lite grötigt ut men zoomar man ser allt mycket tydligare ut.
http://ake.myftp.org/forum/ServoTest8_A ... ugnPID.gif

Utan rörelsemönster med extern påverkan, ser fantastiskt bra ut.
Dom simulerade decimalerna gör ingen nytta när motorn står stilla så när man försöker vrida motoraxeln känner man tydligt när den vridits ett steg och axeln börjar vibrera och kämpa emot men det är så lite att en cnc-maskin inte skulle påverkas av det.
Kontrollern kan bara skicka 1 parameter åt gången så dessa 2 kurvor härstammar inte från samma tid.
http://ake.myftp.org/forum/ServoTest8_A ... _Kraft.gif
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

Nu har jag testat att basera motor-strömmen på börpositionens acceleration + en PID-kontroller baserat på positions-felet.
Det fungerar riktigt bra med tanke på att jag bara har gissat parametrarna och räknar allt linjärt vilket det inte är i verkligheten.
Jag blir lite sugen på att analysera motorns exakta egenskaper och skapa en beräkning för det.

Först obelastad motor.
Lägg märke till att felet är 0 nästan hela tiden under dom lugna delarna.
Man ser tydligt att integratorn inte behöver jobba lika mycket som i ServoTest8.
http://ake.myftp.org/forum/ServoTest9_A ... yrning.gif

Och bromsad motor:
Maxfelet är faktiskt lite mindre än utan belastning.
http://ake.myftp.org/forum/ServoTest9_A ... Ext_Kr.gif
Användarvisningsbild
arvidb
Inlägg: 4537
Blev medlem: 8 maj 2004, 12:56:24
Ort: Stockholm

Inlägg av arvidb »

... ville bara säga att jag läser dina inlägg här med intresse, även om jag inte har så mycket att komma med själv.

Jag fick tipset av en duktigt mattekunnig kille på KTH att interpolera positionsavläsningarna från encodern med Richardsoninterpolering för att få decimaler och vettiga avläsningar även mellan encoderticks, och även vettiga uppskattningar av hastighet.

Arvid
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

Jag sökte på Richardson extrapolering men fick inga vettiga träffar.
Var kan man hitta info om den metoden?
Användarvisningsbild
arvidb
Inlägg: 4537
Blev medlem: 8 maj 2004, 12:56:24
Ort: Stockholm

Inlägg av arvidb »

Google

Engelska var bättre än svenska. Tyvärr har jag inte satt mig in i metoden själv, så jag kan inte riktigt bedöma länkarna. Wikipedia-träffen verkar ingående, och längre ner på första träffsidan finns en länk till en sida med matlab-kod för att göra Richardsonextrapolering.

Jag tror iaf att det i princip handlar om att försöka anpassa en kurva till de senast n avlästa data, och sedan räkna ut ett bättre värde m h a den kurvan.

Arvid
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

Tack arvidb, jag ska studera metoden senare men nu har jag lite andra bekymmer.

Jag har börjat titta på hur motorn accelererar och upptäckte att jag har en "accelerations-lucka" pga att motorn blir kortsluten när den snurrar fritt.
Problemet med luckan är att det i vissa fall inte finns något ström-värde som kan ge korrekt acceleration.
Dom olika bladen i Excel-dokumentet visar acceleration med olika ström-värden(bladen är märkta med värdet).
Det set ok ut från -50 till -120.
Från -2 till -40 finns en "fjång" på kurvan som inte hör hemma där.
Luckan syns mellan 0 och -2, vid 0 har H-bryggan bytt polaritet och egenskaperna ändras radikalt.
Från 0 till 12 ser ok ut (2-12 har ett annat diagram-område).
Varvtal 13000 är c:a 1500 rpm.
http://ake.myftp.org/forum/Motor_Acceleration1.rar
[EDIT] Länken var fel

H-bryggan funkar så att dom övre Fetarna väljer polaritet och dom undre regleras så att strömmen genom motorn blir korrekt.

Om Q1 och Q4 leder så får motorn en +spänning på vänster sida.
När motorn har kommit upp i varv stänger jag Fetarna och öppnar endast Q2 vilket inte ska påverka motorn men problemet är att motorn bromsar kraftigare än den borde.
Motorn blir en strömkälla med + till vänster och - till höger så att strömmen kan gå från Q2 genom motorn och ut genom D1, motorn är nästan helt kortsluten.

Samma sak händer om man använder dom nedre Fetarna för polaritet och reglerar dom övre men då går strömmen från D4 genom motorn och ut genom Q3.

Finns det något sätt att undvika att strömmen tar vägen genom skyddsdioderna när motorn fungerar som generator?

Bild
Senast redigerad av Chribbe76 7 juni 2006, 12:09:45, redigerad totalt 1 gång.
Användarvisningsbild
EagleSpirit
Inlägg: 1288
Blev medlem: 27 maj 2003, 23:15:48
Ort: Västerås
Kontakt:

Inlägg av EagleSpirit »

I våra robotsystem jag jobbar med finns det något som heter bleeder-resistor som bränner bort överflödig energi när roboten bromsar. Vet dock inte riktigt hur det fungerar. Eller det kanske inte är det du är ute efter?
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

Kan det vara så att roboten låter den bromsande kraften ladda upp kondensatorerna i nätagget men bara till en viss gräns, när det "rinner över" får överskottet brännas bort i ett motstånd.
Det har nog inget med mitt problem att göra iaf.

Jag har funderat i flera dagar nu och kom på en enkel lösning.
Tiden är knapp (jag ska till jobbet) så jag visar bara resultatet.
Blad 10 till -10 är uppdaterade med nya värden, ser mycket bättre ut.

[EDIT] Hela excel-dokumentet är uppdaterat med nya värden

http://ake.myftp.org/forum/Motor_Acceleration2.rar

Jag ser nu att jag har skrivit fel i länken i mitt förra inlägg, det funkade konstigt nog hemifrån men inte från jobbet så jag antar att ingen av er har tittat på excel-dokumentet för då borde någon ha kommenterat felet, jag ändrar så det blir rätt nu.
Senast redigerad av Chribbe76 9 juni 2006, 18:00:23, redigerad totalt 1 gång.
Användarvisningsbild
arvidb
Inlägg: 4537
Blev medlem: 8 maj 2004, 12:56:24
Ort: Stockholm

Inlägg av arvidb »

Det vore intressant att se hur du löste det, så återkom gärna med nytt schema sen när du har tid.

Arvid
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

Så här ser min lösning ut.
Kondingen ska sluka höga spänningar som skapas av motorn.
Dioderna förhindrar att strömmen som genereras av motorn går genom dom övre fetarnas inbyggda dioder och kortsluter motorn som jag beskrev tidigare.
Jag vet ännu inte om det får några bi-effekter men det borde gå bra.

Om man använder pwm är nog det här schemat inte så lyckat.
Anledningen till att jag kör linjär-reglering är att jag vill få så jämn ström som möjligt i testerna, när testerna är klara ska jag byta till någon form av chopper-drivning tror jag.

Bild
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

Ett steg närmare perfekt reglering (dock ganska långt kvar).
Samma som tidigare men motorströmmen som räknas ut genom börpositionen baseras på 3st PID-loopar framåt i tiden (3 är för mycket men resultatet blev bättre än med 2).
Anledningen är trögheten i motorström -> Acceleration, jag vet inte riktigt vad det beror på, induktansen borde inte vara någon faktor för opamp'en lyckas reglera till rätt ström på c:a 150 µsekunder.
Det man borde göra är att kompensera för det genom att ge motorn ett högre strömvärde i början av accelerationen och basera det på kanske 1 PID-loop framåt i tiden istället för 3.

Strömvärdet får jag fram genom Accelerationen*0.25 (ett mer korrekt värde är 0.23 men jag orkade inte lägga in en multiplikation) + eller - 23 beroende på åt vilket håll motorn snurrar (värdet 23 motvarar friktionen).

En annan faktor man borde kompensera för är tidsfördröjningen från anläsning av enkoder till att motorn har fått sitt nya ström-värde.
Tidsfördröjning i systemet påverkar mer ju hårdare kontrollern är trimmad.
Jag vet inte riktigt hur man kan göra en sådan kompensering och hur mycket bättre det blir av det.

Jag hade ett litet fel i programmet som ritar ut Error så att både 0 och -1 låg på 0, det förskönade resutatet lite så i det här exemplet är det korrekt (det ser bara lite sämre ut än tidigare).

För att ni ska få en uppfattning om hur motorn vrider sig så är en pixel i den gröna kurvan = 16 servosteg.

Jag har uppdaterat hela excel-dokumentet Motor_Acceleration2 med värden från den nya H-brygga-kopplingen.

http://ake.myftp.org/forum/ServoTest10_ ... yrning.gif
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

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.

Bild


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
Användarvisningsbild
arvidb
Inlägg: 4537
Blev medlem: 8 maj 2004, 12:56:24
Ort: Stockholm

Inlägg av arvidb »

"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"

Hmm, borde det inte vara abs(BörAccelerationen) =/>/< 0 här?

Coolt med den friktionslösa motorn! :) Jag sprang på samma fenomen när jag lekte med mina servomotorer tidigare, och det tog ett tag innan jag kom på vad som hände. Trodde nåt hade blivit rejält fel först. :D

Arvid
Skriv svar