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.
Dependents: harurobo1006 harurobo_1026
Fork of EC by
Diff: SpeedController.cpp
- Revision:
- 26:45a53e3c81b1
- Parent:
- 24:8ac46a6d2ac4
- Child:
- 27:72711b6cbe2a
diff -r d73c40fd4b55 -r 45a53e3c81b1 SpeedController.cpp
--- a/SpeedController.cpp Fri Jul 07 09:05:42 2017 +0000
+++ b/SpeedController.cpp Wed Aug 02 06:55:54 2017 +0000
@@ -5,7 +5,9 @@
SpeedControl::SpeedControl(PinName signalA , PinName signalB , PinName signalZ , int s , double t , PinName pwm_F , PinName pwm_B) : Ec(signalA,signalB,signalZ,s,t) , pwm_F_(pwm_F),pwm_B_(pwm_B) {
- Kv_p=0;Kv_d=0;Kv_i=0;diff=0;diff_old=0;integral=0;now_time_=0;old_time_=0;
+
+ Kv_p=0;Kv_d=0;diff=0;diff_old=0;now_time_=0;old_time_=0;
+ now_omega=0;now_RPM=0;
out_duty=0;out=0;duty=0;
pwm_F_.period_us(100);
pwm_B_.period_us(100);
@@ -16,12 +18,11 @@
now_omega=omega;
now_time_=timer.read();
diff= target_omega-now_omega;
- integral+=diff;
- out_duty=Kv_p*diff+Kv_d*(diff-diff_old)/(now_time_-old_time_)+Kv_i*integral*(now_time_-old_time_);
+ out_duty=Kv_p*diff+Kv_d*(diff-diff_old)/(now_time_-old_time_);
diff_old=diff;
if(out_duty>0.1)out_duty=0.1;
if(out_duty<-0.1)out_duty=-0.1;
- if((duty>0)&&(duty<0.95)) out+=out_duty;
+ if((duty>=-0.95)&&(duty<=0.95)) out+=out_duty;
duty=0.0001*out+target_omega/C;
if(duty<-0.95)duty=-0.95;
else if(duty>0.95)duty=0.95;
@@ -41,6 +42,9 @@
if(duty>0.95) {
pwm_F_=0.95;
pwm_B_=0;
+ } else if(duty<0) {
+ pwm_F_=0;
+ pwm_B_=0;
} else {
pwm_F_=duty;
pwm_B_=0;
@@ -51,13 +55,17 @@
if(duty>0.95) {
pwm_F_=0;
pwm_B_=0.95;
+ } else if(duty<0) {
+ pwm_F_=0;
+ pwm_B_=0;
} else {
pwm_F_=0;
pwm_B_=duty;
}
}
-void SpeedControl::Accelarate(double target_duty){
+//RC2017で一時期使っていたがあまり出来が良くないので消し飛ばしました。ただ完全に消去するのもあれなので一応コメントアウトという形で残したよ
+/*void SpeedControl::Accelarate(double target_duty){
double now_speed,old_speed;
double duty;
int start_point;
@@ -102,32 +110,31 @@
}
}
}
-}
+}*/
-void SpeedControl::ScZ(double target_RPM){
+/*void SpeedControl::ScZ(double target_RPM){
now_RPM=getRPM();
//if(fabs(now_RPM-target_RPM)>300) Accelarate(target_RPM/C);
diff=target_RPM-now_RPM;
integral+=diff;
- out_duty=0.01*(Kv_p*diff+Kv_d*(diff-diff_old)+Kv_i*integral);
+ out_duty=0.01*(Kv_p*diff+Kv_d*(diff-diff_old));
diff_old=diff;
if(out_duty>0.04)out_duty=0.04;
if(out_duty<-0.04)out_duty=-0.04;
if((duty>=0)&&(duty<0.95)) out+=out_duty;
- duty=0.0001*out/*+target_RPM/C*/;
+ duty=0.0001*out+target_RPM/C;
if(duty>=0.95) {
duty=0.94;
out=0.94/0.0001;
}
turnF(duty);
-}
+}*/
void SpeedControl::ScZ2(double target_RPM){
now_time_=timer.read();
now_RPM=getRPM();
diff=target_RPM-now_RPM;
- integral+=diff;
- out_duty=(now_time_-old_time_)*Kv_p*diff+Kv_d*(diff-diff_old)/(now_time_-old_time_)+Kv_i*integral;
+ out_duty=(now_time_-old_time_)*Kv_p*diff+Kv_d*(diff-diff_old)/(now_time_-old_time_);
old_time_=now_time_;
diff_old=diff;
if(out_duty>0.001)out_duty=0.001;
@@ -138,10 +145,9 @@
}
-void SpeedControl::setPIDparam(double p,double i,double d){
+void SpeedControl::setPDparam(double p,double d){
Kv_p=p;
Kv_d=d;
- Kv_i=i;
}
@@ -152,7 +158,7 @@
void SpeedControl::reset(){
S=0;stateA=0;stateB=0;count=0;pre_count=0.0,omega=0;
rev=0;now_time=0;old_time=0;RPM=0;RPM_old=0;
- diff=0;diff_old=0;integral=0;now_time_=0;old_time_=0;
+ diff=0;diff_old=0;now_time_=0;old_time_=0;
out=0;out_duty=0;
}
@@ -160,4 +166,3 @@
pwm_F_=0;
pwm_B_=0;
}
-
