Teleoperation code

Dependencies:   QEI mbed

Files at this revision

API Documentation at this revision

Comitter:
sangbae
Date:
Mon Sep 26 19:40:10 2022 +0000
Commit message:
Teleoperation code for two motors using impedance control

Changed in this revision

QEI.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
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r c4bd1a2d961e QEI.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QEI.lib	Mon Sep 26 19:40:10 2022 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/sangbae/code/QEI/#f39ce45861fb
diff -r 000000000000 -r c4bd1a2d961e main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Sep 26 19:40:10 2022 +0000
@@ -0,0 +1,143 @@
+//Ben Katz, September 2013
+
+#include "mbed.h"
+#include "QEI.h"
+#include <fstream>
+#include <iomanip>
+//Declaring pins
+LocalFileSystem local("local");
+Timer t;
+float analogSignal;
+float Angle1;
+float preAngle1=0;
+float Angle2;
+float preAngle2=0;
+
+float mCurrent1;
+float mCurrent2;
+float dCurrent1;
+float dCurrent2;
+float dAngle1;
+float dAngle2;
+float dAngularVelocity1=0;
+float dAngularVelocity2=0;
+float AngularVelocity1;
+float AngularVelocity2;
+float duty1;
+float duty2;
+float alpha;
+float CurrentControlPeriod;
+float DataSavingPeriod=0.005;
+
+float Kp=5;
+float Kd=0.04;
+float Kv=0.35;
+float R=2.2;
+float Ki=5;
+DigitalOut dOut1(p5);
+DigitalOut dOut2(p7);  //pin 5 set as a digital output  Pins 5-30 can be used as digital I/O.
+DigitalOut dOut3(p8);
+DigitalOut dOut4(p9);
+//pin 6 set as digital input.
+AnalogIn aIn1(p16);
+AnalogIn aIn2(p17);  //pin 15 set as analog input.  Pins 15-20 can be used as analog inputs.
+PwmOut pwmOut1(p21);
+PwmOut pwmOut2(p22);   //pin 21 set as PWM output.  Pins 21-26 can be used as PWM outputs.
+QEI motor1(p27, p28, NC, 1200, QEI::X4_ENCODING);
+QEI motor2(p23, p24, NC, 1200, QEI::X4_ENCODING);
+//ofstream out;
+FILE *fp= fopen("/local/data.csv","w");
+
+//Serial pc(USBTX, USBRX);  //create a serial connection to the computer over the tx/rx pins
+
+void Control()
+{
+  dAngle1 =motor2.getPulses()/1200.0*6.283;;
+    dAngularVelocity1=AngularVelocity2;
+    preAngle1=Angle1;
+    Angle1 = motor1.getPulses();
+    Angle1 =Angle1/1200.0*6.283;
+    AngularVelocity1 =(Angle1-preAngle1)/CurrentControlPeriod;
+    mCurrent1  = aIn1.read()*3.3/.14;
+    
+     dCurrent1 = 3*(dAngle1-Angle1)+0.04*(dAngularVelocity1-AngularVelocity1)
+
+    if (dCurrent1>0) {
+        dOut1=1;
+        dOut2=0;
+        duty1= (abs(dCurrent1)*2.10+0.35*abs(AngularVelocity1)+5*(abs(dCurrent1)-mCurrent1))/12.0;
+    } else if (dCurrent1<0) {
+        dOut1=0;
+        dOut2=1;
+        duty1= (abs(dCurrent1)*2.10-0.35*abs(AngularVelocity1)+5*(abs(dCurrent1)-mCurrent1))/12.0;
+    }
+
+    if (duty1>0.99) {
+        duty1 =1;
+    }
+
+    pwmOut1.write(duty1);
+        // Convert to Radians
+ 
+
+
+
+ 
+     dAngle2 =motor1.getPulses()/1200.0*6.283;;
+    dAngularVelocity1=AngularVelocity2;
+    preAngle2=Angle2;
+    Angle2 = motor2.getPulses();
+    Angle2 =Angle2/1200.0*6.283;
+    AngularVelocity2 =(Angle2-preAngle2)/CurrentControlPeriod;
+    mCurrent2  = aIn2.read()*3.3/.14;
+    
+    dCurrent2 = 3*(dAngle2-Angle2)+0.04*(dAngularVelocity2-AngularVelocity2); //0.016-p  gain 0.04- D gain
+
+    if (dCurrent2>0) {
+        dOut3=1;
+        dOut4=0;
+        duty2= (abs(dCurrent2)*2.10+0.35*abs(AngularVelocity2)+5*(abs(dCurrent2)-mCurrent2))/12.0;
+    } else if (dCurrent2<0) {
+        dOut3=0;
+        dOut4=1;
+        duty2= (abs(dCurrent2)*2.10-0.35*abs(AngularVelocity2)+5*(abs(dCurrent2)-mCurrent2))/12.0;
+    }
+
+    if (duty2>0.99) {
+        duty2 =1;
+    }
+
+    pwmOut2.write(duty2);
+
+
+
+}
+
+void Save()
+{
+     fprintf(fp, "%F,%F\n",mCurrent1,Angle1);
+}
+
+
+
+Ticker control;
+Ticker save;
+int main()
+{
+    alpha=0.0;
+    CurrentControlPeriod=0.001;
+    DataSavingPeriod=0.005;
+
+    pwmOut1.period(0.0001);
+    pwmOut2.period(0.0001);
+
+    //Set PWM output freqency to 20 kHz
+    control.attach(&Control,CurrentControlPeriod);
+
+    save.attach(&Save,DataSavingPeriod);
+    wait (1);
+
+
+    //  fclose(fp);
+
+}
diff -r 000000000000 -r c4bd1a2d961e mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Mon Sep 26 19:40:10 2022 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/a9913a65894f
\ No newline at end of file