Script voor aansturen motoren
Dependencies: Encoder HIDScope MODSERIAL mbed-dsp mbed
main.cpp
- Committer:
- jessekaiser
- Date:
- 2014-10-30
- Revision:
- 24:7fbd904d191c
- Parent:
- 23:3306e3267fe6
- Child:
- 25:f45d61cc6dc6
File content as of revision 24:7fbd904d191c:
#include "mbed.h" #include "encoder.h" #include "HIDScope.h" #include "PwmOut.h" #define TSAMP 0.005 #define K_P (3.5) #define K_I (0.01 *TSAMP) #define I_LIMIT 1. #define PI 3.14159265 #define l_arm 0.5 #define M1_PWM PTC8 #define M1_DIR PTC9 #define M2_PWM PTA5 #define M2_DIR PTA4 //Groene kabel moet op de GROUND en blauw op de 3.3v aansluiting Serial pc(USBTX, USBRX); DigitalOut led1(LED_RED); HIDScope scope(2); //motor 25D Encoder motor1(PTD3,PTD5); //wit, geel PwmOut pwm_motor1(M2_PWM); DigitalOut motordir1(M2_DIR); //motor2 37D Encoder motor2(PTD2, PTD0); //wit, geel PwmOut pwm_motor2(M1_PWM); DigitalOut motordir2(M1_DIR); void clamp(float * in, float min, float max); float pid(float setpoint, float measurement); float pwm1_percentage = 0; float pwm2_percentage = 0; int cur_pos_motor1; int prev_pos_motor1 = 0; int cur_pos_motor2; int prev_pos_motor2 = 0; float speed1_rad; float speed2_rad; float pos_motor1_rad; float pos_motor2_rad; void clamp(float* in, float min, float max) // "*" is een pointer (verwijst naar het adres waar een variabele instaat). Dus je slaat niet de variabele op // maar de locatie van de variabele. { *in > min ? /*(*/*in < max? /*niets doen*/ : *in = max/*)*/: *in = min; // a ? b : c --> als a waar is, dan doe je b, en anders c // *in = het getal dat staat op locatie van in --> waarde van new_pwm } float pid(float setpoint, float cur_pos_motor1) { float error; float out_p = 0; static float out_i = 0; error = (setpoint - cur_pos_motor1); out_p = error*K_P; out_i += error*K_I; clamp(&out_i,-I_LIMIT,I_LIMIT); return out_p + out_i; } /*void batje_links () { speed1_rad = -1.5; //positief is CCW, negatief CW (boven aanzicht) cur_pos_motor1 = motor1.getPosition(); pos_motor1_rad = (float)cur_pos_motor1/(4128.0/(2.0*PI)); setpoint = prev_setpoint + TSAMP * speed1_rad; if(setpoint > (11.3*2.0*PI/360)) { //setpoint in graden setpoint = (11.3*2.0*PI/360); } if(setpoint < -(11.3*2.0*PI/360)) { setpoint = -(11.3*2.0*PI/360); } pwm_motor1.write(abs(pwm1_percentage)); prev_setpoint = setpoint; wait(TSAMP); } void batje_rechts () { speed1_rad = 1.5; //positief is CCW, negatief CW (boven aanzicht) cur_pos_motor1 = motor1.getPosition(); pos_motor1_rad = (float)cur_pos_motor1/(4128.0/(2.0*PI)); setpoint = prev_setpoint + TSAMP * speed1_rad; if(setpoint > (11.3*2.0*PI/360)) { //setpoint in graden setpoint = (11.3*2.0*PI/360); } if(setpoint < -(11.3*2.0*PI/360)) { setpoint = -(11.3*2.0*PI/360); } pwm_motor1.write(abs(pwm1_percentage)); prev_setpoint = setpoint; }*/ int main() { pwm_motor1.period_us(100); motor1.setPosition(0); float prev_setpoint = 0; float setpoint = 0; while(1) { pwm1_percentage = pid(setpoint, pos_motor1_rad); if (pwm1_percentage < -1.0) { pwm1_percentage = -1.0; } if (pwm1_percentage > 1.0) { pwm1_percentage = 1.0; } if(pwm1_percentage > 0) { motordir1 = 0; } else { motordir1 = 1; } speed1_rad = 1.0; //positief is CCW, negatief CW (boven aanzicht) cur_pos_motor1 = motor1.getPosition(); pos_motor1_rad = (float)cur_pos_motor1/(4128.0/(2.0*PI)); setpoint = prev_setpoint + TSAMP * speed1_rad; if(setpoint > (12*2.0*PI/360)) { //setpoint in graden setpoint = (12*2.0*PI/360); } if(setpoint < -(12*2.0*PI/360)) { setpoint = -(12*2.0*PI/360); } pwm_motor1.write(abs(pwm1_percentage)); prev_setpoint = setpoint; wait(TSAMP); } }