极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13511|回复: 6

平衡小车一边倒,求问!

[复制链接]
发表于 2015-6-10 20:57:29 | 显示全部楼层 |阅读模式
如题,我做的小车目前的主要是先稳住,所以用的是角度和角速度闭环。用了一个pid,P用的是角度算的,D用的是角速度。现在的问题是,小车一开始会稳一会,几秒钟吧,调整得挺好, 然后瞬间就往一个方向倒下。求问这是什么问题?应该如何解决。
回复

使用道具 举报

发表于 2015-6-10 21:37:01 | 显示全部楼层
放上程序看看吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-10 22:59:26 | 显示全部楼层
[pre lang="c" line="1"]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;
}
[/code]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-10 23:01:41 | 显示全部楼层
Hackerpro 发表于 2015-6-10 21:37
放上程序看看吧

发上来了,麻烦给看一下吧~我在运行的时候看了下角度的输出,然后发现,过一段时间,我测量的角度会有一个跳边,比如说+10度的时候,它显示为0度,然后慢慢再回来。估计是这个原因导致我的小车会倒。我用的是捷联算法(IMUupdate),感觉挺奇怪的这个现象。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-10 23:01:59 | 显示全部楼层
Hackerpro 发表于 2015-6-10 21:37
放上程序看看吧

发上来了,麻烦给看一下吧~我在运行的时候看了下角度的输出,然后发现,过一段时间,我测量的角度会有一个跳边,比如说+10度的时候,它显示为0度,然后慢慢再回来。估计是这个原因导致我的小车会倒。我用的是捷联算法(IMUupdate),感觉挺奇怪的这个现象。
回复 支持 反对

使用道具 举报

发表于 2015-6-10 23:55:49 | 显示全部楼层
陀螺仪或地磁传感器
回复 支持 反对

使用道具 举报

发表于 2015-6-18 22:02:03 | 显示全部楼层
我是来围观大神解答的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-23 15:10 , Processed in 0.045326 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表