Bei mein balance bot geht das wiederkeren ziemlich gut. Siehe mal video http://www.youtube.com/watch?v=a1EfgqLcNzc
Um den PWM-wert zu regelen nutze ich die summe von 4 factoren :
1. Winkel
2. Winkelgeschwindigkeit
3. Raddrehzahl
4. Position
Code:void task_balance(void) { int16_t distance= (mleft_dist+mright_dist)/8; if (distance>100) distance=100; //maximale correctie distance = 100*10/8=125 PWM if (distance<-100) distance=-100; // komt overeen met 0.4*200= +/- 100 mm speed= mleft_speed+mright_speed-des_speed; //max correctie = 180*10/4= 450 PWM, snelheid instellen if(speed>5) sollwert++; if(speed<-5)sollwert--; //offset correctie in geval van grote weerstand en hellingen pwm=(sollwert-gyro_hoek)*P_balance/4+gyro_d*D_balance/64+distance*P_distance/8+speed*P_speed/4;//speed*P_speed/4; offset=e_compass/4; //richting korrectie volgens e_compass if(offset>max_offset) offset=max_offset; // begrenzing draaisnelheid if(offset<-max_offset)offset=-max_offset; pwm_L=pwm-offset; //offset voor draaien pwm_R=pwm+offset; if (pwm_L>10) pwm_L=pwm_L+100; //correctie aanloopkoppel min PWM = 120 if (pwm_L<-10) pwm_L=pwm_L-100; //if((pwm_L<=15)&(pwm_L>=-105)) pwm_L=7*pwm_L; if (pwm_R>10) pwm_R=pwm_R+100; //correctie aanloopkoppel min PWM = 120 if (pwm_R<-10) pwm_R=pwm_R-100; //if((pwm_R<=15)&(pwm_R>=-15)) pwm_R=7*pwm_R; setMotorPower(pwm_L,pwm_R); //offset voor draaien robot PWM-L -offset, R+offset if((sollwert-gyro_hoek)>450) {setMotorPower(0,0);program=0;} //noodstop, robot is omgevallen if((sollwert-gyro_hoek)<-450) {setMotorPower(0,0); program=0;} }







Zitieren

Lesezeichen