打印

两轮自平衡小车源代码(24楼)

[复制链接]
楼主: zoomone
手机看帖
扫描二维码
随时随地手机跟帖
21
呵呵

使用特权

评论回复
22
程序匠人| | 2011-10-17 14:11 | 只看该作者
如果是为了监视角度,用《串口猎人》是最佳选择哦。
理论上,可以同时监视8路数据

使用特权

评论回复
23
zoomone|  楼主 | 2011-10-18 21:58 | 只看该作者
本帖最后由 zoomone 于 2011-10-23 14:56 编辑

我把我的源码文件上传上来

硬件有所改动,所以不要直接编译烧写,读懂后改一下再用

我的硬件改动不大,记得有个是测速计数中断原来电路用的int2,我把这一路改成int0;其他可能也有。所以先要读懂程序再对照自己的电路改

调平衡的关键在于让角度、角速度正确转化,说白了将传感器的电压变化正确的转变成数字量,所以

gyro=0.011557*ADC(1)-3.035+105*3.14/180; //后面105*3.14/180是对角速度零点的修正
acceler=0.003052*ADC(0)-1.4375;  //计算角度时,只用了加速度传感器的Z轴就够了

这两行的参数可能要根据自己的电路调整一下,调好的标志就是像我一楼视频那个效果。

角度方面调好后,基本就成了三分之二,剩下的主要是调那四个辅助变阻器,最好先把角度、角速度放一起调(另两个量设为0),我的经验是光

靠这两个还不能平衡,但是能看出来车轮是不是随倾角向相反方向转动,这个好了后,再加上电机转速那个量(电机转角依然为0),三个量调好后

小车完全可以平衡。由于电机的问题,让小车跑起来很困难,电机转角这个量就没必要加了,加上了反倒成了干扰。

这时可能小车虽然平衡了但是老有往某一边跑的趋势,这是因为程序认为小车的中心不是真正的中心,需要微调,调右上角三个变阻器里最上边那个就可以了。

测试发现51计算卡尔曼滤波速度很慢,计算角度有延迟,反而不好用。互补滤波对零点温飘处理的不好。各有利弊。

卡尔曼滤波版.zip

3.4 KB

互补滤波版.zip

3.61 KB

使用特权

评论回复
评分
参与人数 3威望 +3 收起 理由
goodboy3021 + 1 原创内容
zxcscm + 1
Cortex-M0 + 1
24
Cortex-M0| | 2011-10-19 14:03 | 只看该作者
顶zoomone小盆友~~~

使用特权

评论回复
25
xiaotann| | 2011-10-19 16:03 | 只看该作者
谢谢

使用特权

评论回复
26
goodboy3021| | 2011-10-21 07:10 | 只看该作者
24# zoomone

小车上电后的初始位置:

使用特权

评论回复
27
zoomone|  楼主 | 2011-10-21 14:29 | 只看该作者
27# goodboy3021

acceler=acceler*1.5+(14+96)*3.14/180;  

gyro=0.011557*ADC(1)-3.0396+(105+80)*3.14/180;

可以照上面方法修正一下

使用特权

评论回复
28
mubei| | 2011-10-22 00:08 | 只看该作者
顶   额 偶一段时间没弄车了  最近学习紧了 时间也少了

使用特权

评论回复
29
tuzihog| | 2011-10-22 08:30 | 只看该作者
好贴留名!!!!!!!!!!!

使用特权

评论回复
30
中原狼21IC| | 2011-10-22 09:14 | 只看该作者
:)做的不错

使用特权

评论回复
31
daishun| | 2011-11-25 17:43 | 只看该作者
谢谢

使用特权

评论回复
32
流水无意| | 2011-11-27 13:19 | 只看该作者
请教楼主:
用楼主的监控软件,10ms发送间隔
互补滤波后显示的角度感觉有延迟,而且动的时候角度会先向反方向动下才回到正确角度
这是为什么???

使用特权

评论回复
33
zoomone|  楼主 | 2011-11-27 16:02 | 只看该作者
延迟的话小车很难站起来。用4051做mcu时,卡尔曼滤波有延迟,互补就没有;我调试过程中发现两个原因能导致延迟。一、本来这种算法就太大了,像卡尔曼,单片机算不过来;二是同一种算法,参数设置不合理导致需要多次迭代才能稳定。 如果用我程序里互补滤波的参数4051算应该没问题的,你改参数了?

使用特权

评论回复
34
流水无意| | 2011-11-27 18:30 | 只看该作者
楼主你好,参数改过了,现在延迟还好
问题就是向一个方向倾倒时会先有一个反方向的角度,不知何故

使用特权

评论回复
35
181liufeng| | 2011-11-27 19:16 | 只看该作者
感谢楼主,分享了

使用特权

评论回复
36
ListenHappy| | 2011-11-30 20:46 | 只看该作者
顶顶顶···

使用特权

评论回复
37
leichi1989| | 2011-12-1 19:37 | 只看该作者
楼主,麻烦问一下,别的地方我差不多看明白了 可是  
   gyro=0.011557*ADC(1)-3.0396+114*3.14/180;
if(gyro*57.3>43)       
gyro=43/57.3;

//acceler        =ADC(0);               

acceler=0.003052*ADC(0)-1.4375;                //系数换算:2.5/(1.2*512);


acceler=acceler*1.5+14*3.14/180;  
这里不太明白。陀螺仪0加速度时输出电压不是1.35V吗?为什么减去一个3.0396?

使用特权

评论回复
38
zoomone|  楼主 | 2011-12-2 09:05 | 只看该作者
40# leichi1989
单片机adc和传感器之间有放大电路,所以这个3.0396就是1.35经过放大电路相关的参数乘除后的结果。

使用特权

评论回复
39
leichi1989| | 2011-12-2 15:05 | 只看该作者
哦 这样啊 明白了 非常感谢!! 41# zoomone

使用特权

评论回复
40
chrishardy| | 2011-12-5 08:49 | 只看该作者
不错啊 赞一个

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则