Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: main.cpp
- 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