asuro_oli
28.02.2007, 20:45
Hallo Zusammen!
Ich bin zur Zeit dabei, eine Geschwindigkeitsregelung für meinen ASURO zu programmieren. Ich habe mir überlegt einen PI-Regler dafür zu verwenden. Den Istwert der Geschwindigkeit berechne ich aus dem Zeitabstand von 2 schwarz-weiß Wechseln am Odometriesensor (ich benutze die Sensorscheiben mit jeweils 4 schwarzen und 4 weißen Feldern). Mein derzeitiges Programm für die Regelung funktioniert noch nicht wirklich gut. Hier ist einmal der derzeitige Stand:
/************************************************** *******************
**
** Geschwindigkeitsregelung mit PI-Regler
**
************************************************** *******************/
#include "asuro.h"
#include <stdlib.h>
volatile unsigned char count36kHz;
volatile unsigned long timebase;
unsigned long takte;
float w, x, e, y, kp, ki, ta, esum[2];
unsigned char speedLeft, speedRight;
unsigned long zeit[2];
void ReglerLinks(void)
{
takte = (timebase*256) + count36kHz - zeit[0]; //Anzahl der Takte zwischen 2 sw-Wechsel
zeit[0] = (timebase*256) + count36kHz;
x = 104615.0/(float)takte; //Berechnung der aktuellen Geschwindigkeit in mm/s, Wert 104615 durch Rechnungen ermittelt
e = w - x;
esum[0] = esum[0] + e;
y = kp*e + ki*ta*esum[0]; //Berechnung der Stellgröße
if(y<0) y = 0;
if(y>255) y = 255;
speedLeft = (int)y;
MotorSpeed(speedLeft,speedRight);
}
void ReglerRechts(void)
{
takte = (timebase*256) + count36kHz - zeit[1]; //Anzahl der Takte zwischen 2 sw-Wechsel
zeit[1] = (timebase*256) + count36kHz;
x = 104615/(float)takte; //Berechnung der aktuellen Geschwindigkeit, Wert 104615 durch Rechnungen ermittelt
e = w - x;
esum[1] = esum[1] + e;
y = kp*e + ki*ta*esum[1]; //Berechnung der Stellgröße
if(y<0) y = 0;
if(y>255) y = 255;
speedRight = (int)y;
MotorSpeed(speedLeft,speedRight);
}
int main (void)
{
unsigned int daten[2];
unsigned char flagl, flagr;
Init();
MotorDir(FWD,FWD);
MotorSpeed(200,200);
kp = 5.0; //Verstärkungswert für Proportionalkomponente
ki = 100.0; //Verstärkungswert für Integralkomponente
ta = 0.001; //Abtastzeit
w = 350.0; //Sollwert der Geschwindigkeit in mm/s
OdometrieData(daten);
OdometrieData(daten);
if(daten[0]>600) flagl = TRUE;
else flagl = FALSE;
if(daten[1]>600) flagr = TRUE;
else flagr = FALSE;
zeit[0] = (timebase*256) + count36kHz;
zeit[1] = (timebase*256) + count36kHz;
while(1)
{
OdometrieData(daten);
if(daten[0]<600 && flagl==TRUE)
{
flagl = FALSE;
ReglerLinks();
}
if(daten[0]>600 && flagl==FALSE)
{
flagl = TRUE;
ReglerLinks();
}
if(daten[1]<600 && flagr==TRUE)
{
flagr = FALSE;
ReglerRechts();
}
if(daten[1]>600 && flagr==FALSE)
{
flagr = TRUE;
ReglerRechts();
}
}
return 0;
}
Ich habe mit Regelungstechnik noch nicht ganz soviel praktische Erfahrung. Ist ein Programm in der Art überhaupt prinzipiell möglich? Ein großes Problem ist für mich das Festlegen der Reglerparameter. Wie kann ich die Reglerparameter am besten bestimmen?
Für Berichtigungen, Hilfe und Verbesserungsvorschläge wäre ich sehr dankbar. Vielleicht haben von euch ja auch schon einige eine Geschwindigkeitsregelung für den ASURO programmiert. Vielleicht könntet ihr euren Quellcode dafür ja auch hier zur Verfügung stellen.
Danke schonmal im voraus!
Schöne Grüße, Oli
Ich bin zur Zeit dabei, eine Geschwindigkeitsregelung für meinen ASURO zu programmieren. Ich habe mir überlegt einen PI-Regler dafür zu verwenden. Den Istwert der Geschwindigkeit berechne ich aus dem Zeitabstand von 2 schwarz-weiß Wechseln am Odometriesensor (ich benutze die Sensorscheiben mit jeweils 4 schwarzen und 4 weißen Feldern). Mein derzeitiges Programm für die Regelung funktioniert noch nicht wirklich gut. Hier ist einmal der derzeitige Stand:
/************************************************** *******************
**
** Geschwindigkeitsregelung mit PI-Regler
**
************************************************** *******************/
#include "asuro.h"
#include <stdlib.h>
volatile unsigned char count36kHz;
volatile unsigned long timebase;
unsigned long takte;
float w, x, e, y, kp, ki, ta, esum[2];
unsigned char speedLeft, speedRight;
unsigned long zeit[2];
void ReglerLinks(void)
{
takte = (timebase*256) + count36kHz - zeit[0]; //Anzahl der Takte zwischen 2 sw-Wechsel
zeit[0] = (timebase*256) + count36kHz;
x = 104615.0/(float)takte; //Berechnung der aktuellen Geschwindigkeit in mm/s, Wert 104615 durch Rechnungen ermittelt
e = w - x;
esum[0] = esum[0] + e;
y = kp*e + ki*ta*esum[0]; //Berechnung der Stellgröße
if(y<0) y = 0;
if(y>255) y = 255;
speedLeft = (int)y;
MotorSpeed(speedLeft,speedRight);
}
void ReglerRechts(void)
{
takte = (timebase*256) + count36kHz - zeit[1]; //Anzahl der Takte zwischen 2 sw-Wechsel
zeit[1] = (timebase*256) + count36kHz;
x = 104615/(float)takte; //Berechnung der aktuellen Geschwindigkeit, Wert 104615 durch Rechnungen ermittelt
e = w - x;
esum[1] = esum[1] + e;
y = kp*e + ki*ta*esum[1]; //Berechnung der Stellgröße
if(y<0) y = 0;
if(y>255) y = 255;
speedRight = (int)y;
MotorSpeed(speedLeft,speedRight);
}
int main (void)
{
unsigned int daten[2];
unsigned char flagl, flagr;
Init();
MotorDir(FWD,FWD);
MotorSpeed(200,200);
kp = 5.0; //Verstärkungswert für Proportionalkomponente
ki = 100.0; //Verstärkungswert für Integralkomponente
ta = 0.001; //Abtastzeit
w = 350.0; //Sollwert der Geschwindigkeit in mm/s
OdometrieData(daten);
OdometrieData(daten);
if(daten[0]>600) flagl = TRUE;
else flagl = FALSE;
if(daten[1]>600) flagr = TRUE;
else flagr = FALSE;
zeit[0] = (timebase*256) + count36kHz;
zeit[1] = (timebase*256) + count36kHz;
while(1)
{
OdometrieData(daten);
if(daten[0]<600 && flagl==TRUE)
{
flagl = FALSE;
ReglerLinks();
}
if(daten[0]>600 && flagl==FALSE)
{
flagl = TRUE;
ReglerLinks();
}
if(daten[1]<600 && flagr==TRUE)
{
flagr = FALSE;
ReglerRechts();
}
if(daten[1]>600 && flagr==FALSE)
{
flagr = TRUE;
ReglerRechts();
}
}
return 0;
}
Ich habe mit Regelungstechnik noch nicht ganz soviel praktische Erfahrung. Ist ein Programm in der Art überhaupt prinzipiell möglich? Ein großes Problem ist für mich das Festlegen der Reglerparameter. Wie kann ich die Reglerparameter am besten bestimmen?
Für Berichtigungen, Hilfe und Verbesserungsvorschläge wäre ich sehr dankbar. Vielleicht haben von euch ja auch schon einige eine Geschwindigkeitsregelung für den ASURO programmiert. Vielleicht könntet ihr euren Quellcode dafür ja auch hier zur Verfügung stellen.
Danke schonmal im voraus!
Schöne Grüße, Oli