Script voor aansturen motoren
Dependencies: Encoder HIDScope MODSERIAL mbed-dsp mbed
main.cpp
- Committer:
- jessekaiser
- Date:
- 2014-10-31
- Revision:
- 29:4b7f6f15cedf
- Parent:
- 28:4f2e15118f13
- Child:
- 30:6ace856e0ad7
File content as of revision 29:4b7f6f15cedf:
#include "mbed.h" #include "encoder.h" #include "HIDScope.h" #include "PwmOut.h" #define TSAMP 0.005 #define K_P1 (3.5) //voor motor1 is het 3.5 #define K_I1 (0.01 *TSAMP) //voor motor1 is het 0.01 #define K_P2 (1.0) #define K_I2 (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); 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; int staat = 0; 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 pid1(float setpoint1, float measurement1) { float error1; float out_p1 = 0; static float out_i1 = 0; error1 = (setpoint1 - measurement1); out_p1 = error1*K_P1; out_i1 += error1*K_I1; clamp(&out_i1,-I_LIMIT,I_LIMIT); return out_p1 + out_i1; } float pid2(float setpoint2, float measurement2) { float error2; float out_p2 = 0; static float out_i2 = 0; error2 = (setpoint2 - measurement2); out_p2 = error2*K_P2; out_i2 += error2*K_I2; clamp(&out_i2,-I_LIMIT,I_LIMIT); return out_p2 + out_i2; } float prev_setpoint1 = 0; float setpoint1 = 0; float prev_setpoint2 = 0; float setpoint2 = 0; void batje_links () { speed1_rad = -1.0; //positief is CCW, negatief CW (boven aanzicht) cur_pos_motor1 = motor1.getPosition(); pos_motor1_rad = (float)cur_pos_motor1/(3600.0/(2.0*PI)); setpoint1 = prev_setpoint1 + TSAMP * speed1_rad; if(setpoint1 > (180*2.0*PI/360)) { //setpoint in graden setpoint1 = (180*2.0*PI/360); } if(setpoint1 < -(180*2.0*PI/360)) { setpoint1 = -(180*2.0*PI/360); } pwm_motor1.write(abs(pwm1_percentage)); prev_setpoint1 = setpoint1; wait(TSAMP); } void batje_rechts () { speed1_rad = 2.0; //positief is CCW, negatief CW (boven aanzicht) cur_pos_motor1 = motor1.getPosition(); pos_motor1_rad = (float)cur_pos_motor1/(3200.0/(2.0*PI)); //moet 4128 setpoint1 = prev_setpoint1 + TSAMP * speed1_rad; if(setpoint1 > (360*2.0*PI/360)) { //setpoint in graden setpoint1 = (360*2.0*PI/360); } if(setpoint1 < -(360*2.0*PI/360)) { setpoint1 = -(360*2.0*PI/360); } pwm_motor1.write(abs(pwm1_percentage)); prev_setpoint1 = setpoint1; if(setpoint1 > (360*2.0*PI/360)) { staat = 1; } wait(TSAMP); } void arm_hoog () //LET OP, PAS VARIABELE NOG AAN DIT IS VOOR TESTEN { speed1_rad = 6.0; //positief is CCW, negatief CW (boven aanzicht) setpoint1 = prev_setpoint1 + TSAMP * speed1_rad; if(setpoint1 > (155.0*2.0*PI/360)) { //setpoint in graden setpoint1 = (155.0*2.0*PI/360); } if(setpoint1 < -(155.0*2.0*PI/360)) { setpoint1 = -(155.0*2.0*PI/360); } pwm_motor1.write(abs(pwm1_percentage)); prev_setpoint1 = setpoint1; if(setpoint1 >= (155.0*2.0*PI/360)-0.1) { staat = 1; } } void arm_mid () { speed1_rad = -2.0; //positief is CCW, negatief CW (boven aanzicht) setpoint1 = prev_setpoint1 + (TSAMP * speed1_rad); if(setpoint1 > (155*2.0*PI/360)) { //setpoint in graden setpoint1 = (155*2.0*PI/360); } if(setpoint1 < -(0.0*2.0*PI/360)) { setpoint1 = -(0.0*2.0*PI/360); } prev_setpoint1 = setpoint1; //wait(TSAMP); } void arm_laag () { speed1_rad = -2.0; //positief is CCW, negatief CW (boven aanzicht) setpoint1 = prev_setpoint1 + (TSAMP * speed1_rad); if(setpoint1 > (155*2.0*PI/360)) { //setpoint in graden setpoint1 = (155*2.0*PI/360); } if(setpoint1 < -(0.0*2.0*PI/360)) { setpoint1 = -(0.0*2.0*PI/360); } prev_setpoint1 = setpoint1; } void arm_begin () { speed1_rad = -2.0; //positief is CCW, negatief CW (boven aanzicht) setpoint1 = prev_setpoint1 + (TSAMP * speed1_rad); if(setpoint1 > (155*2.0*PI/360)) { //setpoint in graden setpoint1 = (155*2.0*PI/360); } if(setpoint1 < -(0.0*2.0*PI/360)) { setpoint1 = -(0.0*2.0*PI/360); } prev_setpoint1 = setpoint1; } int main() { int wait_iterator = 0; pwm_motor1.period_us(100); motor1.setPosition(0); pwm_motor2.period_us(100); motor2.setPosition(0); pc.baud(115200); while(1) { //MOTOR1 pc.printf("%d \r\n", motor1.getPosition()); cur_pos_motor1 = motor1.getPosition(); pos_motor1_rad = (float)cur_pos_motor1/(3200.0/(2.0*PI)); //moet 4128 pwm1_percentage = pid1(setpoint1, pos_motor1_rad); if (pwm1_percentage < -1.0) { pwm1_percentage = -1.0; } if (pwm1_percentage > 1.0) { pwm1_percentage = 1.0; } pwm_motor1.write(abs(pwm1_percentage)); if(pwm1_percentage > 0) { motordir1 = 0; } else { motordir1 = 1; } //MOTOR2 cur_pos_motor2 = motor2.getPosition(); pos_motor2_rad = (float)cur_pos_motor2/(3200.0/(2.0*PI)); //moet 4128 pwm2_percentage = pid1(setpoint2, pos_motor2_rad); if (pwm2_percentage < -1.0) { pwm2_percentage = -1.0; } if (pwm2_percentage > 1.0) { pwm2_percentage = 1.0; } pwm_motor2.write(abs(pwm2_percentage)); if(pwm2_percentage > 0) { motordir2 = 0; } else { motordir2 = 1; } wait(TSAMP); //STATES if(staat == 0) { arm_hoog(); wait_iterator = 0; } else if(staat ==1) { wait_iterator++; if(wait_iterator > 200) staat = 2; } else { arm_begin(); } } }