EMG control + motor control of motor 1 + 2

Dependencies:   HIDScope MODSERIAL QEI biquadFilter mbed

Fork of ControlClaire by Margreet Morsink

Committer:
s1558382
Date:
Mon Oct 17 14:32:26 2016 +0000
Revision:
7:5b14dbb9e6d1
Parent:
6:7a2c82af02e9
Child:
8:e16b1bd2f344
HIDScope werkt met radians!!

Who changed what in which revision?

UserRevisionLine numberNew contents of line
s1558382 0:62fe4a2a8101 1 #include "mbed.h"
s1558382 1:43fad4d1dee0 2 #include "MODSERIAL.h"
s1558382 0:62fe4a2a8101 3 #include "QEI.h"
s1558382 0:62fe4a2a8101 4 #include "math.h"
s1558382 7:5b14dbb9e6d1 5 #include "HIDScope.h"
s1558382 0:62fe4a2a8101 6
s1558382 1:43fad4d1dee0 7 //Defining ports
s1558382 2:29d7391d7bc5 8 DigitalOut motor1DirectionPin (D4);
s1558382 2:29d7391d7bc5 9 PwmOut motor1MagnitudePin(D5);
s1558382 1:43fad4d1dee0 10 DigitalIn button(D2);
s1558382 1:43fad4d1dee0 11 AnalogIn potmeter(A0);
s1558382 0:62fe4a2a8101 12 Serial pc(USBTX,USBRX);
s1558382 5:97977cb8daa3 13 QEI encoder(D12,D13,NC,32);
s1558382 7:5b14dbb9e6d1 14 HIDScope scope(1);
s1558382 0:62fe4a2a8101 15
s1558382 2:29d7391d7bc5 16 // Setting tickers and printers
s1558382 4:f1e5bfca905a 17 Ticker tick;
s1558382 2:29d7391d7bc5 18 Ticker callMotor;
s1558382 6:7a2c82af02e9 19 Ticker pos;
s1558382 2:29d7391d7bc5 20
s1558382 5:97977cb8daa3 21 const float pi = 3.14159265359;
s1558382 6:7a2c82af02e9 22 const float ts = 1.0/1000.0;
s1558382 7:5b14dbb9e6d1 23 const int velocityChannel = 0;
s1558382 7:5b14dbb9e6d1 24
s1558382 1:43fad4d1dee0 25 //Get reference velocity
s1558382 1:43fad4d1dee0 26 float GetReferenceVelocity()
s1558382 0:62fe4a2a8101 27 {
s1558382 1:43fad4d1dee0 28 // Returns reference velocity in rad/s.
s1558382 1:43fad4d1dee0 29 // Positive value means clockwise rotation.
s1558382 1:43fad4d1dee0 30 const float maxVelocity = 8.4; //Als de potmeter van 0 tot 1 gaat (als die maar tot 0.25 gaat, dan max velocity 4x zo groot als motorgain maken
s1558382 1:43fad4d1dee0 31 volatile float referenceVelocity; // in rad/s
s1558382 1:43fad4d1dee0 32 if (button) //nog even kijken voor wanneer die + en - is
s1558382 1:43fad4d1dee0 33 {
s1558382 1:43fad4d1dee0 34 // Clockwise rotation
s1558382 1:43fad4d1dee0 35 referenceVelocity = potmeter * maxVelocity;
s1558382 1:43fad4d1dee0 36 }
s1558382 1:43fad4d1dee0 37 else
s1558382 1:43fad4d1dee0 38 {
s1558382 1:43fad4d1dee0 39 // Counterclockwise rotation
s1558382 1:43fad4d1dee0 40 referenceVelocity = -1*potmeter * maxVelocity;
s1558382 1:43fad4d1dee0 41 }
s1558382 1:43fad4d1dee0 42 return referenceVelocity;
s1558382 0:62fe4a2a8101 43 }
s1558382 0:62fe4a2a8101 44
s1558382 2:29d7391d7bc5 45 void SetMotor1(float motorValue)
s1558382 2:29d7391d7bc5 46 {
s1558382 1:43fad4d1dee0 47 //Given -1<=motorValue<=1, this sets the PWM and direction
s1558382 1:43fad4d1dee0 48 // bits for motor 1. Positive value makes motor rotating
s1558382 1:43fad4d1dee0 49 // clockwise. motorValues outside range are truncated to
s1558382 1:43fad4d1dee0 50 // within range
s1558382 1:43fad4d1dee0 51 if (motorValue >=0)
s1558382 0:62fe4a2a8101 52 {
s1558382 2:29d7391d7bc5 53 motor1DirectionPin=1;
s1558382 1:43fad4d1dee0 54 }
s1558382 0:62fe4a2a8101 55 else
s1558382 0:62fe4a2a8101 56 {
s1558382 2:29d7391d7bc5 57 motor1DirectionPin=0;
s1558382 0:62fe4a2a8101 58 }
s1558382 1:43fad4d1dee0 59 if (fabs(motorValue)>1)
s1558382 1:43fad4d1dee0 60 {
s1558382 2:29d7391d7bc5 61 motor1MagnitudePin = 1;
s1558382 1:43fad4d1dee0 62 }
s1558382 1:43fad4d1dee0 63 else
s1558382 1:43fad4d1dee0 64 {
s1558382 2:29d7391d7bc5 65 motor1MagnitudePin = fabs(motorValue);
s1558382 1:43fad4d1dee0 66 }
s1558382 0:62fe4a2a8101 67 }
s1558382 0:62fe4a2a8101 68
s1558382 0:62fe4a2a8101 69 float FeedForwardControl(float referenceVelocity)
s1558382 0:62fe4a2a8101 70 {
s1558382 1:43fad4d1dee0 71 // very simple linear feed-forward control
s1558382 1:43fad4d1dee0 72 const float MotorGain=8.4; // unit: (rad/s) / PWM
s1558382 1:43fad4d1dee0 73 float motorValue = referenceVelocity / MotorGain;
s1558382 1:43fad4d1dee0 74 return motorValue;
s1558382 1:43fad4d1dee0 75 }
s1558382 1:43fad4d1dee0 76
s1558382 2:29d7391d7bc5 77 void MeasureAndControl(void)
s1558382 0:62fe4a2a8101 78 {
s1558382 1:43fad4d1dee0 79 // This function measures the potmeter position, extracts a
s1558382 1:43fad4d1dee0 80 // reference velocity from it, and controls the motor with
s1558382 1:43fad4d1dee0 81 // a simple FeedForward controller. Call this from a Ticker.
s1558382 1:43fad4d1dee0 82 float referenceVelocity = GetReferenceVelocity();
s1558382 1:43fad4d1dee0 83 float motorValue = FeedForwardControl(referenceVelocity);
s1558382 1:43fad4d1dee0 84 SetMotor1(motorValue);
s1558382 0:62fe4a2a8101 85 }
s1558382 5:97977cb8daa3 86
s1558382 6:7a2c82af02e9 87 volatile float radians;
s1558382 7:5b14dbb9e6d1 88 volatile float derivative;
s1558382 6:7a2c82af02e9 89
s1558382 5:97977cb8daa3 90 // position and things w/ encoder & QEI
s1558382 5:97977cb8daa3 91 void getPosition() {
s1558382 5:97977cb8daa3 92 volatile int pulses = encoder.getPulses();
s1558382 7:5b14dbb9e6d1 93 radians = (pulses / (2 * 3591.84)) * 2*pi; //2 = encoding type, 3591.84 = counts per revoluton
s1558382 6:7a2c82af02e9 94 volatile float prevRadians = radians;
s1558382 7:5b14dbb9e6d1 95 derivative = (radians - prevRadians) / ts;
s1558382 7:5b14dbb9e6d1 96
s1558382 7:5b14dbb9e6d1 97 scope.set(velocityChannel,radians);
s1558382 7:5b14dbb9e6d1 98 scope.send();
s1558382 5:97977cb8daa3 99 }
s1558382 2:29d7391d7bc5 100
s1558382 4:f1e5bfca905a 101 void print() {
s1558382 4:f1e5bfca905a 102 pc.printf("Motor value = %f \r\n", FeedForwardControl(GetReferenceVelocity()));
s1558382 4:f1e5bfca905a 103 pc.printf("Reference Velocity = %f \r\n", GetReferenceVelocity());
s1558382 6:7a2c82af02e9 104 pc.printf("Radians = %f \r\n", radians);
s1558382 7:5b14dbb9e6d1 105 pc.printf("Velocity = %f \r\n", derivative);
s1558382 4:f1e5bfca905a 106 }
s1558382 1:43fad4d1dee0 107
s1558382 1:43fad4d1dee0 108 int main()
s1558382 0:62fe4a2a8101 109 {
s1558382 2:29d7391d7bc5 110 motor1MagnitudePin.period(1.0/100000.0);
s1558382 6:7a2c82af02e9 111 pos.attach(getPosition,ts);
s1558382 2:29d7391d7bc5 112 callMotor.attach(MeasureAndControl,1);
s1558382 1:43fad4d1dee0 113 pc.baud(115200);
s1558382 4:f1e5bfca905a 114 tick.attach(print,1);
s1558382 5:97977cb8daa3 115 while(1);
s1558382 0:62fe4a2a8101 116 }