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:
Thu Sep 21 11:53:09 2017 +0000
Revision:
17:616ce7bc1f96
Parent:
16:27430afe663e
Child:
18:65e24db15c69
Child:
19:f08b5cd2b7ce
Changed variable revs to represent driving shaft revs instead of motor revs

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