irobot.c

gehe zur Dokumentation dieser Datei
00001 
00002 /*******************************************************************************
00003 *
00004 * Description: Asuro Linienverfolgung mit PID-Regler
00005 * Version 1: Korrektur auf beide Motoren verteilt
00006 * Author: Waste   26.8.05
00007 *
00008 * Version 2: initialization of parameters in Main, measurement with LED off in Main
00009 * Author: irobot22587 11.03.2007
00010 *
00011 *****************************************************************************/
00012 #include <asuro.h>         // ver 2.70
00013 
00014 unsigned char speed;
00015 int speedLeft,speedRight;
00016 unsigned int lineData[2];
00017 int x, xalt, don, doff, kp, kd, ki, yp, yd, yi, drest, y, y2, isum;
00018 
00019 void FollowLine (void)
00020 {
00021 unsigned char leftDir = FWD, rightDir = FWD;
00022    LineData(lineData);                  // Messung mit LED ON
00023    don = (lineData[0] - lineData[1]);   
00024    x = don - doff;                  // Regelabweichung
00025    isum += x;
00026    if (isum > 16000) isum =16000;         //Begrenzung um Überlauf zu vermeiden
00027    if (isum < -16000) isum =-16000;
00028    yi = isum/625 * ki;               //I-Anteil berechnen
00029    yd = (x - xalt)*kd;               // D-Anteil berechnen und mit
00030    yd += drest;                     // nicht berücksichtigtem Rest addieren
00031    if (yd > 255) drest = yd - 255;      // merke Rest
00032    else if (yd < -255) drest = yd + 255;
00033    else drest = 0;
00034    if (isum > 15000) BackLED(OFF,ON);   // nur zur Diagnostik
00035    else if (isum < -15000) BackLED(ON,OFF);
00036    else BackLED(OFF,OFF);
00037    yp = x*kp;                        // P-Anteil berechnen
00038    y = yp + yi + yd;                  // Gesamtkorrektur
00039    y2 = y/2;                        // Aufteilung auf beide Motoren
00040    xalt = x;                        // x merken
00041    speedLeft = speedRight = speed;
00042    MotorDir(FWD,FWD);
00043    if ( y > 0) {                     // nach rechts
00044       StatusLED(GREEN);
00045       speedLeft = speed + y2;         // links beschleunigen
00046       if (speedLeft > 255) {
00047          speedLeft = 255;            // falls Begrenzung
00048          y2 = speedLeft - speed;      // dann Rest rechts berücksichtigen
00049       }
00050       y = y - y2;
00051       speedRight = speed - y;         // rechts abbremsen
00052       if (speedRight < 0) {
00053          speedRight = 0;
00054       }
00055    }
00056    if ( y < 0) {                     // nach links
00057       StatusLED(RED);
00058       speedRight = speed - y2;         // rechts beschleunigen !!!was speed - y2!!
00059       if (speedRight > 255) {
00060          speedRight = 255;            // falls Begrenzung
00061          y2 = speed - speedRight;      // dann Rest links berücksichtigen !!was speed - speedRight!!
00062       }
00063       y = y - y2;
00064       speedLeft = speed + y;            // links abbremsen  !! was speed + y!!!
00065       if (speedLeft < 0) {
00066          speedLeft = 0;
00067       }
00068    }
00069    leftDir = rightDir = FWD;
00070    if (speedLeft < 20)  leftDir = BREAK; // richtig bremsen
00071    if (speedRight < 20) rightDir = BREAK;
00072    MotorDir(leftDir,rightDir);
00073    MotorSpeed(abs(speedLeft),abs(speedRight));
00074 }
00075 
00076 int main(void)
00077 {
00078 unsigned char sw;
00079    Init();
00080    MotorDir(FWD,FWD);
00081    StatusLED(GREEN);
00082    speed = 150;
00083    kp = 3; ki = 10; kd = 70;      // Regler Parameter kd enthält bereits Division durch dt
00084    drest=0;
00085    isum=0;
00086    xalt=0;
00087    sw=0;
00088 /*
00089    sw = PollSwitch();
00090    if (sw & 0x01)
00091       {ki=20;}
00092    if (sw & 0x02)
00093       {speed = 200;}
00094    if (sw & 0x04)
00095       speed = 100;
00096    if (sw & 0x08)
00097       kd = 35;
00098    if (sw & 0x10)
00099       kd = 70;
00100    if (sw & 0x20)
00101       kd = 140;
00102 */
00103    FrontLED(OFF);
00104    Msleep(50);
00105    LineData(lineData);                  // Messung mit LED OFF
00106    doff = (lineData[0] - lineData[1]);   // zur Kompensation des Umgebungslicht
00107    FrontLED(ON);
00108    Msleep(100);
00109    speedLeft = speed;
00110    speedRight = speed+25;
00111    while(1){
00112       FollowLine();
00113    }
00114     return 0;
00115 }
00116 

Erzeugt am Mon Apr 9 13:28:39 2007 für ASURO Library von  doxygen 1.5.1-p1