Grundfunktionen für Micromouse

Dependencies:   AutomationElements mbed

MotorDriver.cpp

Committer:
wengefa1
Date:
2018-04-22
Revision:
1:4808f55970e8
Parent:
0:e38b500d6e74

File content as of revision 1:4808f55970e8:

#include "MotorDriver.h"
#include "Controller.h"
#include "ReadSensor.h"
#include "mbed.h"

#define WheelDiameter 3;
#define ratio 0.04;

DigitalOut enableMotorDriver(PB_2);
DigitalIn motorDriverFault(PB_14);
DigitalIn motorDriverWarning(PB_15);

PwmOut pwmLeft(PA_8);
PwmOut pwmRight(PA_9);

EncoderCounter counterLeft(PB_6, PB_7);
EncoderCounter counterRight(PA_6, PC_7);

DigitalOut myled(LED2);

Controller controller(pwmLeft, pwmRight, counterLeft, counterRight);

void resetCounter(void);

void startup (void)
{
    enableMotorDriver = 1; // Schaltet den Leistungstreiber ein
    counterLeft.reset();
    counterRight.reset();
}

void driveOne(int NumbField, int SpeedMode)

{
    int AnzahlZyklen = 0;
    float distance;
    float CorrectFactor;
    float Speed = 0.0f;

    switch(SpeedMode) {
        case 1:
            Speed = 20.0f;
            break;


        case 2:
            Speed = 40.0f;
            break;

        case 3:
            Speed = 80.0f;
            break;


        default:

            break;
    }

    //Fährt bis Anzahl umdrehungen erreicht sind
    while(((abs(counterLeft.read())+abs(counterRight.read()))/2)<= 1000*NumbField) {
        distance = readSensorValue(1);      //Distanz zur linken Wand wird gemessen
        AnzahlZyklen = AnzahlZyklen+1;      //Anzahl Regelvorgänge werden gezählt
        distance = distance - 7.8f;         //Distanz zwischen Position und Ideallinie wird berechnet
        CorrectFactor = distance*0.8f;      //P Faktor des P-Reglers

        //printf("%f\n",CorrectFactor);
        if(abs(CorrectFactor) <= 5.0f) {    //erkennt Wand oder Lücke auf linker Seite
            controller.setDesiredSpeedLeft((Speed * (-1.0f)) - CorrectFactor); //Bei Wand wird korrigiert
            controller.setDesiredSpeedRight(Speed - CorrectFactor);
        } else {
            controller.setDesiredSpeedLeft(Speed * (-1.0f));                 //Bei Lücke wird nach Counter gefahren
            controller.setDesiredSpeedRight(Speed);
        }
    }
    stop();
    printf("Das Programm wurde: %d durchlaufen", AnzahlZyklen);
}

int turnRight(int direction)
{
    controller.setDesiredSpeedLeft(15.0f); // Drehzahl in [rpm] bei 31/1 enspricht es ca. 374/min
    controller.setDesiredSpeedRight(15.0f);
    while(((abs(counterLeft.read())+abs(counterRight.read()))/2)<= 590) {
        //do nothing
    }
    stop();
    direction = direction + 1;
    return direction;
}

int turnLeft(int direction)
{
    controller.setDesiredSpeedLeft(-15.0f); // Drehzahl in [rpm] bei 31/1 enspricht es ca. 374/min
    controller.setDesiredSpeedRight(-15.0f);
    while(((abs(counterLeft.read())+abs(counterRight.read()))/2)<= 590) {
        //do nothing
    }
    stop();
    direction = direction - 1;
    return direction;
}


void stop(void)
{
    controller.setDesiredSpeedRight(0.0f);
    controller.setDesiredSpeedLeft(0.0f);
    resetCounter();

}

void resetCounter(void)
{
    controller.DetachTicker();
    counterLeft.reset();
    counterRight.reset();
    controller.setDesiredSpeedRight(0.0f);
    controller.setDesiredSpeedLeft(0.0f);
    controller.AttachTicker();

}

void driveDist(int Distance, int Direction)
{
    controller.setDesiredSpeedLeft(-20.0f*Direction); // Drehzahl in [rpm]
    controller.setDesiredSpeedRight(20.0f*Direction);

    while(((abs(counterLeft.read())+abs(counterRight.read()))/2)<= 100*Distance) {
        //Fährt bis Anzahl umdrehungen erreicht sind
    }
    stop();
}