Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
main.cpp
- Committer:
- KDrainEE
- Date:
- 2018-04-15
- Revision:
- 1:9149cfedd4d5
- Parent:
- 0:30871514c229
- Child:
- 2:e87736742f99
File content as of revision 1:9149cfedd4d5:
//Works at speed 2.0, KPS 2.0e-2, KD 1.0e-4
//Has tolerance check, Steering doesn't
//Values from Simulation
//#define KPS 0.0896852742245504f
//#define KD 0.072870569295611f
//#define KPS 0.03f
#include "mbed.h"
#include <iostream>
#define TI 0.001f
#define SCALAR 0.53f
#define MINM 0.0f
#define MAXM 0.53f
#define KPM 0.1414f
#define KI 19.7408f
#define KPS 2.0E-2f //Original 2.0e-2
#define KD 1.0e-4f
#define SET 0.0f
#define MINS 0.05f
#define MAXS 0.1f
#define BIAS 0.075f
#define TOL 0.02f
#define STEER_FREQ 0.02f //50 Hz
#define STEERUPDATEPERIOD 0.05
AnalogIn _right(PTB1); //Right sensor
AnalogIn _left(PTB3); //Left sensor
AnalogIn speed(PTB2); //tachometer
PwmOut servoSig(PTA13); //PWM output to control servo
PwmOut gateDrive(PTA4);
Serial bt(PTE0, PTE1); //COM12
DigitalOut myled(LED_BLUE);
Ticker control;
Timer ctrlTimer;
float data[6];
float Setpoint = 0.0f;
float errSum = 0.0;
float fbPrev = 0.0f;
float Kps = 2.0E-2; //0.013 for setpoint = 0.0/0.05
float Kd = 1.0e-4;
void serCb()
{
char x = bt.getc();
if (x == 'u')
{
Setpoint = Setpoint + 0.05;
}
else if(x == 'h')
{
Setpoint = Setpoint - 0.05;
}
else if (x == 'i')
{
Kps += 1.0e-3;
}
else if (x == 'j')
{
Kps -= 1.0e-3;
}
else if (x == 'o')
{
Kd += 1.0e-5;
}
else if (x == 'k')
{
Kd -= 1.0e-5;
}
else
{
bt.putc(x);
}
if(Setpoint > MAXM) Setpoint = MAXM;
if(Setpoint < MINM) Setpoint = MINM;
bt.printf("Setpoint = %f, Kps = %f, Kd = %f\r\n", Setpoint, Kps, Kd);
}
void stop()
{
Setpoint = 0.0f;
}
void steer()
{
float L = _left.read();
float R = _right.read();
if(L == 0.0f && R == 0.0f)
{
stop();
}
float fb = L - R;
float e = SET - fb;
float Controlleroutput = Kps * e - (Kd * (fb - fbPrev)/TI)+ BIAS;//subtract derivative of error??
if (Controlleroutput > MAXS) Controlleroutput = MAXS;
else if (Controlleroutput < MINS) Controlleroutput = MINS;
if (abs(Controlleroutput - servoSig.read()) > TOL || ctrlTimer.read() >= STEERUPDATEPERIOD)
{
ctrlTimer.reset();
servoSig.write(Controlleroutput);
}
fbPrev = fb;
data[0] = _right.read();
data[1] = _left.read();
data[2] = Controlleroutput;
data[3] = e;
}
void drive()
{
float error = Setpoint-speed.read();
errSum +=(error * TI);
float iTerm = KI*errSum;
if(iTerm > MAXM) iTerm = MAXM;
if(iTerm < MINM) iTerm = MINM;
float output = KPM*error + iTerm;
if(output > MAXM) output = MAXM;
if(output < MINM) output = MINM;
if(output < MINM)
{
gateDrive.write(MINM);
//brake.write(1);
}
else
{
//brake.write(0);
gateDrive.write(output);
}
data[4] = gateDrive.read();
data[5] = speed.read();
}
void cb()
{
steer();
drive();
}
int main()
{
//startup checks
bt.attach(&serCb);
servoSig.period(STEER_FREQ);
gateDrive.period(.00005f);
gateDrive.write(Setpoint);
ctrlTimer.start();
control.attach(&cb, TI);
bt.baud(115200);
//bt.printf("Right Left SteerControl SteerError GateDrive Speed\r\n");
while(1) {
myled = !myled;
//bt.printf("%f ",data[0]);
// bt.printf("%f ", data[1]);
// bt.printf("%f ", data[2]);
// bt.printf("%f ", data[3]);
// bt.printf("%f ", data[4]);
// bt.printf("%f\r\n", data[5]);
}
}