wastePID.c

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

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