搜索
bottom↓
回复: 33

有没有用C8051F单片机做双轮平衡小车的????

[复制链接]

出0入0汤圆

发表于 2013-2-16 14:24:02 | 显示全部楼层 |阅读模式
最近在论坛上看了大家做的小车很感兴趣,于是决定自己也做一个,买了MPU6050,蓝牙串口,NRF24L01。用的是C8051F021单片机,现在程序基本调试完毕,板子也画完了,过年期间空闲了全在搞这个了!现在就等快递上班把元器件和板子做了。电机准备用2342L012那种带编码器的电机。现在先把电路和PCB分享一下,用的protel99se画的,希望大家多多指教。QQ445353987

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2013-2-27 20:56:52 来自手机 | 显示全部楼层
我用的c8051f310做的

出0入0汤圆

 楼主| 发表于 2013-2-27 21:34:18 | 显示全部楼层
chenjiawei7 发表于 2013-2-27 20:56
我用的c8051f310做的

你的小车怎么样了?,我的现在抖动的厉害。一会就向一边跑然后就倒了

出0入0汤圆

发表于 2013-2-28 06:50:08 来自手机 | 显示全部楼层
以前的那个电机不好,效果不太好,现在买了空心杯的,还没弄呢,你用什么滤波?

出0入0汤圆

 楼主| 发表于 2013-2-28 07:27:34 来自手机 | 显示全部楼层
chenjiawei7 发表于 2013-2-28 06:50  以前的那个电机不好,效果不太好,现在买了空心杯的,还没弄呢,你用什么滤波? ...

卡尔曼,我用的淘宝上2342L02那种电机

出0入0汤圆

发表于 2013-2-28 07:56:56 | 显示全部楼层
你用C8051F跑卡尔曼滤波?楼上你亮了。

出0入0汤圆

 楼主| 发表于 2013-2-28 09:44:00 | 显示全部楼层
tiancaigao7 发表于 2013-2-28 07:56
你用C8051F跑卡尔曼滤波?楼上你亮了。

什么意思啊?

出0入0汤圆

发表于 2013-2-28 09:55:08 | 显示全部楼层
不知道你的卡尔曼滤波器怎么设计,另外你的控制频率有多快。卡尔曼滤波器计算量很大。

出0入0汤圆

 楼主| 发表于 2013-2-28 10:01:24 | 显示全部楼层
tiancaigao7 发表于 2013-2-28 09:55
不知道你的卡尔曼滤波器怎么设计,另外你的控制频率有多快。卡尔曼滤波器计算量很大。 ...

我用的C8051F021频率22.1184MHz,10ms定时检测,角度加卡尔曼程序运行一共需要1.5ms左右。程序用的论坛上小米蓝牙那个哥们的改的

出0入0汤圆

发表于 2013-2-28 13:22:59 来自手机 | 显示全部楼层
卡尔曼变量太多,必须用XRAM才行

出0入0汤圆

 楼主| 发表于 2013-2-28 15:48:21 | 显示全部楼层
chenjiawei7 发表于 2013-2-28 13:22
卡尔曼变量太多,必须用XRAM才行

你的小车站起来没有啊?

出0入0汤圆

发表于 2013-2-28 15:50:26 | 显示全部楼层
c8051f310功耗太大,不适合做产品

出0入0汤圆

发表于 2013-2-28 19:20:39 来自手机 | 显示全部楼层
bfk2003 发表于 2013-2-28 15:48
你的小车站起来没有啊?

能站一会,很不稳定。我的驱动也有问题,自己画了个MOS的驱动,板子出来了还没来得及弄。准备移植到stm32上

出0入0汤圆

 楼主| 发表于 2013-2-28 19:59:53 | 显示全部楼层
chenjiawei7 发表于 2013-2-28 19:20
能站一会,很不稳定。我的驱动也有问题,自己画了个MOS的驱动,板子出来了还没来得及弄。准备移植到stm32 ...

我的也是只能站一会儿就一边跑着倒掉!

出0入0汤圆

发表于 2013-2-28 20:49:35 | 显示全部楼层
bfk2003 发表于 2013-2-28 19:59
我的也是只能站一会儿就一边跑着倒掉!

你用什么的驱动?你可以看看PWM的输出波形  和在小角度的时候电机两端的电压

出0入0汤圆

发表于 2013-2-28 20:51:25 | 显示全部楼层
chenjiawei7 发表于 2013-2-28 20:49
你用什么的驱动?你可以看看PWM的输出波形  和在小角度的时候电机两端的电压 ...

我用的互补滤波   卡尔曼我的不知道怎么跑步起来  一直死机

出0入0汤圆

 楼主| 发表于 2013-3-2 20:45:20 | 显示全部楼层
chenjiawei7 发表于 2013-2-28 20:51
我用的互补滤波   卡尔曼我的不知道怎么跑步起来  一直死机

我用卡尔曼滤波,用示波器看了用了1.56ms.现在小车站起来了,就是力量不够。

出0入0汤圆

发表于 2013-3-2 22:09:23 | 显示全部楼层
bfk2003 发表于 2013-3-2 20:45
我用卡尔曼滤波,用示波器看了用了1.56ms.现在小车站起来了,就是力量不够。 ...

那发我一份看看呗  你用XDATA没有?

出0入0汤圆

 楼主| 发表于 2013-3-3 14:49:03 | 显示全部楼层
chenjiawei7 发表于 2013-3-2 22:09
那发我一份看看呗  你用XDATA没有?

用了的,


//******角度参数************

