搜索
bottom↓
回复: 42

仿制rantingting的两轮平衡小车

[复制链接]

出0入0汤圆

发表于 2013-1-11 14:47:31 | 显示全部楼层 |阅读模式
本帖最后由 freebird_sp 于 2013-1-11 14:50 编辑

根据rantingting的帖子http://www.amobbs.com/thread-5509883-1-1.html,仿制了一台两轮平衡小车,现在在调试参数,有些问题。
1.使用的减速电机由于齿轮之间有缝隙,所以轮子有些晃动。
http://v.youku.com/v_show/id_XNTAwNDkzNzE2.html
2.小车有一定的控制趋势,但是,还是有些问题。现在只加了P和D,位置和速度参数没有加,哪位高手请指导一下,应该如何继续调整参数,特别是位置和速度参数。
3.接通电源后,很长时间才能得到角度和角速度。观察加速度输出没有问题,感觉是卡特曼滤波的问题。请指教一二
http://v.youku.com/v_show/id_XNTAwNDk2MDUy.html

出0入0汤圆

 楼主| 发表于 2013-4-20 17:08:07 | 显示全部楼层
本帖最后由 freebird_sp 于 2013-4-20 17:12 编辑

今天有时间,又调了一下小车,发现一个很低级的问题,有一个车轮的编码器的信号输出居然接反了,导致电机同向转动时,输出值一正一负,怪不得调了好久都不行。给正在制作中的朋友提个醒,别和我一样犯这么低级的错误。

http://v.youku.com/v_show/id_XNTQ1NTk0MTE2.html

小车不够稳定,主要是受电机的影响,第一个视频已经介绍了,减速电机齿轮有间隙,导致控制力不能立刻加到电机上,而是有延时,所以小车再平衡位子会摆动调整,好在目前能站起来了。准备做下一个,改进型的。

出0入0汤圆

发表于 2013-1-11 17:56:57 | 显示全部楼层
加个位置环就为稳定很多,你初始化都在干啥?MCU需要运算这么久应该是程序的问题吧!

出0入0汤圆

 楼主| 发表于 2013-1-12 08:34:27 | 显示全部楼层
初始是这些,没有问题
    delaynms(500);     //上电延时
    Init_PWM();        //PWM初始化
    Init_Timer0();     //初始化定时器0,作为PWM时钟源
    Init_Timer1();     //初始化定时器1
    Init_Interr();     //中断初始化
    Init_Motor();      //电机控制初始化
    Init_BRT();               //串口初始化(独立波特率)
    InitMPU6050();     //初始化MPU6050
    delaynms(500);

计算倾角的程序如下,
//*********************************************************
// 倾角计算(卡尔曼融合)
//*********************************************************

void Angle_Calcu(void)     
{
    //------加速度--------------------------

    //范围为2g时,换算关系:16384 LSB/g
    //角度较小时,x=sinx得到角度(弧度), deg = rad*180/3.14
    //因为x>=sinx,故乘以1.3适当放大

    Accel_x  = GetData(ACCEL_XOUT_H);     //读取X轴加速度
    /*Angle_ax = (Accel_x + 620) /16384;    //去除零点偏移,计算得到角度(弧度)
    Angle_ax = Angle_ax*1.2*180/3.14;     //弧度转换为度,*/
        Angle_ax = (Accel_x - 1300) *180/36310;    //去除零点偏移,计算得到角度(弧度)



    //-------角速度-------------------------

    //范围为2000deg/s时,换算关系:16.4 LSB/(deg/s)

    Gyro_y = GetData(GYRO_YOUT_H);          //静止时角速度Y轴输出为-30左右
    Gyro_y = -(Gyro_y + 30)/16.4;         //去除零点偏移,计算角速度值,负号为方向处理
    //Angle_gy = Angle_gy + Gyro_y*0.01;  //角速度积分得到倾斜角度.   

   
    //-------卡尔曼滤波融合-----------------------

    Kalman_Filter(Angle_ax,Gyro_y);       //卡尔曼滤波计算倾角

    /*//-------互补滤波-----------------------

    //补偿原理是取当前倾角和加速度获得倾角差值进行放大,然后与
    //陀螺仪角速度叠加后再积分,从而使倾角最跟踪为加速度获得的角度
    //0.5为放大倍数,可调节补偿度;0.01为系统周期10ms   
           
    Angle = Angle + (((Angle_ax-Angle)*0.5 + Gyro_y)*0.01);*/
                                                                                        
}


刚刚试了一下,把卡尔曼滤波程序注释掉,角速度和加速度的值都会立刻显示,加上滤波程序后,就需要很长时间了。


卡尔曼滤波程序
//******卡尔曼参数************
           
