potmeter motor ffwd

Dependencies:   mbed QEI HIDScope biquadFilter MODSERIAL Encoder FastPWM

Files at this revision

API Documentation at this revision

Comitter:
linde101
Date:
Mon Oct 28 16:31:37 2019 +0000
Parent:
1:b862262a9d14
Commit message:
Potentiometer aangestuurde motoren feed-forward;

Changed in this revision

Encoder.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
diff -r b862262a9d14 -r 6ca30ccec353 Encoder.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Encoder.lib	Mon Oct 28 16:31:37 2019 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/vsluiter/code/Encoder/#18b000b443af
diff -r b862262a9d14 -r 6ca30ccec353 main.cpp
--- a/main.cpp	Wed Sep 04 15:30:13 2019 +0000
+++ b/main.cpp	Mon Oct 28 16:31:37 2019 +0000
@@ -1,23 +1,163 @@
 #include "mbed.h"
+#include "math.h"
+#include "encoder.h"
+#include "QEI.h"
 //#include "HIDScope.h"
-//#include "QEI.h"
-#include "MODSERIAL.h"
-//#include "BiQuad.h"
-//#include "FastPWM.h"
+// ---- Alles met een 1(of geen getal) gaat over motor 1----
+// ---- Alles met een 2 gaat over motor 2---- 
+// ------ Hardware Interfaces -------
+ 
+const PinName motor1dir = D7; //direction1 (cw,ccw)
+const PinName motor1PWM = D6; //speed1
+const PinName motor2PWM = D5; //speed2
+const PinName motor2dir = D4; //direction2 (cw,ccw)
+ 
+DigitalOut motor1direction(motor1dir);
+PwmOut motor1control(motor1PWM);
+PwmOut motor2control(motor2PWM);
+DigitalOut motor2direction(motor2dir);
+ 
+const PinName button1name = D10; 
+const PinName pot1name = A0;
+const PinName button2name = D11;
+const PinName pot2name = A1;
+InterruptIn button1(button1name);    //had ook direct gekund maar he
+AnalogIn potMeterIn1(pot1name);
+InterruptIn button2(button2name);
+AnalogIn potMeterIn2(pot2name);
 
-DigitalOut led(LED_RED);
+QEI Encoder1(D13,D12,NC,64,QEI::X4_ENCODING);           //64 = ..., x4 encoding because ...
+QEI Encoder2(D9,D8,NC,64,QEI::X4_ENCODING); 
+// ------- Objects used -------
+ 
+// Ticker which controls the mother every 1/100 of a second.
+Ticker controlTicker;
+ 
+Ticker debugTicker;
+Serial pc(USBTX, USBRX);
+ 
+//HIDScope scope(2); //fuck you hidscope we're not using you!
+ 
+ 
+// ------- Constants
+const float motorGain = 8f;         //just to be sure, niet te veel input geven tegen windup (old motor, suboptimal perfomance)
+const float maxVelocity = 8f; //radians per second
+const bool clockwise = true;
+const float rad_count = 0.0007479;   // 2pi/8400;
+const float pi = 3.1415926;
+ 
+// ------ variables
+ 
+volatile bool direction1 = clockwise;
+volatile bool direction2 = clockwise;
+ 
+// ------ functions
+ 
+float getReferenceVelocity() {
+    // Returns reference velocity in rad/s. 
+    return maxVelocity * potMeterIn1 ;
+    }
+float getReferenceVelocity2() {
+    // Returns reference velocity in rad/s. 
+    return maxVelocity * potMeterIn2;    
+}
+ 
+void setMotor1(float motorValue1) {
+    // Given motorValue1<=1, writes the velocity to the pwm control.
+    // MotorValues outside range are truncated to within range.
+    motor1control.write(fabs(motorValue1) > 1 ? 1 : fabs(motorValue1));
+}
+ 
+void setMotor2(float motorValue2) {
+    // Given motorValue2<=1, writes the velocity to the pwm control.
+    // MotorValues outside range are truncated to within range.
+    motor2control.write(fabs(motorValue2) > 1 ? 1 : fabs(motorValue2));
+}
+ 
+float feedForwardControl(float referenceVelocity) {
+    // very simple linear feed-forward control
+    // returns motorValue
+    return referenceVelocity / motorGain;
+}
+ 
+float feedForwardControl2(float referenceVelocity2) {
+    // very simple linear feed-forward control
+    // returns motorValue
+    return referenceVelocity2 / motorGain;
+}
+ 
+void measureAndControl(void) {
+    // This function measures the potmeter position, extracts a
+    // reference velocity from it, and controls the motor with 
+    // a simple FeedForward controller. Call this from a Ticker.
+    float referenceVelocity = getReferenceVelocity();
+    float motorValue1 = feedForwardControl(referenceVelocity);
+    setMotor1(motorValue1);
+ 
+    float referenceVelocity2 = getReferenceVelocity2();
+    float motorValue2 = feedForwardControl2(referenceVelocity2);
+    setMotor2(motorValue2);
+} 
+ 
+void onButtonPress() {
+    // reverses the direction
+    motor1direction.write(direction1 = !direction1);
+    pc.printf("direction: %s\r\n\n", direction1 ? "clockwise" : "counter clockwise");
+}
+ 
+void onButtonPress2() {
+    // reverses the direction
+    motor2direction.write(direction2 = !direction2);
+    pc.printf("direction: %s\r\n\n", direction2 ? "clockwise" : "counter clockwise");
+} 
 
-MODSERIAL pc(USBTX, USBRX);
+float Encoding()
+{
+    // Encoding is necessary for the computations of the joint angles and 
+    // velocities of the arm given certain linear velocities. 
+ 
+    double counts1 = Encoder1.getPulses();
+    double rad_m1 = (rad_count * (double)counts1) + (1.0f*pi/3.0f);
+    return rad_m1;
+} 
+
+float Encoding2()
+{
+    // Encoding is necessary for the computations of the joint angles and 
+    // velocities of the arm given certain linear velocities. 
+ 
+    double counts2 = Encoder2.getPulses();
+    double rad_m2 = (rad_count * (double)counts2) + (7.0f*pi/4.0f);
+    return rad_m2;
+} 
 
+   void onDebugTick() {
+    
+    pc.printf("pot input1: %f\r\n", potMeterIn1.read());
+    pc.printf("motorValue1: %f\r\n", feedForwardControl(getReferenceVelocity()));
+    pc.printf("radialen motor 1: %f\r\n",Encoding());
+
+    pc.printf("\n\n\n");
+    
+    /*
+    scope.set(0, potMeterIn.read());
+    scope.set(1, feedForwardControl(getReferenceVelocity()));
+    scope.send();
+    */
+    pc.printf("pot input2: %f\r\n", potMeterIn2.read());
+    pc.printf("motorValue2: %f\r\n", feedForwardControl2(getReferenceVelocity2()));
+        pc.printf("radialen motor 2: %f\r\n",Encoding2());
+    pc.printf("\n\n\n");
+    }
+    
 int main()
 {
     pc.baud(115200);
-    pc.printf("\r\nStarting...\r\n\r\n");
     
-    while (true) {
-        
-        led = !led;
-        
-        wait_ms(500);
-    }
-}
+    button2.fall(&onButtonPress2);
+    controlTicker.attach(&measureAndControl, 1.0f/100.0f);
+    debugTicker.attach(&onDebugTick, 1);
+    
+    button1.fall(&onButtonPress);
+    
+}
\ No newline at end of file