float Gyro_y;        //Y轴陀螺仪数据暂存
float Angle_gy;      //由角速度计算的倾斜角度
float Accel_x;             //X轴加速度值暂存
float Angle_ax;      //由加速度计算的倾斜角度
float Angle;         //小车最终倾斜角度
//uchar value;                 //角度正负极性标记       

//******PWM参数*************

int   speed_mr;                 //右电机转速
int   speed_ml;                 //左电机转速
int   PWM_R;         //右轮PWM值计算
int   PWM_L;         //左轮PWM值计算
float PWM;           //综合PWM计算
float PWMI;                         //PWM积分值

//******电机参数*************

float speed_r_l;         //电机转速
float speed;         //电机转速滤波
float position;             //位移

//******蓝牙遥控参数*************
uchar remote_char;        //蓝牙串口接收到的数据
char  turn_need;
char  speed_need;

//******卡尔曼参数************
               
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滤波22.1184MHz处理时间560us

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;         //输出值(后验估计)的微分=角速度

}



//*********************************************************
// 倾角计算(卡尔曼融合)
//*********************************************************

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 - 1100) /16384;   //去除零点偏移,计算得到角度(弧度)
        Angle_ax = Angle_ax*1.2*180/3.14;     //弧度转换为度,


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

        //范围为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);       //卡尔曼滤波计算倾角


//*************数据转换**************
//
//        Pa=(unsigned char*)&Angle;//  
//        Tx0Buf[1]=*Pa;                      //  高位
//        Tx0Buf[2]=*(Pa+1);                  //
//        Tx0Buf[3]=*(Pa+2);                  //
//        Tx0Buf[4]=*(Pa+3);                  //
       
        /*//-------互补滤波-----------------------

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

出0入0汤圆

 楼主| 发表于 2013-3-3 15:15:13 | 显示全部楼层
http://v.youku.com/v_show/id_XNTIxNjcwMTQ0.html小车站起来了,但是感觉没劲。用力点推会倒掉。中间死机是应为电源模块没有焊接,只是插着。

出0入0汤圆

发表于 2013-3-3 20:18:16 | 显示全部楼层
你用什么的驱动?

出0入0汤圆

发表于 2013-3-3 20:19:42 | 显示全部楼层
tiancaigao7 发表于 2013-2-28 07:56
你用C8051F跑卡尔曼滤波?楼上你亮了。

也不要太小看C8051f了

出0入0汤圆

发表于 2013-3-3 20:20:50 | 显示全部楼层
bfk2003 发表于 2013-3-3 15:15
小车站起来了,但是感觉没劲。用力点推会倒掉。中间死机是应为电源模块没有焊接,只是插着。 ...

怎么还有风扇?驱动散热?

出0入0汤圆

 楼主| 发表于 2013-3-3 20:37:53 来自手机 | 显示全部楼层
chenjiawei7 发表于 2013-3-3 20:20  怎么还有风扇?驱动散热?

L298驱动散热

出0入0汤圆

发表于 2013-3-3 20:44:09 | 显示全部楼层
298很热吗,我也买了两个冯哈伯的电机  还没开始弄,我画了个MOS的驱动,板子打出来了还没焊接

出0入0汤圆

 楼主| 发表于 2013-3-4 19:22:01 | 显示全部楼层
chenjiawei7 发表于 2013-3-3 20:44
298很热吗,我也买了两个冯哈伯的电机  还没开始弄,我画了个MOS的驱动,板子打出来了还没焊接 ...

不加散热一会儿就热了。

出0入0汤圆

发表于 2013-3-4 19:28:03 | 显示全部楼层
bfk2003 发表于 2013-3-4 19:22
不加散热一会儿就热了。

嗯   298的压降大

出0入0汤圆

 楼主| 发表于 2013-3-4 19:37:17 | 显示全部楼层
chenjiawei7 发表于 2013-3-4 19:28
嗯   298的压降大

压降有多大啊?有没有压降小的H桥?

出0入0汤圆

发表于 2013-3-4 19:46:36 | 显示全部楼层
bfk2003 发表于 2013-3-4 19:37
压降有多大啊?有没有压降小的H桥?

具体手册上应该有,你可以自己用MOS搭一个桥,也有全桥芯片的 ,飞思卡尔好像有

出0入0汤圆

 楼主| 发表于 2013-3-4 19:52:23 | 显示全部楼层
chenjiawei7 发表于 2013-3-4 19:46
具体手册上应该有,你可以自己用MOS搭一个桥,也有全桥芯片的 ,飞思卡尔好像有 ...

哦,当时没考虑那么多,只是觉得集成的简单点

出0入0汤圆

 楼主| 发表于 2013-3-4 19:58:12 | 显示全部楼层
chenjiawei7 发表于 2013-3-4 19:46
具体手册上应该有,你可以自己用MOS搭一个桥,也有全桥芯片的 ,飞思卡尔好像有 ...

你用分离元件做的驱动板还是整块带控制的板子?

出0入0汤圆

发表于 2013-3-5 14:34:14 来自手机 | 显示全部楼层
bfk2003 发表于 2013-3-4 19:58
你用分离元件做的驱动板还是整块带控制的板子?

做了个驱动模块,用MOS管

出0入0汤圆

发表于 2013-3-5 14:35:50 来自手机 | 显示全部楼层
bfk2003 发表于 2013-3-4 19:58
你用分离元件做的驱动板还是整块带控制的板子?

做了个驱动模块,用MOS管

出0入0汤圆

 楼主| 发表于 2013-3-5 19:45:06 | 显示全部楼层
chenjiawei7 发表于 2013-3-5 14:35
做了个驱动模块,用MOS管

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

本版积分规则

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

GMT+8, 2024-4-28 21:05

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

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