float code Q_angle=0.001;  
float code Q_gyro=0.003;
float code R_angle=0.5;
float code dt=0.01;                      //dt为kalman滤波器采样时间;
char  code C_0 = 1;
float xdata Q_bias, Angle_err;
float xdata PCt_0, PCt_1, E;
float xdata K_0, K_1, t_0, t_1;
float xdata Pdot[4] ={0,0,0,0};
float xdata PP[2][2] = { { 1, 0 },{ 0, 1 } };

//*********************************************************
// 卡尔曼滤波
//*********************************************************

//Kalman滤波,20MHz的处理时间约0.77ms;

void Kalman_Filter(float Accel,float Gyro)           
{
    Angle+=(Gyro - Q_bias) * dt; //先验估计

   
    Pdot[0]=Q_angle - PP[0][1] - PP[1][0]; // Pk-先验估计误差协方差的微分

    Pdot[1]=- PP[1][1];
    Pdot[2]=- PP[1][1];
    Pdot[3]=Q_gyro;
   
    PP[0][0] += Pdot[0] * dt;   // Pk-先验估计误差协方差微分的积分
    PP[0][1] += Pdot[1] * dt;   // =先验估计误差协方差
    PP[1][0] += Pdot[2] * dt;
    PP[1][1] += Pdot[3] * dt;
           
    Angle_err = Accel - Angle;    //zk-先验估计
   
    PCt_0 = C_0 * PP[0][0];
    PCt_1 = C_0 * PP[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 * PP[0][1];

    PP[0][0] -= K_0 * t_0;             //后验估计误差协方差
    PP[0][1] -= K_0 * t_1;
    PP[1][0] -= K_1 * t_0;
    PP[1][1] -= K_1 * t_1;
           
    Angle    += K_0 * Angle_err;     //后验估计
    Q_bias   += K_1 * Angle_err;    //后验估计
    Gyro_y   = Gyro - Q_bias;        //输出值(后验估计)的微分=角速度

}

出0入0汤圆

发表于 2013-1-13 17:14:38 | 显示全部楼层
片子应该是AVR的吧我猜的。恩你的延时准确么?其他的毛病我也搞不清楚了。以前玩AVR的时候也出过类似的毛病但是那是个低级错误烧程序的时候时钟没设置好导致延时不准....

出0入0汤圆

发表于 2013-1-13 18:28:13 | 显示全部楼层
你的车子跑的好开心啊。、、、

出0入0汤圆

发表于 2013-1-13 19:03:42 | 显示全部楼层
不错····

出0入0汤圆

发表于 2013-1-15 20:13:52 | 显示全部楼层
还不错  朋友加油啊

出0入0汤圆

发表于 2013-1-17 14:17:43 | 显示全部楼层
LZ加油,很多还是需要自己调试的,耐心点,问题都能找到的

出0入0汤圆

发表于 2013-1-29 11:39:18 | 显示全部楼层
我的也是这样啊,我的只会前进

出0入0汤圆

发表于 2013-1-29 12:00:07 | 显示全部楼层
我也是按照他的做的,很多问题用他的程序实验要等很久

出0入0汤圆

发表于 2013-1-30 06:33:40 来自手机 | 显示全部楼层
mark!!!!!!

出0入0汤圆

发表于 2013-2-3 08:45:20 | 显示全部楼层
我开始也跟楼主的一样,要很久才有反应。应该是kalman的问题,换成互补滤波就好了

出0入0汤圆

发表于 2013-3-7 21:09:52 | 显示全部楼层
这个问题我找到是什么问题了,你把卡尔曼定义的几个值,全部都赋值.这样就不会抖动,请加我的Q,我现在也出了很大的问题,相互讨论,谢谢.896309534

出0入0汤圆

发表于 2013-3-7 21:11:04 | 显示全部楼层
这是我的赋值,float angle=90.0, angle_dot=0.0;                 //外部需要引用的变量
你可以参考一下,快点加我哦,拜托了,我有点问题要请教你

出0入0汤圆

发表于 2013-3-13 23:19:48 | 显示全部楼层
rantingting 是什么

出0入0汤圆

发表于 2013-3-15 16:35:57 | 显示全部楼层
请教楼主pid参数调试经验

出0入0汤圆

发表于 2013-3-15 16:37:11 | 显示全部楼层
123bac 发表于 2013-1-29 12:00
我也是按照他的做的,很多问题用他的程序实验要等很久

你的能站稳当起来么

出0入0汤圆

发表于 2013-3-15 16:39:41 | 显示全部楼层
migrantcn 发表于 2013-2-3 08:45
我开始也跟楼主的一样,要很久才有反应。应该是kalman的问题,换成互补滤波就好了 ...

我 也遇到这个问题     你的车弄好了么?

出0入0汤圆

发表于 2013-3-26 16:26:55 | 显示全部楼层
楼主,小车很牛啊

出0入0汤圆

发表于 2013-4-22 09:31:30 | 显示全部楼层
楼主,我的车子也是要几分钟才能有反应的,我想请教下你的问题解决了么?什么原因啊、加我的qq,1377379144,告诉我你的qq,我加你也行啊!坐等楼主啊

出0入0汤圆

发表于 2013-4-22 09:31:55 | 显示全部楼层
楼主,坐等啊!

出0入0汤圆

 楼主| 发表于 2013-4-28 16:32:22 | 显示全部楼层
是卡尔曼滤波的问题,现在换成互补滤波就没问题了

出0入0汤圆

 楼主| 发表于 2013-4-28 16:33:08 | 显示全部楼层
xysfwm 发表于 2013-4-22 09:31
楼主,坐等啊!

是卡尔曼滤波的问题,现在换成互补滤波就没问题了

出0入0汤圆

发表于 2013-4-30 13:31:24 | 显示全部楼层
编码器怎么接线,怎样换成互补滤波

出0入0汤圆

发表于 2013-5-7 18:19:43 | 显示全部楼层
楼主能加个扣扣交流吗  515520404

出0入0汤圆

发表于 2013-5-11 14:56:14 | 显示全部楼层
你仅仅用的mpu6050还是imu?

出0入0汤圆

发表于 2013-6-5 03:03:15 | 显示全部楼层
"有一个车轮的编码器的信号输出居然接反了,导致电机同向转动时,输出值一正一负" 请问一下,这会导致什么情况出现?

出0入0汤圆

发表于 2013-6-5 20:27:30 | 显示全部楼层
freebird_sp 发表于 2013-4-28 16:32
是卡尔曼滤波的问题,现在换成互补滤波就没问题了

请教一下,你的小车换成卡尔曼滤波的情况下,MPU6050是不是装的方向变成垂直的(用的是rantingting的程序)?

出0入0汤圆

发表于 2013-6-7 11:06:38 | 显示全部楼层
我也遇到了同样的问题,上电等好久才启动,还以为单片机挂了,把外围电路查了一遍,发现没问题。后来发现自己做的光电编码器输出信号不是很好,跳动很厉害。

出0入0汤圆

 楼主| 发表于 2013-6-29 17:32:43 | 显示全部楼层
am_diy 发表于 2013-6-5 03:03
"有一个车轮的编码器的信号输出居然接反了,导致电机同向转动时,输出值一正一负" 请问一下,这会导致什么 ...

编码器主要是在位移和速度控制时起作用,是小车能够在一个位置不动。之前无论怎样调整位移和速度参数,小车都会向一个方向运动,最终倒掉。

出0入0汤圆

发表于 2013-8-17 16:36:31 | 显示全部楼层
顶一个 学习了

出0入0汤圆

发表于 2013-8-19 18:55:41 | 显示全部楼层
freebird_sp 发表于 2013-4-20 17:08
今天有时间,又调了一下小车,发现一个很低级的问题,有一个车轮的编码器的信号输出居然接反了,导致电机同 ...

楼主如果只调角度和角速度能让校车站稳么?

出0入0汤圆

 楼主| 发表于 2013-8-21 19:42:23 | 显示全部楼层
huhulixin 发表于 2013-8-19 18:55
楼主如果只调角度和角速度能让校车站稳么?

不行,车会向一个方向运动,直至倒下。但可以观察到趋向平衡的趋势,要想车稳定,必须加入速度和位移参数

出0入0汤圆

发表于 2013-8-23 09:12:28 | 显示全部楼层
mark         

出0入0汤圆

发表于 2013-9-29 15:21:36 | 显示全部楼层
平衡车一共做了二十多天了,,,不知道啥时候能站起来,,,

出0入0汤圆

发表于 2013-11-17 02:06:53 | 显示全部楼层
LZ的车记得加防摔保护啊,不然这样搞搞就摔坏了~~。。。

出0入0汤圆

发表于 2013-11-18 18:21:06 | 显示全部楼层
哥们,车卖不?

出0入0汤圆

发表于 2014-1-3 15:15:07 | 显示全部楼层
顶一个 学习了

出0入0汤圆

发表于 2014-1-3 15:22:43 | 显示全部楼层
支持一下,很好...

出0入0汤圆

发表于 2014-3-5 14:44:53 | 显示全部楼层
好吧,我也改为互补滤波

出0入0汤圆

发表于 2014-3-5 14:46:29 | 显示全部楼层
本帖最后由 huang_1688 于 2014-3-5 14:49 编辑

另外有一事不明:
ACCEL_XOUT_H :是X轴的加速度
GYRO_YOUT_H :是Y轴的角速度
这两个怎么融合 ???

出0入0汤圆

发表于 2014-3-29 07:50:05 | 显示全部楼层
挺好的,正在弄得路过。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-10 19:43

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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