智能车制作

标题: 平衡车的抖动………… [打印本页]

作者: guolei123    时间: 2014-1-8 17:51
标题: 平衡车的抖动…………
用的互补滤波算法,没有使用P、I、D等控制,现在车子会出现特别激烈的抖动,求解啊,不知道为啥…………第一次做平衡车…………
作者: Jyoun    时间: 2014-1-8 18:06
控制系数太大了。
作者: 邵志伟    时间: 2014-1-8 18:19
太大了会抖动,左右超级晃动然后倒下,太小了会往一边加速然后摔倒。所以结论就是最后终会倒下。
作者: 冷酷世纪    时间: 2014-1-8 20:14
我很好奇你不用PID是怎么控制的
作者: zhou1994    时间: 2014-1-8 21:25
你的是线性放大?就相当于只用了p
作者: 皓杰    时间: 2014-1-8 21:32
参数有点大,参数大的原因有昂个,一个是P,另一个是D,两个过大都有抖动的现象,P过大,是有车体倾斜引起的抖动;D过大,车体表现为高频抖动
作者: 皓杰    时间: 2014-1-8 21:34
你看一下程序里面确实没有PID算法吗?

作者: woshiwangbin    时间: 2014-1-8 23:24
楼主哥们 我想问下从开始写平衡程序到让车基本立起来   再从基本立起来到立稳  需要花多少时间啊? 不要说这因人而异哦
作者: 阿灰    时间: 2014-1-9 09:10
woshiwangbin 发表于 2014-1-8 23:24
楼主哥们 我想问下从开始写平衡程序到让车基本立起来   再从基本立起来到立稳  需要花多少时间啊? 不要说这 ...

一般 车模达起来后 一个多月就可以稳定站起来了,
作者: guolei123    时间: 2014-1-9 10:56
阿灰 发表于 2014-1-9 09:10
一般 车模达起来后 一个多月就可以稳定站起来了,

要一个多月啊…………这么长啊…………

作者: guolei123    时间: 2014-1-9 10:56
冷酷世纪 发表于 2014-1-8 20:14
我很好奇你不用PID是怎么控制的

直接一个角度对应一个PWM
作者: 春日迟迟    时间: 2014-1-9 21:41
guolei123 发表于 2014-1-9 10:56
要一个多月啊…………这么长啊…………

我一天就调出来了 不用听他们说 还是新手

作者: woshiwangbin    时间: 2014-1-11 18:02
春日迟迟 发表于 2014-1-9 21:41
我一天就调出来了 不用听他们说 还是新手

这么厉害啊。你是怎么弄的 可以这么快 一天就调好 程序代码加测试都一天就搞完了?
作者: 冷酷世纪    时间: 2014-1-11 23:30
guolei123 发表于 2014-1-9 10:56
直接一个角度对应一个PWM

那抖动就正常了,你这样控制相当于只有P控制,而D为0,肯定会有抖动的

作者: RCJ_88888    时间: 2014-1-12 20:38
那个你们车站起来,加速度控制了吗
作者: zhou1994    时间: 2014-1-14 20:44
woshiwangbin 发表于 2014-1-8 23:24
楼主哥们 我想问下从开始写平衡程序到让车基本立起来   再从基本立起来到立稳  需要花多少时间啊? 不要说这 ...

一个小时
作者: woshiwangbin    时间: 2014-1-15 15:34
zhou1994 发表于 2014-1-14 20:44
一个小时

这位大哥 汝甚屌! 拜求赐教!!

作者: pig881    时间: 2016-5-27 23:22
woshiwangbin 发表于 2014-1-15 15:34
这位大哥 汝甚屌! 拜求赐教!!

为何这么屌。。。

我的平衡车用 Arduino UNO 做的,MPU6050,  PID 卡尔曼滤波,可是站起来后很抖,

我调遍了参数也没用,怎么破?

http://player.youku.com/player.php/sid/XMTU4NTA2MjEwOA==/v.swf



void Kalman_Filter(double angle_m,double gyro_m)
{
    angle+=(gyro_m-q_bias) * dtt;
    Pdot[0]=Q_angle - P[0][1] - P[1][0];
    Pdot[1]=- P[1][1];
    Pdot[2]=- P[1][1];
    Pdot[3]=Q_gyro;
    P[0][0] += Pdot[0] * dtt;
    P[0][1] += Pdot[1] * dtt;
    P[1][0] += Pdot[2] * dtt;
    P[1][1] += Pdot[3] * dtt;
    angle_err = angle_m - angle;
    PCt_0 = C_0 * P[0][0];
    PCt_1 = C_0 * P[1][0];
    E = R_angle + C_0 * PCt_0;
    K_0 = PCt_0 / E;
    K_1 = PCt_1 / E;
    t_0 = PCt_0;
    t_1 = C_0 * P[0][1];
    P[0][0] -= K_0 * t_0;
    P[0][1] -= K_0 * t_1;
    P[1][0] -= K_1 * t_0;
    P[1][1] -= K_1 * t_1;
    angle+= K_0 * angle_err;
    q_bias += K_1 * angle_err;
    angle_dot = gyro_m-q_bias;//也许应该用last_angle-angle
}


void pwm_calculate()
{
   unsigned long  now = millis();       // 当前时间(ms)
   int Time = now - lastTime;

  int range_error;

  //Serial.print("  R:");Serial.print(c2);
  //Serial.print("  L:");Serial.print(c1);
  range+=(c1+c2)*0.5;
  range*=0.9;
  range_error=c1-c2;
  range_error_all+=range_error;

  wheel_speed=range-last_wheel;
  last_wheel=range;

  pwm=angle*k1+angle_dot*k2+range*k3+wheel_speed*k4;    //use PID tho calculate the pwm

  if(pwm>255)                               //Maximum Minimum Limitations
    pwm=255;
  if(pwm<-255)
    pwm=-255;
//Serial.print(pwm);Serial.print("\t");
    //  Serial.print(c1);Serial.print("\t");
    //  Serial.print(c2);Serial.print("\t\n");
/*    if(turn_flag==0)
    {
     pwm_R=pwm+range_error_all;
     pwm_L=pwm-range_error_all;
    }
    else
    {
        pwm_R=pwm-turn_flag*68;  //Direction PID control
        pwm_L=pwm+turn_flag*68;
        range_error_all=0;     //clean
    }
*/   
     c1 = 0;//clean
     c2 = 0;
   lastTime = now;
   //Serial.print(Time);Serial.print("\n");


}







欢迎光临 智能车制作 (http://www.znczz.com/) Powered by Discuz! X3.2