sls

Dependencies:   mbed

Revision:
1:86c4c38abe40
Parent:
0:c1476d342c13
Child:
2:55c616d2e0fe
diff -r c1476d342c13 -r 86c4c38abe40 main.cpp
--- a/main.cpp	Fri Apr 26 11:34:13 2019 +0000
+++ b/main.cpp	Sat Apr 27 04:28:33 2019 +0000
@@ -7,12 +7,21 @@
 ////////////関数
 void setup();
 void can_send();
-
-
+void pid(double,double);
+void out_lo(double);
+void out_li(double);
 
 ////////////定数
+int solution=1000;
+double c_degree=0.36;   //solution=500
 
+double Kp_lo=0.01;
+double Ki_lo=0;
+double Kd_lo=0;
+double Kp_li=0.01;
 
+double Ki_li=0;
+double Kd_li=0;
 
 
 
@@ -20,32 +29,42 @@
 double target_ro=0,target_ri=0;
 double target_lo=0,target_li=0;
 bool hand_mode=0;
+double distance_lo_old=0,distance_li_old=0,pile_lo=0,pile_li=0;
+double posi_lo=0,posi_li=0;
+double pre_time=0;
+
+Timer timer;
+
 
 
 
 /////////////////////////////////////////////
-int main() {
-    
+int main()
+{
+
     setup();
+    
     while(1) {
-        can_send();
+       can_send();
+       pid(target_lo,target_li);
         wait(0.01);
     }
 }
 
 
-void setup(){
+void setup()
+{
     can1.frequency(1000000);
     motor_lo_f.period_us(100);
     motor_lo_b.period_us(100);
     motor_li_f.period_us(100);
     motor_li_b.period_us(100);
-    
+
     hand.mode(PullUp);
     switch2.mode(PullUp);
     switch3.mode(PullUp);
     switch4.mode(PullUp);
-    
+
 
     device.baud(115200);
     device.format(8,Serial::None,1);
@@ -53,20 +72,122 @@
     wait(0.05);
     theta0=degree0;
     check_gyro();
+    timer.start();
 }
 
 
 //////////////////////////////////////can
 void can_send()
 {
-    char data[4]={0};
+    char data[4]= {0};
     int target_ro_send=target_ro+360;
     int target_ri_send=target_ri+360;
     data[0]=target_ro_send & 0b11111111;
     data[1]=target_ri_send & 0b11111111;
     data[2]=(target_ro_send>>8) | ((target_ri_send>>4) & 0b11110000);
     data[3]=hand_mode;
-    
+
     if(can1.write(CANMessage(0,data,4)))led4=1;
     else led4=0;
+}
+
+
+void out_lo(double duty)
+{
+  
+    double dutylimit=0.1;
+
+    if(duty > 0) { //入力duty比が正の場合
+        //if(duty-pre_out_r >accel_max && pre_out_l*duty>0)duty=pre_out_r+accel_max;
+        if( fabs( duty ) < dutylimit ) { //制限値内
+            motor_lo_f = fabs(duty);
+            motor_lo_b = 0;
+        } else { //制限値超
+            motor_lo_f = dutylimit;
+            motor_lo_b = 0;
+        }
+    } else {//入力duty比が負の場合
+        //if(pre_out_r-duty >accel_max  && pre_out_l*duty>0)duty=pre_out_r-accel_max;
+        if( fabs(duty) < dutylimit) { //制限値内
+            motor_lo_f = 0;
+            motor_lo_b = fabs(duty);
+        } else { //制限値超
+            motor_lo_f = 0;
+            motor_lo_b = dutylimit;
+        }
+    }
+    //pre_out_r=duty;
+}
+
+
+void out_li(double duty)
+{
+   
+    double dutylimit=0.1;
+
+    if(duty > 0) { //入力duty比が正の場合
+        //if(duty-pre_out_r >accel_max && pre_out_l*duty>0)duty=pre_out_r+accel_max;
+        if( fabs( duty ) < dutylimit ) { //制限値内
+            motor_li_f = fabs(duty);
+            motor_li_b = 0;
+        } else { //制限値超
+            motor_li_f = dutylimit;
+            motor_li_b = 0;
+        }
+    } else {//入力duty比が負の場合
+        //if(pre_out_r-duty >accel_max  && pre_out_l*duty>0)duty=pre_out_r-accel_max;
+        if( fabs(duty) < dutylimit) { //制限値内
+            motor_li_f = 0;
+            motor_li_b = fabs(duty);
+        } else { //制限値超
+            motor_li_f = 0;
+            motor_li_b = dutylimit;
+        }
+    }
+    //pre_out_r=duty;
+}
+
+void pid(double target_lo_,double target_li_)
+{
+    posi_lo=(ec_lo.getCount()%solution)*c_degree;
+    if(posi_lo<0)posi_lo+=360;
+    posi_li=(ec_li.getCount()%solution)*c_degree;
+    if(posi_li<0)posi_li+=360;
+
+    double now=timer.read();
+    double d_time=now-pre_time;
+
+    double deviation_lo=fabs(target_lo_)-posi_lo;
+    if(fabs(deviation_lo)<90) { //そのまま
+    } else if(deviation_lo>270) {
+        deviation_lo-=360;
+    } else if(deviation_lo<-270) {
+        deviation_lo+=360;
+    } else if(target_lo_>0) {
+        if(deviation_lo<0)deviation_lo+=360;
+    } else {
+        if(deviation_lo>0)deviation_lo-=360;
+    }
+
+    double deviation_li=fabs(target_li_)-posi_li;
+    if(fabs(deviation_li)<90) { //そのまま
+    } else if(deviation_li>270) {
+        deviation_li-=360;
+    } else if(deviation_li<-270) {
+        deviation_li+=360;
+    } else if(target_li_>0) {
+        if(deviation_li<0)deviation_li+=360;
+    } else {
+        if(deviation_li>0)deviation_li-=360;
+    }
+
+    pile_lo+=deviation_lo;
+    pile_li+=deviation_li;
+
+    out_lo(deviation_lo * Kp_lo + (posi_lo - distance_lo_old) / d_time * Kd_lo + pile_lo *  Ki_lo * d_time);
+    out_li(deviation_li * Kp_li + (posi_li - distance_li_old) / d_time * Kd_li + pile_li *  Ki_li * d_time);
+
+    distance_lo_old=deviation_lo;
+    distance_li_old=deviation_li;
+    pre_time=now;
 }
\ No newline at end of file