Projekt code für Hfecter

Dependencies:   PM2_Libary PM2_Example_PES_board

main.cpp

Committer:
jashaalm
Date:
2021-05-09
Revision:
14:cfe1311a63f0
Parent:
13:35f55464048e
Child:
15:1ebd2ee7b1c8

File content as of revision 14:cfe1311a63f0:

#include "mbed.h"
#include "platform/mbed_thread.h"

/* PM2_Libary */
#include "EncoderCounter.h"
#include "Servo.h"
#include "SpeedController.h"
#include "PositionController.h"
#include "FastPWM.h"
#include "RangeFinder.h"

#define AUFLOESUNG 0.25412f
#define FUELSENSOR 1
#define BATTERIE 2
#define SENSOR 3
#define MOTOR 4
#define SPERREN 5
#define F_FUELSENSOR 1
#define F_BATTERIE 2

using namespace std::chrono;

InterruptIn user_button(USER_BUTTON);
InterruptIn sensor(PA_1);

//AnalogIn analogIn_1(PA_1);

DigitalOut  led(LED1);

bool  executeMainTask = false;
Timer user_button_timer, loop_timer;


/* declaration of custom button functions */
void button_fall();
void button_rise();
void sensor_fall();
void led_blinken(int fehler);
/* create analog input object */
AnalogIn adc_vbat(ADC_VBAT);
DigitalIn digitalIn(D5);

AnalogIn analogIn_2(PA_0);

float    movement = 0.0f;
float    batt = 0.0f;
float    weight = 0.0f;
float    rotation = 0.0f;
/* create enable dc motor digital out object */
DigitalOut enable_motors(PB_15);
/* create pwm objects */
//FastPWM pwmOut_M1(PB_13);
FastPWM pwmOut_M2(PA_9);
//FastPWM pwmOut_M3(PA_10);
double  Ts_pwm_s = 0.00005; // this needs to be a double value (no f at the end)
/* create encoder read objects */

EncoderCounter  encoderCounter_M2(PB_6, PB_7);
/* create speed controller objects, only M1 and M2, M3 is used open-loop */
float counts_per_turn = 20.0f*78.125f; // counts/turn * gearratio
float kn = 180.0f/12.0f;               // (RPM/V)
float max_voltage = 12.0f;             // adjust this to 6.0f if only one batterypack is used
//SpeedController speedController_M2(counts_per_turn, kn, max_voltage, pwmOut_M2, encoderCounter_M2);
PositionController positioncontroller_M2(counts_per_turn, kn, max_voltage, pwmOut_M2, encoderCounter_M2);

/* analog output */
AnalogOut BatteryLED (PA_5);
AnalogOut WeightLED (PA_4);
int situation = FUELSENSOR;
int Fehler = 0;
int sensor_trig = 0;
int timer_1 = 0;

int main()
{

    user_button.fall(&button_fall);
    user_button.rise(&button_rise);
    sensor.fall(&sensor_fall);

    loop_timer.start();

    /* enable hardwaredriver dc motors */
    enable_motors = 1;


    float movementold = 0;
    while (true) {

        batt = adc_vbat.read()* (3.3f/AUFLOESUNG);
        loop_timer.reset();

        /* ------------- start hacking ------------- -------------*/
        weight = analogIn_2.read() * 5;
        movement = 0;
//roundf(analogIn_1.read()*1.2);
        rotation = positioncontroller_M2.getRotation();
        switch (situation) {
            case FUELSENSOR:

                if(weight < 4) {
                    WeightLED = 1;
                    situation = BATTERIE;
                    if (weight < 3.5) {
                        Fehler = F_FUELSENSOR;
                        situation = SPERREN;

                    }
                } else {
                    WeightLED = 0;
                    situation = BATTERIE;
                }

                break;
            case BATTERIE:
                if(batt <3.2) {
                    BatteryLED = 1;
                    situation = SENSOR;
                    if(batt < 3) {
                        //fehler = F_BATTERIE;
                        //situation = FEHLER;
                    }
                } else {
                    BatteryLED = 0;
                    situation = SENSOR;
                }
                break;
            case SENSOR:
                if (sensor_trig == 1) {
                    situation = MOTOR;
                     sensor_trig = 0;
                } else {
                    situation = FUELSENSOR;
                }
                break;
            case MOTOR:
                if(timer_1 > 200) {
                    enable_motors = 1;
                    positioncontroller_M2.setDesiredRotation(1.0f);
                    if (timer_1 ==500) {
                        positioncontroller_M2.setDesiredRotation(0.0f);
                        enable_motors = 0;
                        timer_1 = 0;
                        situation = FUELSENSOR;
                    } else {
                        timer_1 ++;
                    }

                } else {
                    timer_1 ++;
                }
                break;
            case SPERREN:
                if (Fehler == F_FUELSENSOR) {
                    led_blinken(F_FUELSENSOR);
                    if(weight > 4.2) {
                        WeightLED = 0;
                        situation = BATTERIE;
                    }
                } else {
                    led_blinken(F_BATTERIE);
                    if(batt >3.2) {
                        BatteryLED = 0;
                        situation = SENSOR;
                    }
                }
                break;



        }

        led = !led;

        /* do only output via serial what's really necessary (this makes your code slow)*/
        printf("%3.3f\n, %3.3f\n, %3.3f\n, %3d\n,%3d\n ",
               movement,
               weight,
               batt,
               timer_1,
               motor);

        /* ------------- stop hacking ------------- -------------*/

        // int T_loop_ms = duration_cast<milliseconds>(loop_timer.elapsed_time()).count();
        // int dT_loop_ms = Ts_ms - T_loop_ms;
        //  thread_sleep_for(dT_loop_ms);
        thread_sleep_for(10);

    }
}

void button_fall()
{
    user_button_timer.reset();
    user_button_timer.start();
}

void sensor_fall()
{
    if (situation == SENSOR) {
        motor = 1;
    }


}
void led_blinken(int fehler)
{
    static int timer = 0;

    if (fehler == F_FUELSENSOR) {
        if (timer == 50) {
            timer = 0;

            WeightLED = !WeightLED;
        }
    } else {
        if (timer == 50) {

            BatteryLED = !BatteryLED;
            timer = 0;
        }
    }
    timer ++;
}
void button_rise()
{
    int t_button_ms = duration_cast<milliseconds>(user_button_timer.elapsed_time()).count();
    user_button_timer.stop();
    if (t_button_ms > 200) {
        executeMainTask = !executeMainTask;
    }
}