Heading control with pid and magnetometer
Dependencies: HMC5883L mbed motoresDC
main.cpp
- Committer:
- tabris2015
- Date:
- 2016-06-03
- Revision:
- 0:c4c11b0ac1b9
File content as of revision 0:c4c11b0ac1b9:
#define MAPLE_MINI #include "mbed.h" #include "pines.h" #include <motoresDC.h> #include <HMC5883L.h> HMC5883L brujula; InterruptIn boton(PB_8); //motores D27 D31 D30 D26 D29 D28 MotoresDC carro(PWM_L, CTRL1_L, CTRL2_L, PWM_R, CTRL1_R, CTRL2_R); Timer t; unsigned long prev_time; unsigned long interval = 33; double maxOut = 0.5; double minOut = -0.5; volatile double setpoint = 0.0; double iTerm = 0; double lastInput; double kp = 1.1; double ki = 0.01; double kd = 0.0; PwmOut led(PB_1); void toggle() { if(setpoint == 0.0) { setpoint = 0.5; } else { setpoint = 0.0; } } // functions void init_p() { led = 1; carro.detener(); boton.fall(toggle); brujula.init(); wait_ms(1000); led = 0; wait_ms(500); led = 1; t.start(); wait_ms(2000); led = 0; } int main() { init_p(); while(1) { unsigned long now = t.read_ms(); if((now - prev_time) > interval) { prev_time = now; double input = brujula.getHeading()/ 180.0 -1.0; // PID double error = setpoint - input; if(abs(error) < 0.1) led = 1; else led = 0; iTerm += ki * error; if(iTerm > maxOut) iTerm = maxOut; else if(iTerm < minOut) iTerm = minOut; double dInput = input - lastInput; double output = kp* error + iTerm + kd * dInput; if(output > maxOut) output = maxOut; else if(output < minOut) output = minOut; carro.pivotar(output); lastInput = input; } } }