MotorDrive制御
Dependencies: mbed Motor PID QEI2 fusion_Motor
Revision 0:8719ed91e6fd, committed 2015-09-23
- Comitter:
- kikoaac
- Date:
- Wed Sep 23 06:06:49 2015 +0000
- Commit message:
- No mount QEI
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Pin.h Wed Sep 23 06:06:49 2015 +0000 @@ -0,0 +1,8 @@ +#define QEI1_A PB_13 +#define QEI1_B PC_4 +#define QEI2_A PB_15 +#define QEI2_B PB_14 +#define QEI3_A PB_2 +#define QEI3_B PB_1 +#define QEI4_A PA_11 +#define QEI4_B PB_12
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Wed Sep 23 06:06:49 2015 +0000
@@ -0,0 +1,280 @@
+/*
+motor 555
+Lipo 4sel
+Linear accelerator
+Not mount QEI
+*/
+#include "mbed.h"
+#include "Motor.h"
+#include "PID.h"
+#include "QEI.h"
+#include "fusion_Motor.h"
+#include "Pin.h"
+#define Lx 0.0001
+#define Ku 0.32200//0.922000
+#define Pu 0.0125
+#define Kp Ku*0.6
+#define Ti Pu*0.5
+#define Td Pu*0.125
+
+
+char data=0,speed=0,sot=0,Data2=0;
+#define P Kp
+#define I Kp/Ti
+#define D Kp*Td
+#define Mstate 6
+#define SorT 5
+#define Databit 0
+#define TIME 0.0125
+Timer Time;
+/*
+PID p(P,I,D,&Time);
+QEI i(QEI1_A,QEI1_B,NC,50,&Time);
+Motor d(PD_2,PA_13,PA_14,PA_15,PC_9);
+fusion_Motor mecanam3(i,p,d);
+*/
+
+
+Serial device(D8,D2);
+/*
+PID *pid;
+QEI *wheel;
+Motor *motor;
+*/
+PID pid[4] = {PID(P,I,D,&Time),PID(P,I,D,&Time),PID(P,I,D,&Time),PID(P,I,D,&Time)};
+QEI wheel[4] = {QEI(QEI1_A,QEI1_B,NC,100,&Time),QEI(QEI2_A,QEI2_B,NC,100,&Time),QEI(QEI3_A,QEI3_B,NC,100,&Time),QEI(QEI4_A,QEI4_B,NC,100,&Time)};
+Motor motor[4] = {Motor(A1,A2,A3,A4,A0),Motor(PD_2,PA_13,PA_14,PA_15,PC_9),Motor(D5,D4,D3,PB_8,PB_9),Motor(D12,D11,D10,D9,D7)};
+fusion_Motor mecanam[4] = {
+ fusion_Motor(wheel[0],pid[0],motor[0]),//front right
+ fusion_Motor(wheel[1],pid[1],motor[1]),//Back right
+ fusion_Motor(wheel[2],pid[2],motor[2]),//front left
+ fusion_Motor(wheel[3],pid[3],motor[3])
+};
+PwmOut led(A0);
+//back left
+//Motor d(D5,D4,D3,D1,D0);
+/*
+void Delete()
+{
+ delete pid;
+ delete wheel;
+ delete motor;
+}
+fusion_Motor *mecanam1;
+fusion_Motor *mecanam2;
+fusion_Motor *mecanam3;
+fusion_Motor *mecanam4;
+void setup()
+{
+ pid = new PID(P,I,D,&Time);
+ wheel = new QEI(QEI1_A,QEI1_B,NC,100,&Time);
+ motor = new Motor(A1,A2,A3,A4,A0);
+ mecanam1 = new fusion_Motor(*wheel,*pid,*motor);
+ Delete();
+ pid = new PID(P,I,D,&Time);
+ wheel = new QEI(QEI1_A,QEI1_B,NC,100,&Time);
+ motor = new Motor(D4,D3,D2,D1,D0);
+ mecanam2 = new fusion_Motor(*wheel,*pid,*motor);
+ Delete();
+ pid = new PID(P,I,D,&Time);
+ wheel = new QEI(QEI1_A,QEI1_B,NC,100,&Time);
+ motor = new Motor(PD_2,PA_13,PA_14,PA_15,PC_9);
+ mecanam3 = new fusion_Motor(*wheel,*pid,*motor);
+ Delete();
+ pid = new PID(P,I,D,&Time);
+ wheel = new QEI(QEI1_A,QEI1_B,NC,100,&Time);
+ motor = new Motor(PC_7,PB_6,PA_7,PA_6,PA_8);
+ mecanam4 = new fusion_Motor(*wheel,*pid,*motor);
+ Delete();
+}
+*/
+/*
+ |
+ L\ /R
+ - -
+ R/ \L
+ |
+*/
+enum STATE {
+ R,L,F,B
+} state;
+PwmOut LED(LED1);
+#define PI 3.141592653589793
+float DUTY_fill[4]= {0};
+float DUTY_inte[4]= {0};
+float DUTY[4]= {0};
+float DUTY_prev[4]= {0};
+float GAIN_P=P,GAIN_I=I,GAIN_D=D;
+void ACT(float tardata,float *data,fusion_Motor *fusion,float *fill,float *inte,float *prev_dat)
+{
+ float inter = TIME;
+ float dat = tardata-*data;
+ *inte += (dat + *prev_dat)/2*inter;
+ *data = GAIN_P*dat+GAIN_D**fill+GAIN_I**inte;
+ *fill = (dat - *prev_dat)*inter;
+ *prev_dat =dat;
+
+ /*
+ if(tardata>*data)
+ *data+=0.01f;
+ if(tardata<*data)
+ *data-=0.01f;*/
+ *fusion=*data;
+}
+void motruns(STATE RorL,float data)
+{
+ if(RorL == R) {
+
+ ACT(data,&DUTY[R],&mecanam[R],&DUTY_fill[R],&DUTY_inte[R],&DUTY_prev[R]);
+ ACT(data,&DUTY[R+2],&mecanam[R+2],&DUTY_fill[R+2],&DUTY_inte[R+2],&DUTY_prev[R+2]);
+ } else if(RorL == L) {
+ ACT(data,&DUTY[L],&mecanam[L],&DUTY_fill[L],&DUTY_inte[L],&DUTY_prev[L]);
+ ACT(data,&DUTY[L+2],&mecanam[L+2],&DUTY_fill[L+2],&DUTY_inte[L+2],&DUTY_prev[L+2]);
+ }
+}
+double mecCot(float angle,STATE RorL)
+{
+ double radian = (double)angle * PI / 180.0;
+ return RorL==R ? 1.4142135623730950488016887242097*sin(radian-PI/4-PI/2) : 1.4142135623730950488016887242097*cos(radian-PI/4-PI/2);
+}
+void vector(float angle)
+{
+ angle-=90-360;
+ if(angle<0)angle+=360;
+ angle-=360;
+ if(angle>0)angle-=360;
+ angle*=-1;
+ motruns(R,mecCot(angle,R));
+ motruns(L,mecCot(angle,L));
+ printf("%5.5f %5.5f %5.5f ",angle , mecCot(angle,L),mecCot(angle,R));
+}
+
+
+void pid_setpoint()
+{
+ for(int i=0; i<4; i++)
+ pid[i].dPoint=wheel[i].getRPM();
+}
+void pid_start()
+{
+ for(int i=0; i<4; i++)
+ pid[i].start();
+}
+void pid_reset()
+{
+ for(int i=0; i<4; i++)
+ pid[i].pid_reset();
+}
+void getData()
+{
+
+ data = device.getc();
+ speed = data>>Mstate;
+ sot = (data>>SorT)&0x01;
+ Data2 = data&0x1f;
+ //printf("%d%d%d%d%d%d%d%d ",(data&0x80)>>7,(data&0x40)>>6,(data&0x20)>>5,(data&0x10)>>4,(data&0x08)>>3,(data&0x04)>>2,(data&0x02)>>1,(data&0x01));
+ //printf("0x%x ,0x%x ,0x%x ,0x%x\r\n" ,data,speed,sot,Data2);
+ //printf("getdata!!\r\n");
+}
+bool MotorState()
+{
+ for(int a=0; a<4; a++) {
+ if(speed==0) {
+ mecanam[a].run(Free,1);
+ } else if(speed==1) {
+ mecanam[a].run(Stop,1);
+
+ } else if(speed==2) {
+ mecanam[a].duty_max(0.3);
+ mecanam[a].duty_min(-0.3);
+ } else if(speed==3) {
+ mecanam[a].duty_max(1.0);
+ mecanam[a].duty_min(-1.0);
+ }
+ }
+ return speed==0||speed==1;
+}
+float Y=1;
+void f()
+{
+ static int i;
+ float x[]= {-100,102,503,-4040};
+ Y=x[i];
+ //for(int x=0;x<4;x++)mecanam[x]=x[i];
+ //printf("Target %f\r\n",x[i]);
+ i++;
+ if(i==3)i=0;
+}
+int main()
+{
+ for(int i=0; i<4; i++) {
+ mecanam[i](fusion_Motor::Normal,1);
+ mecanam[i].run(Free,1.0);
+ }
+for(int a=0;a<4;a++){
+ mecanam[a].duty_max(1.0);
+ mecanam[a].duty_min(-1.0);}
+ led=0.5;
+ //M=0x1f;
+ //wait(3);
+ //setup();
+ device.baud(230400);
+ printf("start main\r\n");
+ //device.attach(&getData);
+ bool pidf=0;
+ bool prev_sot=0;
+
+ wait(1);
+ Ticker tic;
+ tic.attach(&f,3);
+ //mecanam3=200;
+ //for(float i=-1;i<1;i+=0.05)printf("%f\r\n",mecanam3.rerpmper(i));
+ //for(int i = 0 ;i<4;i++)mecanam[i]=100;
+ //wait(5);
+ DigitalIn PIN(USER_BUTTON);
+ while(1) {
+ //printf("start main\r\n");
+
+ for(int x = 0; 1; x++) {
+ if(PIN==0)GAIN_P+=0.001;
+ //printf("start main\r\n");
+ /*vector(Y);
+ for(int i=0; i<4; i++)
+ printf("%f ",DUTY[i]);
+ printf("%F \r\n",GAIN_P);*/
+ wait(TIME);
+ //mecanam3=mecCot(i,R);
+ //wait(0.5);
+ //printf("%5d, %5.5f , %5.5f, %5.5f\r\n",i,mecanam3.getrpm(),mecanam3.rerpmper(mecCot(i,R)),mecanam3.rpmper(300*mecCot(i,R)));
+
+ getData();
+ //wait(0.01);
+ if(MotorState())break;
+ //if(sot!=prev_sot);//pid_reset();
+
+ if(sot==0) {
+ prev_sot=sot;
+ float angle = Data2*11.25;
+ vector(angle);
+ } else if(sot==1) {
+ if(Data2==0) {
+ for(int i=0; i<2; i++) {
+ mecanam[i]=1;
+ mecanam[i+2]=-1;
+ }
+ }
+ else if(Data2==1) {
+ for(int i=0; i<2; i++) {
+ mecanam[i]=-1;
+ mecanam[i+2]=1;
+ }
+ } else {
+ for(int i=0; i<4; i++)
+ mecanam[i].run(Stop,1);
+ }
+ }
+ }
+ }
+}
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Wed Sep 23 06:06:49 2015 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/8ed44a420e5c \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/motor_lib/Motor.lib Wed Sep 23 06:06:49 2015 +0000 @@ -0,0 +1,1 @@ +http://developer.mbed.org/users/kikoaac/code/Motor/#dea2df71cb97
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/motor_lib/PID.lib Wed Sep 23 06:06:49 2015 +0000 @@ -0,0 +1,1 @@ +http://developer.mbed.org/users/kikoaac/code/PID/#3519920d064d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/motor_lib/QEI.lib Wed Sep 23 06:06:49 2015 +0000 @@ -0,0 +1,1 @@ +http://developer.mbed.org/users/kikoaac/code/QEI2/#49fa8827718d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/motor_lib/fusion_Motor.lib Wed Sep 23 06:06:49 2015 +0000 @@ -0,0 +1,1 @@ +https://developer.mbed.org/teams/2015-robotic-contest-arakawa-A/code/fusion_Motor/#0d2b4508badd