平衡小车一边倒,求问!
如题,我做的小车目前的主要是先稳住,所以用的是角度和角速度闭环。用了一个pid,P用的是角度算的,D用的是角速度。现在的问题是,小车一开始会稳一会,几秒钟吧,调整得挺好, 然后瞬间就往一个方向倒下。求问这是什么问题?应该如何解决。 放上程序看看吧 void main(void){
InitCLK(); //设置系统时钟源
InitUart(); //串口初始化
MPU6050_Initialize();
InitT1(); //设置T1相应的寄存器
InitInterrupt();
ENGB_forward; //橘色灯亮
while(1)
{
}
}
//定时器T1中断处理函数
#pragma vector = T1_VECTOR
__interrupt void T1_ISR(void)
{
EA = 0;
MPU6050_GetRawAccelGyro(&ax, &ay, &az, &gx, &gy, &gz);
gx_a = gx/65.5;
gy_a = gy/65.5;
gz_a = gz/65.5;
ax_g = ax/8192.0;
ay_g = ay/8192.0;
az_g = az/8192.0;
IMUupdate(gx_a*0.0174533,gy_a*0.0174533,gz_a*0.0174533,ax_g,ay_g,az_g);//0.174533为PI/180 目的是将角度转弧度
PID_angle(); //角度算PID
Change_duty(PWM_angle,0);
EA = 1;
}
/****************************************************************************
* PID_angle
****************************************************************************/
void PID_angle()//位置式
{
error_0 = Pitch - angle_base;
if(error_0 < 0)
{
ENGB_forward;
i_a_p = 0;
i_a_n += error_0; if(i_a_n > intergral_limit_H){i_a_n = intergral_limit_H;}
p_a = error_0;
d_a = gy_a;
PWM_angle = (int)(p_a*Kp_a + (i_a_n+i_a_p)*Ki_a + d_a*Kd_a) - PWM_limit_L;
}
else if(error_0 > 0)
{
ENGB_backward;
i_a_n = 0;
i_a_p += error_0; if(i_a_p > intergral_limit_H){i_a_p = intergral_limit_H;}
p_a = error_0;
d_a = gy_a;
PWM_angle = (int)(p_a*Kp_a + (i_a_n+i_a_p)*Ki_a + d_a*Kd_a) + PWM_limit_L;
}
error_1 = error_0;
}
Hackerpro 发表于 2015-6-10 21:37 static/image/common/back.gif
放上程序看看吧
发上来了,麻烦给看一下吧~我在运行的时候看了下角度的输出,然后发现,过一段时间,我测量的角度会有一个跳边,比如说+10度的时候,它显示为0度,然后慢慢再回来。估计是这个原因导致我的小车会倒。我用的是捷联算法(IMUupdate),感觉挺奇怪的这个现象。 Hackerpro 发表于 2015-6-10 21:37 static/image/common/back.gif
放上程序看看吧
发上来了,麻烦给看一下吧~我在运行的时候看了下角度的输出,然后发现,过一段时间,我测量的角度会有一个跳边,比如说+10度的时候,它显示为0度,然后慢慢再回来。估计是这个原因导致我的小车会倒。我用的是捷联算法(IMUupdate),感觉挺奇怪的这个现象。 陀螺仪或地磁传感器 我是来围观大神解答的:o
页:
[1]