Hallo Henk,
deine Analyse von meinem Programm ist richtig. Ich habe auch noch eine Variante des Programms, da wird die Variable speed anstatt um eins zu erniedrigen gleich auf 0 gesetzt. Man braucht dann nicht mehr den Grenzwert von 0 zu überprüfen und das Programm ist dadurch kürzer.
Ich habe in meinem Archiv auch noch ein Programm mit Geschwindigkeitsregelung gefunden. Das Programm habe ich mal ins Codefenster kopiert, ohne es nochmal zu prüfen. Es sollte eigentlich funktionieren. Leider hat es wenig Kommentare, aber dafür ist der Lerneffekt beim Analysieren größer.
Gruß Waste
Code:
/*******************************************************************************
*
* Description: Geschwindigkeitsregelung
*
*****************************************************************************/
#include "asuro.h"
#include <stdlib.h>
volatile unsigned char count36kHz;
volatile unsigned long timebase;
unsigned int takte;
int w, x, e, y, kp, ki, esum[2];
unsigned char speedLeft,speedRight;
unsigned long zeit[2];
void ReglerL (void)
{
takte = (timebase*256)+count36kHz - zeit[0];
zeit[0]=(timebase*256)+count36kHz;
x = 27000/takte;
e = w - x;
esum[0] = esum[0] + e;
if (esum[0] < -130) {esum[0] = -130;}
if (esum[0] > 130) {esum[0] = 130;}
y = kp*e + ki*esum[0];
if (y < 0) {y = 0;}
if (y > 255) {y = 255;}
speedLeft = y;
MotorSpeed(speedLeft,speedRight);
}
void ReglerR (void)
{
takte = (timebase*256)+count36kHz - zeit[1];
zeit[1]=(timebase*256)+count36kHz;
x = 27000/takte;
e = w - x;
esum[1] = esum[1] + e;
if (esum[1] < -130) {esum[1] = -130;}
if (esum[1] > 130) {esum[1] = 130;}
y = kp*e + ki*esum[1];
if (y < 0) {y = 0;}
if (y > 255) {y = 255;}
speedRight = y;
MotorSpeed(speedLeft,speedRight);
}
int main(void)
{
unsigned char flagl, flagr, sw;
unsigned int data[2];
Init();
MotorDir(FWD,FWD);
MotorSpeed(150,150);
kp = 18; ki = 2; //ki enthält bereits Multiplikation mal dt=0.01
w = 75;
sw = PollSwitch();
if (sw & 0x01)
{w=5;}
if (sw & 0x02)
{w = 10;}
if (sw & 0x04)
w = 20;
if (sw & 0x08)
w = 40;
if (sw & 0x10)
w = 75;
if (sw & 0x20)
w = 150;
OdometrieData(data);
OdometrieData(data);
if (data[0] > 600) flagl = TRUE; // Flag setzen
else flagl = FALSE;
if (data[1] > 600) flagr = TRUE; // Flag setzen
else flagr = FALSE;
zeit[0]=(timebase*256)+count36kHz;
zeit[1]=(timebase*256)+count36kHz;
while(1){
OdometrieData(data); // messe Odometrie
if ((data[0] < 550) && (flagl == TRUE)) {flagl = FALSE; ReglerL();}
if ((data[0] > 650) && (flagl == FALSE)) {flagl = TRUE; ReglerL();}
if ((data[1] < 550) && (flagr == TRUE)) {flagr = FALSE; ReglerR();}
if ((data[1] > 650) && (flagr == FALSE)) {flagr = TRUE; ReglerR();}
}
return 0;
}
Lesezeichen