V1 SANS PID

Dependencies:   mbed IHM

main.cpp

Committer:
thomaspotier
Date:
2019-01-21
Revision:
0:c25d26ef035b
Child:
1:d784b3e1fb18

File content as of revision 0:c25d26ef035b:

#include "IHM.h"
#include <math.h>

#define THRESHOLD 0.5
#define K (2.0 + get_pot())
#define SPEED 0.40
#define MAX_RATIO 2.5

// 100us
#define DT 0.0001

typedef enum {
    WAIT = 0,
    RUN,
    STOP
} RUN_STATE;

IHM ihm;
RUN_STATE run_state = WAIT;
Timer timer;

PwmOut mot1(PB_5);
PwmOut mot2(PB_4);

// AnaIn
AnalogIn ain(PB_1);
// AnaIn Select
BusOut select_analog(PA_8, PF_1, PF_0);
DigitalIn jack(PB_6);
DigitalIn pb(PB_7);

double min(double a, double b)
{
	return a < b ? a : b;
}

double max(double a, double b)
{
	return a > b ? a : b;
}

double borned(double n, double mi, double ma)
{
    return max(mi, min(ma, n));
}

double get_an(int i)
{
	select_analog = i;
    wait_us(1);
    return ain.read();
}

double get_di(int i)
{
	return get_an(i) < THRESHOLD;
}

double get_error()
{
	float n = 0;
	float facs[6] = {-3, -2, -1, 1, 2, 3};
	for (int i = 0; i < 6; i++)
		n += facs[i] * get_an(i);
	return (n);
}

double get_pot()
{
    return get_an(7);
}

void set_motors(double speed, double dir)
{
	double ratio = (MAX_RATIO - 1.0) / (MAX_RATIO + 1.0);
	double v1 = speed - dir * speed * ratio;
	double v2 = speed + dir * speed * ratio;
	mot1.write(v1);
	mot2.write(v2);
}

int sens_count()
{
	int n = 0;
    for (int i = 0; i < 6; i++)
        if (get_di(i))
            n++;
    return (n);
}

int main() {
	ihm.BAR_set(0);
	ihm.LCD_clear();
	ihm.LCD_gotoxy(0, 0);
	ihm.LCD_printf("EL TACOS");
	mot1.period_us(100);
	mot2.period_us(100);
	mot1.write(0);
	mot2.write(0);
	timer.start();
	while (1){
		// wait DT
		while (timer.read_us() < 1000);
		timer.reset();
		// RUN_STATE automata
		if (run_state == WAIT && jack)
			run_state = RUN;
		if (run_state == RUN && pb)
			run_state = STOP;
		if (run_state == STOP && !jack)
			run_state = WAIT;
		if (run_state == RUN)
		{
			if (sens_count() <= 2)
				set_motors(SPEED, borned(K * get_error() / 3.0, -1.0, 1.0));
		} else {
			mot1.write(0);
			mot2.write(0);
		}
	}
}