Dies ist die von Julian Mueller überarbeitete Bahnkantenregelung.

Dependencies:   TextLCD mbed

auto_func.cpp

Committer:
Jules20
Date:
2016-05-31
Revision:
0:b72d86a7b005

File content as of revision 0:b72d86a7b005:

/**
*Funktionen fuer den Autmatikbetrieb
*
*CPP-Datei auto_func.cpp
*
*@version: 01.11.2015
*@author: Gustav Grether
*/

#include "auto_func.h"
#include "mbed.h"
//Variablen fuer Automatikbetrieb
float TA=0.04; //Abtastzeit[s], entspricht Abtastrate 25 Hz
//Bereich, indem das Kantenpixel zum Start des Automatikbetriebs sein muss
int minPx=30;
int maxPx=100;
Timer t;// Timer der Uebergang zu Automatikbetrieb bei Fehler abbricht
int maxt=1; // Maximale zulaessige Zeit fuer Uebergang zu Automatikbetrieb

//Variablen fuer auto_sens_ctr()
int cnt_Err; //Zaehler fuer aufeinanderfolgende Fehler bei der Kantendetektion
int allow_Err=10; //zulaessige Anzahl aufeinanderfolgender Fehler bei der Kantendetektion
int auto_curPx; //Wert des aktuellen Kantenpixel
int auto_forPx; //Wert des vorhergehenden Kantenpixel
int threshDiff=15; //zulaessige Abweichung zu vorhergehendem Kantenpixel in Anzahl Pixel
Ticker tickerReg; //Ticker, der das Auslesen des Sensors und die Reglung taktet


//Variablen fuer auto_sollPx_set()
int auto_sollPx; //zwischenspeichern des Sollwertes
//Variablen fuer auto_kp_set()
float main_kp; //zwischenschpeichern von kp

void auto_setup()
{
    cnt_Err=0;
    t.reset();
    t.start();

    while(1) { //Finde Kante in Toleranzbereich
        auto_curPx=edgePx_get();//Sensor auslesen
        if(auto_curPx>minPx && auto_curPx<maxPx) {

            t.stop();
            regler_setup();
            lcd.cls();
            lcd.locate(0,0);
            lcd.printf("Auto   SOLL=%i",regler_sollPx_get());
            lcd.locate(0,1);
            lcd.printf(">kp >soll  >hand");
            //Ticker fuer Taktung der Reglung mit Funktion verknuepfen,Abtastrate TA
            
            tickerReg.attach(&auto_sens_ctr,TA);
            
            break;
        } else {
            lcd.cls();
            lcd.locate(0,0);
            lcd.printf("Detektion nicht moeglich.");
            
        }
    }


}

void auto_end()
{
    tickerReg.detach();//Ticker fuer Taktung der Reglung beenden
    regler_end();//Reglerparameter in Datei speichern
}

void auto_sens_ctr()
{
    auto_forPx=auto_curPx; 
    auto_curPx=edgePx_get();//Sensor auslesen
   
    if(auto_curPx<0) {
        //Fehler bei Kantendetektion
        cnt_Err++;
        //nehme vorhergehenden Wert an, solange bis cnt_Err Grenzwert erreicht
        auto_curPx=auto_forPx;
    } else if(abs(auto_forPx-auto_curPx)>threshDiff) {
        //Differenz zu vorhergendem Wert zu gross
        cnt_Err++;
        //nehme vorherhegenden an, solange bis cnt_Err Grenzwert erreicht
        auto_curPx=auto_forPx;
    } else { //Kantendetektion erfolgreich
        cnt_Err=0; //setze zul. Fehler auf 0
    }

    if(cnt_Err<allow_Err) {
        //fuehre Regelungalgorithmus aus
        control(auto_curPx);
    } else {
        //NOTAUS, schalte Motor bewegungslos, keine Meldung auf Display
        mtr_period_set(0); //Motor bewegungslos schalten
    }

    //fuehre Regelungalgorithmus aus
    control(auto_curPx);
}

void auto_sollPx_set() 
{
    auto_sollPx=regler_sollPx_get();
    lcd.cls();
    lcd.locate(0,0);
    lcd.printf("SOLL=%i", auto_sollPx);
    lcd.locate(0,1);
    lcd.printf(">+    >-   >auto");
    while(1) {
        if(butLe==1 && debLe.read_ms()>500) {
            //erhoehe sollwert
            debLe.reset();
            auto_sollPx=auto_sollPx+1;
            regler_sollPx_set(auto_sollPx);
            lcd.locate(0,0);
            lcd.printf("SOLL=%i", auto_sollPx);
        } else if(butMi==1 && debMi.read_ms()>500) {
            //erhoehe sollwert
            debMi.reset();
            auto_sollPx=auto_sollPx-1;
            regler_sollPx_set(auto_sollPx);
            lcd.locate(0,0);
            lcd.printf("SOLL=%i", auto_sollPx);
        } else if(butRi==1 && debRi.read_ms()>500) {
            //verlasse while schleife zum aendern von soll
            debRi.reset();
            lcd.cls();
            lcd.locate(0,0);
            lcd.printf("Auto   SOLL=%i",regler_sollPx_get());
            lcd.locate(0,1);
            lcd.printf(">kp >soll  >hand");
            break;
        }
    }
}
void auto_kp_set()
{
    main_kp=regler_kp_get();
    lcd.cls();
    lcd.locate(0,0);
    lcd.printf("kp=%.1f", main_kp);
    lcd.locate(0,1);
    lcd.printf(">+    >-   >auto");
    while(1) {
        if(butLe==1 && debLe.read_ms()>500) {
            //erhoehe kp
            debLe.reset();
            main_kp=main_kp+0.1;
            regler_kp_set(main_kp);
            lcd.locate(0,0);
            lcd.printf("kp=%.1f", main_kp);
        } else if(butMi==1 && debMi.read_ms()>500) {
            //verringere kp
            debMi.reset();
            main_kp=main_kp-0.1;
            regler_kp_set(main_kp);
            lcd.locate(0,0);
            lcd.printf("kp=%.1f", main_kp);
        } else if(butRi==1 && debRi.read_ms()>500) {
            //verlasse while schleife zum aendern kp
            debRi.reset();
            lcd.cls();
            lcd.locate(0,0);
            lcd.printf("Auto   SOLL=%i",regler_sollPx_get());
            lcd.locate(0,1);
            lcd.printf(">kp >soll  >hand");
            break;
        }
    }
}