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.
Diff: main.cpp
- Revision:
- 23:5238b046119b
- Parent:
- 22:c18f04d1dc49
- Child:
- 24:8a62311f2c5e
--- a/main.cpp Fri Nov 18 02:47:59 2016 +0000 +++ b/main.cpp Fri Nov 18 11:55:33 2016 +0000 @@ -4,55 +4,114 @@ #include "list.h" #include <time.h> #include "pid.h" + +#define TRACK_LENGTH 296 +#define TRACK_MIDDLE TRACK_LENGTH/2 +#define Kp 1 +#define Ki 100 +#define Kd 100 Serial pc(USBTX, USBRX); //Use X4 encoding. //QEI wheel(p29, p30, NC, 624, QEI::X4_ENCODING); //Use X2 encoding by default. QEI encoder (PTC16, PTC17, PTB9, 512); -Motor motor(PTC4, PTD0, PTC3, PTC12, PTB23, 2000); +Motor motor(PTC4, PTD0, PTC3, PTC12, PTB23, 400); Pot pend(PTC10, &encoder,0); -PID pid = PID(pend.UPDATE_TIME, 4700, -4700, 500, 0, 0); +PID pid = PID(pend.UPDATE_TIME, 148, -148, Kp, 0, 0); Ticker update; -void test_distance(){ - int wait = 1000; - int steps = 100; - while (wait > 500){ - while (steps > 10){ - printf("steps: %i wait: %i \r\n", steps, wait); - for( int i = 0; i < 3; i++){ - encoder.reset(); - motor.step_clockwise(steps, wait); - int pulses_cw = encoder.getPulses(); - wait_ms(200); - int coast_pulses_cw = encoder.getPulses(); - - encoder.reset(); - motor.step_anticlockwise(steps, wait); - int pulses_ccw = encoder.getPulses(); - wait_ms(200); - int coast_pulses_ccw = encoder.getPulses(); - printf("trial: %i \tclockwise pluses: \t%i \tanticlockwise pluses: \t%i \r\n", i + 1, pulses_cw, pulses_ccw); - printf("\t\tpulses after coast: \t%i \tpulses after coast: \t%i\r\n", coast_pulses_cw, coast_pulses_ccw); - } - steps -=10; - printf("\r\n"); + +/* +void update_handler(){ + pend.update(); +// pid.testError((float) 180, (float) pend.angle); + float output = pid.calculate(180, pend.angle); + //printf("output: %f angle: %f\r\n",output , pend.angle); + if(output > 0){ + motor.delay = 3000 - (int) output; + if (motor.dir != false) { + wait_us(100); + } + motor.dir = false; + }else{ + motor.delay = 3000 + (int) output; + if (motor.dir != true) { + wait_us(100); } - - wait-=100; - steps=100; - } + motor.dir = true; + } +} +*/ + +void update_handler2(){ + pend.update(); + float output = pid.calculate(180, pend.angle); + motor.length = int(5*output); + if(output > 0) { + if(motor.dir != false) { + wait_us(100); + } + motor.dir = false; + } + else { + if(motor.dir != true) { + wait_us(100); + } + motor.dir = true; + } } +int main(){ + wait(2); + pend.set_zeros(); + motor.initialize(TRACK_MIDDLE); + wait(2); + update.attach(&update_handler2, pend.UPDATE_TIME); + while(motor.steps > 6 && motor.steps < 290){ + //pend.print_test(); + motor.run2(true); + } + +/* motor.step_clockwise(74); + for (int i = 1000; i != 400; i -= 50) { + wait_us(100); + motor.step_clockwise(148, i); + wait_us(100); + motor.step_anticlockwise(148, i); + } + + while (1) { + motor.step_clockwise(149); + wait_us(500); + motor.step_anticlockwise(149); + wait_us(500); + } +*/ + +/* while(1){ + + //printf("%f\r\n",pend.angle_as_voltage()); + //pend.print_test(); + if(pend.angle>2) motor.anticlockwise(1000); + else if( (pend.angle>=-2) && (pend.angle<=2))wait_ms(1); + else motor.clockwise(1000); + } -void calibrate_pendulum(){ - encoder.reset(); + pend.set_zeros(); + int waits = 700; while(1){ - printf("voltage %%: %f pulse: %i\r\n", pend.angle_as_voltage(), encoder.getPulses()); + move_pulses(1000*neg, waits); + neg*= -1; + if(neg == -1) + waits -= 10; + printf("Wait time: %i\r\n", waits); + pend.print_test(); + wait(3); } } + void move_pulses(int pulses, int wait){ // find number of pulses from the encoder going from one end to the other. int start = encoder.getPulses(); if(pulses >= 0){ @@ -89,57 +148,35 @@ } } -void update_handler(){ - pend.update(); - double output = pid.calculate(180, pend.angle); - //printf("output: %f angle: %f\r\n",output , pend.angle); - if(output > 0){ - motor.wait = 5000 - (int) output; - motor.dir = false; - }else{ - motor.wait = 5000 + (int) output; - motor.dir = true; - } +void test_distance(){ + int wait = 1000; + int steps = 100; + while (wait > 500){ + while (steps > 10){ + printf("steps: %i wait: %i \r\n", steps, wait); + for( int i = 0; i < 3; i++){ + encoder.reset(); +// motor.step_clockwise(steps, wait); + int pulses_cw = encoder.getPulses(); + wait_ms(200); + int coast_pulses_cw = encoder.getPulses(); + + encoder.reset(); +// motor.step_anticlockwise(steps, wait); + int pulses_ccw = encoder.getPulses(); + wait_ms(200); + int coast_pulses_ccw = encoder.getPulses(); + printf("trial: %i \tclockwise pluses: \t%i \tanticlockwise pluses: \t%i \r\n", i + 1, pulses_cw, pulses_ccw); + printf("\t\tpulses after coast: \t%i \tpulses after coast: \t%i\r\n", coast_pulses_cw, coast_pulses_ccw); + } + steps -=10; + printf("\r\n"); + } + + wait-=100; + steps=100; + } } -int main(){ - wait(2); - pend.set_zeros(); - update.attach(&update_handler, pend.UPDATE_TIME); - while(1){ - //pend.print_test(); - motor.run(true); - //calibrate_pendulum(); - } - - - - - - /* while(1){ - - //printf("%f\r\n",pend.angle_as_voltage()); - //pend.print_test(); - if(pend.angle>2) motor.anticlockwise(1000); - else if( (pend.angle>=-2) && (pend.angle<=2))wait_ms(1); - else motor.clockwise(1000); - } - pend.set_zeros(); - int waits = 700; - while(1){ - move_pulses(1000*neg, waits); - neg*= -1; - if(neg == -1) - waits -= 10; - printf("Wait time: %i\r\n", waits); - pend.print_test(); - wait(3); - } -} - update.attach(&update_handler, pend.UPDATE_TIME); - wait(1); - pend.set_zeros(); - while(1)pend.print_test(); */ } -