One big fixed period control loop
Dependencies: FastAnalogIn MODSERIAL PID QEI RPCInterface Servo mbed-rtos mbed telemetry PinDetect
Fork of Everything by
Diff: main.cpp
- Revision:
- 10:716484b1ddb5
- Parent:
- 9:10fcf3d0ec2d
- Child:
- 11:4348bba086a4
diff -r 10fcf3d0ec2d -r 716484b1ddb5 main.cpp --- a/main.cpp Fri Apr 01 23:47:07 2016 +0000 +++ b/main.cpp Tue Apr 05 18:30:41 2016 +0000 @@ -6,31 +6,29 @@ #include "QEI.h" #include "telemetry.h" +//extern "C" { extern int printfNB(const char *format, ...); } +//extern "C" { extern int putcharNB(int);} + // ========= // Telemetry // ========= -MODSERIAL telemetry_serial(PTC4, PTC3); // TX, RX -telemetry::MbedHal telemetry_hal(telemetry_serial); // Hardware Abstraction Layer -telemetry::Telemetry telemetry_obj(telemetry_hal); // Telemetry - -int dec = 0; -Timer t; -telemetry::Numeric<uint32_t> tele_time_ms(telemetry_obj, "time", "Time", "ms", 0); -telemetry::NumericArray<uint16_t, 128> tele_linescan(telemetry_obj, "linescan", "Linescan", "ADC", 0); -telemetry::Numeric<float> tele_vel(telemetry_obj, "t_vel", "Velocity", "m/s", 0); -telemetry::Numeric<uint32_t> tele_center(telemetry_obj, "t_center", "Center", "", 0); +//MODSERIAL telemetry_serial(PTC4, PTC3); // TX, RX +//telemetry::MbedHal telemetry_hal(telemetry_serial); // Hardware Abstraction Layer +//telemetry::Telemetry telemetry_obj(telemetry_hal); // Telemetry // ============= // Communication // ============= Serial pc(USBTX, USBRX); // USB connection -//Serial bt(PTC4, PTC3); // BlueSMiRF connection +MODSERIAL bt(PTC4, PTC3); // BlueSMiRF connection +//int idx = 0; char cmd; // Command char ch; char in[5]; void communication(void const *args); // Communications +int lock = 0; // ===== // Motor @@ -58,7 +56,7 @@ float Kp = 6.0; // Proportional factor float Ki = 0; // Integral factor float Kd = 0; // Derivative factor -float interval = 0.1; // Sampling interval +float interval = 0.01; // Sampling interval float ref_v = 1.0; PID motor_ctrl(Kp, Ki, Kd, interval); // Motor controller @@ -78,6 +76,7 @@ Timeout camera_read; // Camera read timeout int t_int = 15000; // Exposure time int img[128]; // Image data +uint8_t img_out[128]; void readCamera(); // Read data from camera @@ -98,102 +97,105 @@ // Functions // ================ -void tele_comm(void const *args) { - telemetry_serial.baud(115200); - telemetry_obj.transmit_header(); +// Communications +void communication(void const *args) { while (true) { - tele_time_ms = t.read_ms(); - telemetry_obj.do_io(); - Thread::wait(100); + bt.printf("\r\nPress q to return to this prompt.\r\n"); + bt.printf("Available diagnostics:\r\n"); + bt.printf(" [0] Velocity\r\n"); + bt.printf(" [1] Steering\r\n"); + bt.printf(" [2] Change Kp\r\n"); + bt.printf(" [3] Change Ki\r\n"); + bt.printf(" [4] Change Kd\r\n"); + bt.printf(" [5] Change Ks\r\n"); + bt.printf(" [6] Change reference velocity\r\n"); + bt.printf(" [7] Checkpoint telemetry\r\n"); + cmd = bt.getc(); + while (cmd != 'q') { + switch(atoi(&cmd)){ + case 0: + bt.printf("Duty cycle: %f, Pulse count: %d, Velocity: %f, Kp: %f, Ki: %f, Kd: %f\r\n", d, curr_pulses, velocity, Kp, Ki, Kd); + break; + case 1: + bt.printf("Servo angle: %f, Track center: %d, t_int: %d\r\n", a, center, t_int); + break; + case 2: + bt.printf("Current: %f, New (5 digits): ", Kp); + for (int i = 0; i < 5; i++) { + in[i] = bt.getc(); + bt.putc(in[i]); + } + bt.printf("\r\n"); + Kp = atof(in); + motor_ctrl.setTunings(Kp, Ki, Kd); + cmd = 'q'; + break; + case 3: + bt.printf("Current: %f, New (5 digits): ", Ki); + for (int i = 0; i < 5; i++) { + in[i] = bt.getc(); + bt.putc(in[i]); + } + bt.printf("\r\n"); + Ki = atof(in); + motor_ctrl.setTunings(Kp, Ki, Kd); + cmd = 'q'; + break; + case 4: + bt.printf("Current: %f, New (5 digits): ", Kd); + for (int i = 0; i < 5; i++) { + in[i] = bt.getc(); + bt.putc(in[i]); + } + bt.printf("\r\n"); + Kd = atof(in); + motor_ctrl.setTunings(Kp, Ki, Kd); + cmd = 'q'; + break; + case 5: + bt.printf("Current: %f, New (5 digits): ", Ks); + for (int i = 0; i < 5; i++) { + in[i] = bt.getc(); + bt.putc(in[i]); + } + bt.printf("\r\n"); + Ks = atof(in); + cmd = 'q'; + break; + case 6: + bt.printf("Current: %f, New (5 digits): ", ref_v); + for (int i = 0; i < 5; i++) { + in[i] = bt.getc(); + bt.putc(in[i]); + } + bt.printf("\r\n"); + ref_v = atof(in); + motor_ctrl.setSetPoint(ref_v); + cmd = 'q'; + break; +// case 7: +// while (lock == 0); +// for (int i = 0; i < 128; i++) { +// bt.printf("%d, ", img[i]); +// } +// bt.printf("%d\r\n", center); +// lock = 0; +// break; + } + if (bt.readable()) { + cmd = bt.getc(); + } + } } } -// Communications -//void communication(void const *args) { -// while (true) { -// bt.printf("\r\nPress q to return to this prompt.\r\n"); -// bt.printf("Available diagnostics:\r\n"); -// bt.printf(" [0] Velocity\r\n"); -// bt.printf(" [1] Steering\r\n"); -// bt.printf(" [2] Change Kp\r\n"); -// bt.printf(" [3] Change Ki\r\n"); -// bt.printf(" [4] Change Kd\r\n"); -// bt.printf(" [5] Change Ks\r\n"); -// bt.printf(" [6] Change reference velocity\r\n"); -// cmd = bt.getc(); -// while (cmd != 'q') { -// switch(atoi(&cmd)){ -// case 0: -// bt.printf("Duty cycle: %f, Pulse count: %d, Velocity: %f, Kp: %f, Ki: %f, Kd: %f\r\n", d, curr_pulses, velocity, Kp, Ki, Kd); -// break; -// case 1: -// bt.printf("Servo angle: %f, Track center: %d, t_int: %d\r\n", a, center, t_int); -// break; -// case 2: -// bt.printf("Current: %f, New (5 digits): ", Kp); -// for (int i = 0; i < 5; i++) { -// in[i] = bt.getc(); -// bt.putc(in[i]); -// } -// bt.printf("\r\n"); -// Kp = atof(in); -// motor_ctrl.setTunings(Kp, Ki, Kd); -// cmd = 'q'; -// break; -// case 3: -// bt.printf("Current: %f, New (5 digits): ", Ki); -// for (int i = 0; i < 5; i++) { -// in[i] = bt.getc(); -// bt.putc(in[i]); -// } -// bt.printf("\r\n"); -// Ki = atof(in); -// motor_ctrl.setTunings(Kp, Ki, Kd); -// cmd = 'q'; -// break; -// case 4: -// bt.printf("Current: %f, New (5 digits): ", Kd); -// for (int i = 0; i < 5; i++) { -// in[i] = bt.getc(); -// bt.putc(in[i]); -// } -// bt.printf("\r\n"); -// Kd = atof(in); -// motor_ctrl.setTunings(Kp, Ki, Kd); -// cmd = 'q'; -// break; -// case 5: -// bt.printf("Current: %f, New (5 digits): ", Ks); -// for (int i = 0; i < 5; i++) { -// in[i] = bt.getc(); -// bt.putc(in[i]); -// } -// bt.printf("\r\n"); -// Ks = atof(in); -// cmd = 'q'; -// break; -// case 6: -// bt.printf("Current: %f, New (5 digits): ", ref_v); -// for (int i = 0; i < 5; i++) { -// in[i] = bt.getc(); -// bt.putc(in[i]); -// } -// bt.printf("\r\n"); -// ref_v = atof(in); -// motor_ctrl.setSetPoint(ref_v); -// cmd = 'q'; -// break; -// } -// if (bt.readable()) { -// cmd = bt.getc(); -// } -// } -// } -//} - // Read data from camera void read_camera() { // Start data transfer + //if (lock == 1) { +// camera_read.attach_us(&read_camera, t_int); +// return; +// } si = 1; wait_us(1); clk = 1; @@ -205,7 +207,6 @@ for (int i = 0; i < 128; i++) { clk = 0; img[i] = ao.read_u16(); - tele_linescan[i] = img[i]; clk = 1; wait_us(1); } @@ -272,20 +273,18 @@ if (max > 43253) { center = (argmax + argmin + 2 + 11) / 2; - tele_center = center; a = 88 + (64 - center) * Ks; servo = a / 180; } camera_read.attach_us(&read_camera, t_int); +// lock = 1; } // ==== // Main // ==== int main() { - osThreadSetPriority(osThreadGetId(), osPriorityRealTime); - t.start(); // Initialize motor motor.period_us(T); @@ -307,31 +306,19 @@ motor_ctrl.setMode(1); // Initialize bluetooth -// bt.baud(115200); - -// osThreadSetPriority(osThreadGetId(), osPriorityAboveNormal); + bt.baud(115200); // Initialize communications thread -// Thread communication_thread(communication); - Thread tele_comm_thread(tele_comm); -// tele_comm_thread.set_priority(osPriorityBelowNormal); + Thread communication_thread(communication); // Start motor controller while (true) { -// telemetry_serial.printf("%d\r\n", t.read_ms()); -// if (dec == 100) { - //tele_time_ms = t.read_ms(); -// telemetry_obj.do_io(); -// dec = 0; -// } -// dec = dec + 1; curr_pulses = qei.getPulses(); //for (int i = 0; i < MVG_AVG - 1; i++) { // v_prev[i] = abs(1.5 - 0.5 * (1.5 - v_prev[i+1])); // } // v_prev[MVG_AVG-1] = velocity; velocity = (curr_pulses - prev_pulses)/ interval / ppr * c / 2.5; - tele_vel = velocity; //vel = velocity; // for (int i = 0; i < MVG_AVG; i++) { // velocity = velocity + v_prev[i]; @@ -341,7 +328,7 @@ motor_ctrl.setProcessValue(velocity); d = motor_ctrl.compute(); motor = 1.0 - d; - Thread::wait(interval*1000); -// pc.printf("Exposure: %d, Center: %d, Angle: %f\r\n", t_int, center, a); + wait(interval); + pc.printf("Exposure: %d, Center: %d, Angle: %f\r\n", t_int, center, a); } } \ No newline at end of file