Jag behöver hjälp med att realisera en PID-reglering för en DC motor i C.
Sedan kommer koden att implimenteras i en större kod för att styra motorn med en AVR Atmega32.
Vet någon om hur man skriver PID-funktionen (formeln) i C (Se länken här för formel)?
Någon här ute på nätet har säkert gjort det! :rolleyes:
sum = 0;
lastE = y-r;
while(1)
{
e = y-r;
sum += e;
u = Kp*e;
u += Ki * sum:
u += Kd * (e-lastE)/h;
lastE = e;
delay(h);
}
Med:
e = felet
r = börvärdet
y = mätning
u = styrsignal
Vill du ha lite anti-windup på din I-verkan så kan du väl multiplicera summan av felet med 0.99 eller nåt liknande i varje iteration lite beroende på hur stort h är. Välj datatyper utefter vad atmegan klarar av.
Jag har laborerat i höst med just servostyrning av små borstlösa motorer med ATMega48. Just PID regulatorn är ganska trivial att koda, det svåra är att beräkna parametrarna. Det är nog lättare att prova ut dem!
Om man inte behöver stor servobandbredd, så är det enkelt att få det att fungera, men vill man komma upp i över 100Hz så dyker det upp svårigheter.
1. Det behövs bra givare. Lågt brus och korrekt överföringsfunktion.
Jag har använd kodskivor med hål. Det gäller då att balansera bort så många övertoner som möjligt i överföringsfunktionen som skall vara sinusformad. Det går med rätt val av lysdioder och fotodioder, men kräver tankearbete.
2. 10 bitars AD-omvandlare räcker inte till.
Här har jag med framgång provat att sätta derivatorn utanför processorn och på det sättet få en tystare och jämnare gång. Detta kräver ytterligare två AD-kanaler.
3. Antalet bitar i PWM-genereringen räcker inte riktigt till ens vid 20MHz klockfrekvens. Det går att förbättra med 'tidsinterfoliering', dvs olika PWM-styrvärden i olika tidsintervall.
Problemen yttrar sig så att motorn surrar och får en vibrerande gång.
Men, om det räcker med 10 Hz i servobandbredd så är som sagt inga fundamentala problem. Då gäller det bara att få koden och hårdvaran att fungera.
När hårdvaran börjar sätta stopp så kan det hända att man kan få betydligt bättre resultat om man kastar ut PID-regleringen och testar med LQG istället. Kräver lite bättre kunskap om vad det är man ska reglera, men å andra sidan kan man få riktigt schyssta resultat med crappy sensorer/ad/pwm.
LQG kan lätt bli för tungt för en liten AVR. Vanlig tillståndsåterkopplign däremot! Fast då är vi tillbaks till att analytiskt ta fram parametrar, precis som man bör göra för PID, eftersom PID kan ses som en tillståndsåterkoppling med avseende på reglerfelet, dess derivata och integral.
Det tyngsta jobbet är förmodligen att modellera upp processen som skall regleras. Är det bara DC-motorn som skall varvtalsregleras finns allt du behöver i databladet, men sitter det fast någonting på axeln kan det bli jobbigare.
Vill du ha hjälp med modellen så får du berätta lite mer om den. Alternativt om du har en bra modell så kanske vi kan leda dig på rätt väg hur du bestämmer parametrarna.
Annars kan jag rekommendera boken Reglerteknikens Grunder av Bengt Lennartson Den går igenom det mesta vad gäller PID-reglering och lite grundläggande modellering av processer också. Har till och med för mig att det finns något stycke om implementering av PID-regulatorer.