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.
Dependents: buttoncontrol includeair includeair Oudverslag
controlandadjust.cpp
- Committer:
- Gerth
- Date:
- 2015-10-20
- Revision:
- 15:a1a29db96f4f
- Parent:
- 14:2b4378bfe07a
- Child:
- 16:57c4f4ac11e4
File content as of revision 15:a1a29db96f4f:
#include "controlandadjust.h"
#include "mbed.h"
#include "QEI.h"
float CW=1;
float CCW=0;
float direction1;
float speed1;
float direction2;
float speed2;
float maxvaluepwm=0;
float minimal_error;
const float pi=3.14159265359;
const float degtorad=(pi/180);
DigitalOut motor1_dir(D7);// draairichting motor 1 (1 is CW encoder als je daar op kijkt en CW shaft als je daar op kijkt)
PwmOut motor1_speed(D6);//aanstuursnelheid motor 1
PwmOut motor2_speed(D5);
DigitalOut motor2_dir(D4);
controlandadjust::controlandadjust(float errorband)
{
minimal_error=errorband*degtorad/2;
}
void controlandadjust::verwerksignaal(float signaal1,float signaal2)
{
//motor1
if (signaal1>=0) {//determine CW or CCW rotation
direction1=CCW;
} else {
direction1=CW;
}
if (fabs(signaal1)>=maxvaluepwm) { //check if signal is <1
speed1=maxvaluepwm;//if signal >1 make it 1 to not damage motor
} else {
speed1=fabs(signaal1);// if signal<1 use signal
}
//motor2
if (signaal2>=0) {//determine CW or CCW rotation
direction2=CW;
} else {
direction2=CCW;
}
if (fabs(signaal2)>=maxvaluepwm) { //check if signal is <1
speed2=maxvaluepwm;//if signal >1 make it 1 to not damage motor
} else {
speed2=fabs(signaal2);// if signal<1 use signal
}
//write to motor
motor1_dir.write(direction1);
motor1_speed.write(speed1);
motor2_dir.write(direction2);
motor2_speed.write(speed2);
}
float controlandadjust::motor1pwm()
{
return speed1;
}
float controlandadjust::motor2pwm()
{
return speed2;
}
void controlandadjust::P(float error1,float error2,float Kp)
{
float signaal1=error1*Kp;
float signaal2=error2*Kp;
//check if error is big enough to produce signal, else signal is 0 to save motors
if (fabs(error1) > minimal_error && fabs(error2) > minimal_error) {
verwerksignaal(signaal1,signaal2);
} else if (fabs(error1) <= minimal_error && fabs(error2) <= minimal_error) {
verwerksignaal(0,0);
} else if (fabs(error1) > minimal_error && fabs(error2) <= minimal_error) {
verwerksignaal(signaal1,0);
} else if (fabs(error1) <= minimal_error && fabs(error2) > minimal_error) {
verwerksignaal(0,signaal2);
}
}
void controlandadjust::PI(float error1, float error2, float Kp, float Ki,float Ts, float &error1_int, float &error2_int)
{
error1_int = error1_int + Ts * error1;
float signaal1=Kp*error1+Ki*error1_int;
error2_int = error2_int + Ts * error2;
float signaal2=Kp*error2+Ki*error2_int;
//check if error is big enough to produce signal, else signal is 0 to save motors
if (fabs(error1) > minimal_error && fabs(error2) > minimal_error) {
verwerksignaal(signaal1,signaal2);
} else if (fabs(error1) <= minimal_error && fabs(error2) <= minimal_error) {
verwerksignaal(0,0);
} else if (fabs(error1) > minimal_error && fabs(error2) <= minimal_error) {
verwerksignaal(signaal1,0);
} else if (fabs(error1) <= minimal_error && fabs(error2) > minimal_error) {
verwerksignaal(0,signaal2);
}
}
void controlandadjust::PID(float error1, float error2, float Kp, float Ki,float Kd,float Ts,
float &error1_int, float &error2_int, float &error1_prev, float &error2_prev)
{
// Derivative
double error1_der = (error1 - error1_prev)/Ts;
error1_prev = error1;
double error2_der = (error2 - error2_prev)/Ts;
error2_prev = error2;
// Integral
error1_int = error1_int + Ts * error1;
error2_int = error2_int + Ts * error2;
// PID
float signaal1= Kp * error1 + Ki * error1_int + Kd * error1_der;
float signaal2= Kp * error2 + Ki * error2_int + Kd * error2_der;
//check if error is big enough to produce signal, else signal is 0 to save motors
if (fabs(error1) > minimal_error && fabs(error2) > minimal_error) {
verwerksignaal(signaal1,signaal2);
} else if (fabs(error1) <= minimal_error && fabs(error2) <= minimal_error) {
verwerksignaal(0,0);
} else if (fabs(error1) > minimal_error && fabs(error2) <= minimal_error) {
verwerksignaal(signaal1,0);
} else if (fabs(error1) <= minimal_error && fabs(error2) > minimal_error) {
verwerksignaal(0,signaal2);
}
}
void controlandadjust::STOP()
{
motor1_speed.write(0);
motor2_speed.write(0);
}
void controlandadjust::cutoff(float maxvalue)
{
maxvaluepwm=maxvalue;
}