Control up to two motors using filtered EMG signals and a PID controller

Dependencies:   FastPWM HIDScope MODSERIAL QEI Matrix biquadFilter controller errorFetch mbed motorConfig refGen MatrixMath inverseKinematics

Fork of Minor_test_serial by First Last

Committer:
tvlogman
Date:
Fri Sep 29 08:08:19 2017 +0000
Revision:
18:65e24db15c69
Parent:
17:616ce7bc1f96
Removed HIDscope - that seems to prevent the entire program from working

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vsluiter 0:c8f15874531b 1 #include "mbed.h"
vsluiter 0:c8f15874531b 2 #include "MODSERIAL.h"
tvlogman 8:0067469c3389 3 #include "HIDScope.h"
tvlogman 9:5f0e796c9489 4 #include "QEI.h"
tvlogman 15:b76b8cff4d8f 5 #include "FastPWM.h"
tvlogman 15:b76b8cff4d8f 6
tvlogman 15:b76b8cff4d8f 7 enum robotStates {KILLED, ACTIVE};
tvlogman 15:b76b8cff4d8f 8 robotStates currentState = KILLED;
tvlogman 8:0067469c3389 9
tvlogman 12:0462757e1ed2 10 QEI Encoder(D12,D13,NC,64, QEI::X4_ENCODING);
tvlogman 10:e23cbcdde7e3 11 MODSERIAL pc(USBTX, USBRX);
tvlogman 8:0067469c3389 12
tvlogman 14:664870b5d153 13 // Defining outputs
tvlogman 13:83e3672b24ee 14 DigitalOut motor1_direction(D4);
tvlogman 13:83e3672b24ee 15 PwmOut motor1_pwm(D5);
tvlogman 14:664870b5d153 16
tvlogman 14:664870b5d153 17 // Defining inputs
tvlogman 14:664870b5d153 18 InterruptIn sw2(SW2);
tvlogman 15:b76b8cff4d8f 19 InterruptIn sw3(SW3);
tvlogman 16:27430afe663e 20 InterruptIn button1(D2);
tvlogman 15:b76b8cff4d8f 21 AnalogIn pot(A0);
tvlogman 15:b76b8cff4d8f 22
tvlogman 16:27430afe663e 23 // PWM settings
tvlogman 16:27430afe663e 24 float pwmPeriod = 1.0/5000.0;
tvlogman 16:27430afe663e 25 int frequency_pwm = 10000; //10kHz PWM
tvlogman 14:664870b5d153 26
tvlogman 16:27430afe663e 27 volatile float x;
tvlogman 16:27430afe663e 28 volatile float x_prev =0;
tvlogman 16:27430afe663e 29 volatile float y; // filtered 'output' of ReadAnalogInAndFilter
tvlogman 14:664870b5d153 30
tvlogman 17:616ce7bc1f96 31 // Initializing encoder
tvlogman 10:e23cbcdde7e3 32 Ticker encoderTicker;
tvlogman 10:e23cbcdde7e3 33 volatile int counts = 0;
tvlogman 12:0462757e1ed2 34 volatile float revs = 0.00;
tvlogman 7:1bffab95fc5f 35
tvlogman 10:e23cbcdde7e3 36 void readEncoder(){
tvlogman 10:e23cbcdde7e3 37 counts = Encoder.getPulses();
tvlogman 17:616ce7bc1f96 38 revs = counts/(131*64.0f);
tvlogman 17:616ce7bc1f96 39 pc.printf("%0.2f revolutions \r\n", revs);
tvlogman 16:27430afe663e 40
tvlogman 16:27430afe663e 41 // Displaying revs in HIDscope
tvlogman 16:27430afe663e 42 x = revs; // Capture data
tvlogman 16:27430afe663e 43 y = (x_prev + x)/2.0; // averaging filter
tvlogman 16:27430afe663e 44 x_prev = x; // Prepare for next round
tvlogman 16:27430afe663e 45
tvlogman 10:e23cbcdde7e3 46 }
tvlogman 14:664870b5d153 47
tvlogman 14:664870b5d153 48 void killSwitch(){
tvlogman 15:b76b8cff4d8f 49 pc.printf("Motors turned off");
tvlogman 15:b76b8cff4d8f 50 currentState = KILLED;
tvlogman 14:664870b5d153 51 }
tvlogman 14:664870b5d153 52
tvlogman 15:b76b8cff4d8f 53 void turnMotorsOn(){
tvlogman 15:b76b8cff4d8f 54 pc.printf("Motors turned on");
tvlogman 15:b76b8cff4d8f 55 currentState = ACTIVE;
tvlogman 15:b76b8cff4d8f 56 }
tvlogman 15:b76b8cff4d8f 57
tvlogman 15:b76b8cff4d8f 58
tvlogman 14:664870b5d153 59 void M1switchDirection(){
tvlogman 14:664870b5d153 60 motor1_direction = !motor1_direction;
tvlogman 14:664870b5d153 61 }
vsluiter 0:c8f15874531b 62
vsluiter 0:c8f15874531b 63 int main()
tvlogman 10:e23cbcdde7e3 64 {
tvlogman 18:65e24db15c69 65 pc.baud(115200);
tvlogman 18:65e24db15c69 66 pc.printf("Entered main function");
tvlogman 14:664870b5d153 67 motor1_direction = false;
tvlogman 13:83e3672b24ee 68 motor1_pwm.period(pwmPeriod);//T=1/f
tvlogman 14:664870b5d153 69 sw2.fall(&killSwitch);
tvlogman 15:b76b8cff4d8f 70 sw3.fall(&turnMotorsOn);
tvlogman 16:27430afe663e 71 button1.rise(&M1switchDirection);
tvlogman 18:65e24db15c69 72
tvlogman 16:27430afe663e 73 encoderTicker.attach(readEncoder, 0.1);
tvlogman 15:b76b8cff4d8f 74
tvlogman 10:e23cbcdde7e3 75 pc.printf("Encoder ticker attached and baudrate set");
tvlogman 13:83e3672b24ee 76
tvlogman 15:b76b8cff4d8f 77 while(true){
tvlogman 15:b76b8cff4d8f 78 switch(currentState){
tvlogman 15:b76b8cff4d8f 79 case KILLED:
tvlogman 15:b76b8cff4d8f 80 motor1_pwm.write(0.0);
tvlogman 15:b76b8cff4d8f 81 break;
tvlogman 15:b76b8cff4d8f 82 case ACTIVE:
tvlogman 15:b76b8cff4d8f 83 motor1_pwm.write(pot.read()); // Motor speed proportional to pot meter
tvlogman 15:b76b8cff4d8f 84 break;
tvlogman 15:b76b8cff4d8f 85 }
tvlogman 15:b76b8cff4d8f 86 }
tvlogman 15:b76b8cff4d8f 87
vsluiter 0:c8f15874531b 88 }
tvlogman 7:1bffab95fc5f 89