Main werkt niet
Dependencies: mbed QEI HIDScope biquadFilter MODSERIAL FastPWM
main.cpp
- Committer:
- PatrickZieverink
- Date:
- 2019-10-11
- Revision:
- 18:a584af8b4cfb
- Parent:
- 17:615c5d8b3710
File content as of revision 18:a584af8b4cfb:
#include "mbed.h" #include "MODSERIAL.h" #include "FastPWM.h" #include "QEI.h" #define PI 3.14159265 Serial pc(USBTX, USBRX); //connect to pc DigitalOut motor1_direction(D4); //rotation motor 1 on shield (always D6) FastPWM motor1_pwm(D5); //pwm 1 on shield (always D7) DigitalOut motor2_direction(D7); //rotation motor 2 on shield (always D4) FastPWM motor2_pwm(D6); //pwm 2 on shield (always D5) Ticker loop_ticker; //used in main() /* AnalogIn Pot1(A1); //pot 1 on biorobotics shield AnalogIn Pot2(A0); //pot 2 on biorobotics shield */ AnalogIn vrx(A0); //Joystick_x AnalogIn vry(A1); //Joystick_y InterruptIn but1(D10); //debounced button on biorobotics shield InterruptIn but2(D9); //debounced button on biorobotics shield QEI encoder1 (D11, D12, NC, 8400, QEI::X4_ENCODING); //encoder 1 gebruiken QEI encoder2 (D1, D2, NC, 8400, QEI::X4_ENCODING); //encoder 2 gebruiken float Joystick_x = 0.0; float Joystick_y = 0.0; //variables enum States {idle, calib_EMG, calib_enc, moving_magnet_offf, moving_magnet_onn, home, fail}; States current_state; //using the States enum struct actuator_state { float duty_cycle1; //pwm of 1st motor float duty_cycle2; //pwm of 2nd motor int dir1; //direction of 1st motor int dir2; //direction of 2nd motor bool magnet; //state of the magnet } actuators; struct EMG_params { float idk; //params of the emg, tbd during calibration } emg_values; int enc_zero; //the zero position of the encoders, to be determined from the //encoder calibration //variables used throughout the program bool state_changed = false; //used to see if the state is "starting" volatile bool but1_pressed = false; volatile bool but2_pressed = false; float pot_1; //used to keep track of the potentiometer values float pot_2; void failure() /* Failure mode. This should execute when button 2 is pressed during operation. */ { if (state_changed) { pc.printf("Something went wrong!\r\n"); state_changed = false; } } void cali_EMG() /* Calibratioin of the EMG. Values determined during calibration should be added to the EMG_params instance. */ { if (state_changed) { pc.printf("Started EMG calibration\r\n"); state_changed = false; } } void cali_enc() /* Calibration of the encoder. The encoder should be moved to the lowest position for the linear stage and the most upright postition for the rotating stage. */ { if (state_changed) { pc.printf("Started encoder calibration\r\n"); state_changed = false; } } void moving_magnet_off() /* Moving with the magnet disabled. This is the part from the home position towards the storage of chips. */ { if (state_changed) { pc.printf("Moving without magnet\r\n"); state_changed = false; } return; } void moving_magnet_on() /* Moving with the magnet enabled. This is the part of the movement from the chip holder to the top of the playing board. */ { if (state_changed) { pc.printf("Moving with magnet\r\n"); state_changed = false; } return; } void homing() /* Dropping the chip and moving towards the rest position. */ { if (state_changed) { pc.printf("Started homing"); state_changed = false; } return; } // the funtions needed to run the program void measure_signals() { Joystick_x = (vrx.read()*100-50)/50; Joystick_y = (vry.read()*100-50)/50; pc.printf("X-coordinate = %.2f | Y-coordinate = %.2f \n\r", Joystick_x, Joystick_y); return; } void do_nothing() { actuators.duty_cycle1 = 0; actuators.duty_cycle2 = 0; /* //state guard if (but1_pressed) { //this moves the program from the idle to cw state current_state = cw; state_changed = true; //to show next state it can initialize pc.printf("Changed state from idle to cw\r\n"); but1_pressed = false; //reset button 1 } */ } void output() { if (Joystick_x < 0){ motor2_pwm.write(fabs(Joystick_x)); // 1/frequency van waarop hij draait actuators.dir2 = 0; motor2_dir = motor.dir2; } else { motor2_pwm.write(Joystick_x); // 1/frequency van waarop hij draait motor.dir2 = 1; motor2_dir = motor.dir2; } if (Joystick_y < 0){ motor1_pwm.write(fabs(Joystick_x)); // 1/frequency van waarop hij draait motor.dir1 = 0; motor1_dir = motor.dir1; } else { motor1_pwm.write(Joystick_x); // 1/frequency van waarop hij draait motor.dir1 = 1; motor1_dir = motor.dir1; } return; } void state_machine() { //run current state switch (current_state) { case idle: do_nothing(); break; case fail: failure(); break; case calib_EMG: cali_EMG(); break; case calib_ENC: cali_encoder(); break; case moving_magnet_onn: moving_magnet_on(); break; case moving_magnet_offf: moving_magnet_off(); break; case homing: homing(); break; } } void main_loop() { measure_signals(); state_machine(); motor_controller(); output(); } //Helper functions, not directly called by the main_loop functions or //state machines void but1_interrupt () { but1_pressed = true; pc.printf("Button 1 pressed \n\r"); } void but2_interrupt () { but2_pressed = true; pc.printf("Button 2 pressed \n\r"); } int main() { pc.baud(115200); pc.printf("Executing main()... \r\n"); current_state = idle; motor2_pwm.period(1/160000f); // 1/frequency van waarop hij draait motor1_pwm.period(1/160000f); // 1/frequency van waarop hij draait actuators.dir1 = 0; actuators.dir2 = 0; actuators.magnet = false; but1.fall(&but1_interrupt); but2.fall(&but2_interrupt); loop_ticker.attach(&main_loop, 0.001f); //main loop at 1kHz pc.printf("Main_loop is running\n\r"); while (true) {} }