打印

《自平衡两轮小车》现在进行时(2011.05.20更新:小车已站立)

[复制链接]
楼主: 程序匠人
手机看帖
扫描二维码
随时随地手机跟帖
181
123jj| | 2011-5-16 18:32 | 只看该作者 回帖奖励 |倒序浏览
现在俺们来讨论只使用一个陀螺仪(ENC03)的平衡小车关键技术瓶颈和影响因素:

大家知道,陀螺仪(ENC03)输出的是角加速度线性模拟量,经运算放大器放大且经过适当的滤波后,信号送MPU的A/D转换器,经模-数转换后,经MPU作适当运算处理后,控制电机运转。

在上述整个环路链中,有很多因素影响控制精度,如模拟器件的线性度、温漂,A/D转换器的线性度、分辨率、精度、转换速度,MPU运算数度,电机控制的伺服性(即听话程度,让他快就快,让他慢就慢,让他停就停),各个部分的响应频率等等。


◇ 下面拆分各个关键器件的作用加以分开讨论:

一、 陀螺仪(ENC03)
1、 ENC03的线性度,由于ENC03是种角加速度传感器,在慢速变化时(角加速度接近0),输出变化信号极小,几乎淹没在噪音信号中,无**常工作,在快速剧烈变化时,线性度良好。这一特征正好和力加速度传感器相反,力加速度传感器在缓慢变化时输出信号极佳,在快速剧烈变化时输出信号一团糟,根本没法及时处理。

  从上可得出一个结论,只用一个陀螺仪(ENC03),要做到站立平稳不摇晃,几乎是不可能做到的(因为此时角加速度接近0,ENC03输出变化量太小,有效信号淹没在无用的噪音信号中,无法给出正确信号)。唯一能做到的是忐忑两轮平衡车(来回左右一直晃个不停,使得ENC03能给出有效信号)。实际在制作平衡车时,常常用这两种器件作互补应用。

2、 ENC03的温漂,由于ENC03是模拟器件,当然随温度变化有一定的温漂,温漂迭加在输出有效信号上,对检测值有一定的影响,如何减轻影响,下面讨论。
   
二、 运算放大器(LM324)
1、 运算放大器的线性度,理论上可不用考虑,实际上由于LM324是最“烂”的运放,输入阻抗较低,失调电压和失调电流较大,对线性度还是有一定影响的,由于影响力不是很大,俺们暂时不考虑,只当理想器件。

2、 运算放大器的温漂,由于LM324是模拟器件,当然随温度变化有一定的温漂,温漂迭加在输出有效信号上,对信号值有一定的影响,如何减轻影响,下面讨论。

三、 A/D转换器的线性度、分辨率、精度、转换速度
1、 A/D转换器的线性度由生产厂家决定,故暂时不讨论,仅当作理想器件。

2、 A/D转换器的分辨率,在线性度及精度基本保证的前提下,当然是越高越好,如线性度和精度太差,过高的分辨率已失去实用价值和意义。

3、 精度和转换速度,由选择的MPU型号决定,故暂时不讨论,仅当作理想器件。

四、 MPU运算处理精度
1、 这一点比较容易做到,由于是小MPU,唯一的要求是算法简单,在运算处理精度尚可时,尽量用整数运算而不用浮点数运算,以提高运算效率,减少运算时间。

五、 电机控制的伺服性
1、 当然,最理想状态是用伺服电机,但是,由于成本因素,不得不用廉价电机,如用廉价电机加闭路反馈环组成准伺服型电机,控制效果肯定一流。本案例中,暂时不讨论加闭路反馈准伺服型电机,而讨论开环直接控制的电路实施方案。


◇ 下面将上述的几个关键要点串起来加以综合分析讨论:
一、 当小车位置有变动时,变化量经陀螺仪(ENC03)检测并以增量型式输出变化量,经运放(LM324)放大且经过适当的滤波后,信号送MPU的A/D转换器,经模-数转换后,经MPU作适当运算处理后,控制电机运转,修正小车位置偏移量。

二、 在上述整个循环过程中,个人认为,影响最大的是温漂和A/D转换器的分辨率,A/D转换器的分辨率决定了从模拟量到数字量转换的精确度,有条件的话,用12位ADC比较理想,目前,所用最“烂”2051 MPU的ADC分辨率只有10位,并且是单象限的,如以中心电压向两边均分,最高有效分辨率也只有9位,属于比较低的。

1、 现假设即时温漂为0,没有温漂,并且陀螺仪(ENC03)静止不动时,输出信号经放大后在最理想位置,即基准零位经A/D转换后,值为512,另外,假设电机为最理想状态,即完全听话,和给出驱动信号成正比随动。

2、 再来分析想像一下,假如陀螺仪(ENC03)正向变动一定角度,输出一个信号量,经放大后,输出一个增量,假定为10.5倍A/D转换分辨率,迭加在基准零位信号上,经A/D转换后,去尾,得到量化后的数字量信号(512+10), 在MPU中,减去基准零位512, 得到偏移增量10。

3、 接下来再来分析想像一下,假如陀螺仪(ENC03)再反向变动一定角度,回到基准零点,输出一个信号量,经放大后,输出一个增量,这个增量数值同上,方向相反,即为-10.5倍A/D转换分辨率,迭加在基准零位信号上,经A/D转换后,去尾,得到量化后的数字量信号(512-11), 在MPU中,减去基准零位512, 得到偏移增量-11。

注:请大伙想一下,为什么有小数时,不能得到-10, 而只能得到-11(当然,没有小数的整数倍除外)。

4、 从上得到一个结论,对陀螺仪(ENC03)输入的对称正反两方面信号,经A/D转换后,得到的为不对称结果,相差一个字,并且是单调性增长的,随着时间的增长,这个误差越积越多,最终导至小车站立不住倒下,形成杯具~~~ :L

5、 现在再来分析想像一下,不光写程度小盆友当时调整的现场,重温一下不光写程度小盆友这段话的深刻含义:

这一次,当它离开我手的支撑以后,没有倒下。。。。 然而这是经历了无数次倒下后的结果!
......

1、陀螺仪(ENC03)和运放(LM324)的温漂问题:大家知道陀螺仪(ENC03)是个角速度传感器,它输出端电压的变化和当前的角速度成比例关系的(即0.67mv/°/s)。
       在它静止时会输出一个静态电压(1.25v-1.35v左右),我们就用ENC03输出端的实测电压减去这个静态电压,然后根据比例关系算出当前角速度的。
            问题在于,这个静态电压不是雷打不变的,相反,它及其善变(情商有点高:lol ),当外界温度变化时静态电压也会跟着变,而且信号还要经过运放(LM324)的放大,
悲剧的是,运放的情商也不低(也有温漂),这些就导致每次开机时测得的静态电压是不一样的,如果任其变化就会导致小车倒下。。。这个还是比较好解决的,在
开机时初始化程序中加入测量当前静态电压的小程序就可以解决问题。
     可是事情远没有这么简单。更为麻烦的是当这个静态电压处于ADC分辨率的两个数值之间时,ADC就可能转换出两个不一样的数值。这就抓狂了,无法确定一个
稳定的当前静态电压了。我现在是在开机后手动调整电位器使静态电压接近于一个ADC分辨率的整倍数,这样就不会转换出两个不同的数值了,而且换算角度时产生的
积累误差也会很小。当然这个方法很笨很繁琐,所以晒出来让大家一起解决进步,呵呵。
......

不光写程序 发表于 2011-5-10 22:45



不光写程度小盆友在贴中强调,更为麻烦的是当这个静态电压处于ADC分辨率的两个数值之间时,ADC就可能转换出两个不一样的数值。

实际上这句话是错的!!!

不光写程度小盆友通过自已艰苦的连日奋战,最终让小车站起来,恰恰是将零位这个静态电压调整在处于ADC分辨率的两个数值之间,即+0.5数值处,这样,小车便能勇敢的站立起来!

注:请大家想想看,为何一定要将零位这个静态电压调整在处于ADC分辨率的两个数值正中央,即+0.5数值处。才能让小车能勇敢的站立起来!


待续。。。。。

使用特权

评论回复
评分
参与人数 1威望 +6 收起 理由
程序匠人 + 6 精品文章
182
123jj| | 2011-5-16 18:46 | 只看该作者
题外话:

俺为什么一再强调,不光写程序小盆友只用一个ENC-03方案, 调试成功,有视频,相信大家都看了,但是,如果网上随便抓一把网友,大多数人用相同的软硬件,无法调到让小车站起来,个人认为,这个方法几乎无法传授及复制,没有实际意义。

原因很简单,就像不光写程序小盆友所说:“这一次,当它离开我手的支撑以后,没有倒下。。。。 然而这是经历了无数次倒下后的结果!”

试问一下,如果网上随便抓一把网友,有几个能有 不光写程序小盆友这样的恒心,连续数日挑灯奋战,最终将零位这个静态电压调整在处于ADC分辨率的两个数值正中央(相当于刀尖上),即+0.5数值处。并且不能有温漂,今天调好放到明天或许就是个杯具~~~   :L

向勤奋好学的不光写程序小盆友致敬,预祝不光写程序小盆友的两轮车越调越好,顺利通过毕业考试~~~ :victory:

使用特权

评论回复
183
123jj| | 2011-5-16 18:51 | 只看该作者
下面的我们继续讲马尾巴的功能~~~ :victory:


讨论如何克服和减少现有的两大难题,基准零点的温漂及单向A/D转换器分辨率不够高带来的单调增长性积累误差。

使用特权

评论回复
184
123jj| | 2011-5-16 19:51 | 只看该作者
一、 软件修正法。
   将A/D采样值,减去基准零值后,如数值为正,不处理,如数值为负,加上一个在0和小于1之间的修正值,该值可通过键盘、上位机输入,也可外接一个独立的可调整的电位器,经A/D转换输入后,将值调整至0和小于1之间的修正值待用。
   优点,简化调整工作量,易找到正反两方面的平衡点。
   缺点,没有解决线性器件的温漂问题,因而也不能彻底解决小车自平衡问题。

二、 软硬结合补偿法。
   尽量提高A/D转换的分辨率,通过开机检测基准零值储存后,作为标准基准点,假如A/D转换的分辨率足够高,能比较容易解轻正反两方向的单调增长性积累误差,使得站立更长的时间,不过,从理论上讲,始终存在基准零点的温漂及A/D转换器带来的单调增长性积累误差。
   在本案例中,由于小MPU已敲定为最“烂”的2051,所以无能为力。

三、 采用能检测正负极性电压的A/D转换器
   能检测正负极性电压的A/D转换器,通常比较常见的有低速双积分型A/D转换器,速度较高的价格昂贵。
   如用能检测正负极性电压的A/D转换器,将陀螺仪(ENC03)的基准脚直接接入该A/D转换器的0位输入脚,倒可有效补偿陀螺仪(ENC03)零点的漂移,但是。。。。。
   这个价格,不是俺们业余玩家能玩得起的。 :L


其他常规之法,俺也想不出啥新解玩意儿了~~~

无奈之下,唯一的出路,俺只能动用菜农的“非典”、tyw的“野路子”之法宝,捣点浆糊,变通一下手法,看看是否能走通。。。

待续。。。。。

使用特权

评论回复
185
程序匠人|  楼主 | 2011-5-16 20:29 | 只看该作者
说实话,俺不喜欢这种靠“调”来实现的东东。觉得没趣了。:(理论上来说,只要我有足够的耐心,我可以把一个**蛋立在针尖上。


俺希望的是用“算法”解决问题。当然也要调,但只要“粗调”,不要“细调”。如果一个小车需要靠无数次的“细调”才能站起来。那这种成功是不可复制的。不可复制的成功,也就没有意义了。

使用特权

评论回复
评分
参与人数 3威望 +3 收起 理由
嵌入你我心 + 1 赞同
S448 + 1 赞同
123jj + 1
186
123jj| | 2011-5-16 20:43 | 只看该作者
说实话,俺不喜欢这种靠“调”来实现的东东。觉得没趣了。:(理论上来说,只要我有足够的耐心,我可以把一个**蛋立在针尖上。


俺希望的是用“算法”解决问题。当然也要调,但只要“粗调”,不要“细调”。如果一个 ...
程序匠人 发表于 2011-5-16 20:29



匠人正解!

俺也这样认为,因此,在设计此两轮小车硬件时,就留有伏笔,准备用菜农的“非典”、tyw的“野路子”之法宝,捣点浆糊,搞个既能用全用足现在超“烂”2051片内A/D转换器之极限性能,又能可靠抵消补偿陀螺仪(ENC03)的零点漂移。。。。。

使用特权

评论回复
187
123jj| | 2011-5-16 20:51 | 只看该作者
顺便说一下,陀螺仪和加速度传感器的个性正好相反,故人们利用这两者之间的互补性,使用加速度传感器长时间稳定的特性,弥补陀螺仪的零点漂移及A/D采样值单调性误差积累增长,制造出性能比较完美的两轮平衡车。

以上讨论中,俺强调的是只用一个陀螺仪(ENC03)方案。。。。。

这一方案实现起来有一定的难度~~~

使用特权

评论回复
188
wubowww888| | 2011-5-16 20:56 | 只看该作者
匠人正解!

俺也这样认为,因此,在设计此两轮小车硬件时,就留有伏笔,准备用菜农的“非典”、tyw的“野路子”之法宝,捣点浆糊,搞个既能用全用足现在超“烂”2051片内A/D转换器之极限性能,又能可靠抵消补偿 ...
123jj 发表于 2011-5-16 20:43


123jj ,介个你也太能打击我了.....2051片内A/D可是10bit 精度,业界标准统计算法测试的东东.....被你一个超"烂"打败了.....

使用特权

评论回复
189
程序匠人|  楼主 | 2011-5-16 21:21 | 只看该作者
123jj,我什么的干活都不是...你看我的ID还有某些给你的回复,应该能猜出我是什么地干活...:lol
wubowww888 发表于 2011-5-16 20:58


我知道是wubowww888什么的干活,但我就是不说!;P

使用特权

评论回复
190
123jj| | 2011-5-16 21:22 | 只看该作者
123jj ,介个你也太能打击我了.....2051片内A/D可是10bit 精度,业界标准统计算法测试的东东.....被你一个超"烂"打败了.....
wubowww888 发表于 2011-5-16 20:56



呵呵!

2051的价格超“烂”,这是俺看中她喜欢她之根本原因,不过,片内A/D  10bit 精度,用于两轮小车确实偏低了点,最好用 12bit 精度。

现在俺在调试时,舍弃低两位,只用其高八位,相当于 8bit 精度,想试试,仅用 8bit 精度的A/D转换器,能否让小车站起来~~~  :lol

使用特权

评论回复
191
程序匠人|  楼主 | 2011-5-16 22:21 | 只看该作者
我已经把2051换成4051了。因为空间不够用。

当然,我也没顾上去优化代码。很多调试用的代码,也许以后可以精简掉。但至少目前不能。

使用特权

评论回复
192
程序匠人|  楼主 | 2011-5-17 00:38 | 只看该作者
“电机转速:10500转/分,额定电压:6V,  减速比 1:48”

——减速之后仍有200转。是不是有点快啊?

使用特权

评论回复
193
123jj| | 2011-5-17 05:34 | 只看该作者
“电机转速:10500转/分,额定电压:6V,  减速比 1:48”

——减速之后仍有200转。是不是有点快啊?
程序匠人 发表于 2011-5-17 00:38



这个小电机,额定工作电压:3-6V,  额定转速:5000-10500转/分,你如想低一点,可降低电机工作电压,或者将两个电机串联使用,转速将降低一倍。


友情提示:
  有个专业做过几个不同版本两轮车的盆友,发了个贴,俺印象很深,大致内容为:“凡做过两轮平衡小车的盆友,都知道,电机扭力不够大,转速在 200转/分 以下,很难做成功,俺现在做到用 转速 120转/分的电机,能平稳控制两轮小车,做过的盆友都知道,这里面的技术难度。”


事实上,要直流电机慢,很简单,降低工作电压即可,要快就难多了,直流电机几乎没法长时间超电压超速运行,俺十几年前,做过用可控硅调速,只通过内部简单的电流电压环闭路调整,不用外部成本高的测速反馈系统,就让普通直流电机调速比做到 1:100,并且在负载变化 300%的情况下,转速变化小于 3%,尽管材料成本不高,但阻容零件品种较多,人工费较贵,且容易装配出错,曾经几次改动,采用市场上有售的直流电机专用控制芯片,以减少元件数量,减少装配人工费,提高装配合格率,但实际使用下来,效果不佳,对使用电压波动范围要求较高,转速不稳,调速范围狭窄,调速只能比做到 1:10-15,并且在负载变化 300%的情况下,基本失控,想找个现成的直流电机专用控制芯片,难啊~~~

直到现在,俺厂里较为好一点贵一点使用直流电机调速的产品,使用的还是俺十几年前搞的老掉牙电路,连俺自己想尽脑筋用足方法,都还没能力超越改进~~~ :L

使用特权

评论回复
194
123jj| | 2011-5-17 05:45 | 只看该作者
另外,配这个电机的减速箱 减速比,有以下4种规格,在额定 6V工作电压下,转速 和 外型颜色 见括号内。

可供匠人您选择,如需要俺寄两个给您。

1:48(220转 黄色)
1:87(120转 白色)
1:220(48转 绿色)
1:280(37转 白色)

使用特权

评论回复
195
123jj| | 2011-5-17 06:00 | 只看该作者
题外话:

说点当时挑选电机时的综合考虑。

摆在俺面前的,这4种减速电机,但能用上的只有两种转速偏高的,即减速比1:48(220转 黄色)和 减速比1:87(120转 白色)这两种。

如采用转速较低的120转的那一种,俺无法保证能让小车在躺倒时站立起来。

但采用转速较高的220转的那一种,俺希望通过高转速的爆发线速度,让躺倒的小车重新站起来!:lol

使用特权

评论回复
196
程序匠人|  楼主 | 2011-5-17 10:31 | 只看该作者
123jj 起得真早。我很少在7点之前醒来过。除非设错了闹钟。

使用特权

评论回复
197
程序匠人|  楼主 | 2011-5-17 16:38 | 只看该作者
今天把最后一个电机驱动芯片L293D给烧了。

在无数次的插拔电源线的过程中,终于有一次,老眼昏花,把线接反。于是,又是一股熟悉的妖气……。

123jj再给我寄几颗L293D芯片点过来吧。。。。

使用特权

评论回复
198
wubowww888| | 2011-5-17 22:44 | 只看该作者
匠人眼镜度数不高呀!

使用特权

评论回复
199
123jj| | 2011-5-18 05:26 | 只看该作者
今天把最后一个电机驱动芯片L293D给烧了。

在无数次的插拔电源线的过程中,终于有一次,老眼昏花,把线接反。于是,又是一股熟悉的妖气……。

123jj再给我寄几颗L293D芯片点过来吧。。。。 ...
程序匠人 发表于 2011-5-17 16:38



匠人jj 要的 L293D芯片已寄出,请注意查收。。。。


匠人jj 这匹老马都失蹄,看来俺设计的电路偷工减料太绝了,有些东东不能省,特别是对新手玩家,下一版PCB改进,增加:
1. 加个防电源反接保护二极管。
2. 加个总电源开关。
3. 将加速度传感器MMA7361的Z轴输出直接引入放大器。
4. 其他的改进待定,欢迎玩友们大力拍砖。。。。

使用特权

评论回复
200
123jj| | 2011-5-18 05:44 | 只看该作者
L298 和 L293 的频率是不一样的。

如果说 L293 是36变的猪八戒,那L298 就是72变的孙悟空啦。
程序匠人 发表于 2011-5-14 16:51



匠人的形容很绝,不过事实上,这两者的频率想差不大。最主要的是制造工艺差别。

L293D 片内输出端,集成了 8个寄生二极管,开关速度不够快,影响了整个驱动频率。

L298 片内没有集成 8个泄放二极管,需外接高速开关二极管,因此,整个驱动频率较高,而这最高工作频率,又取决于外接高速开关二极管的速度,如改用肖基特二极管,可让L298工作于更高的频率。

同理,如想让L293D 工作于更高频率,只需在片外并联 8个高速泄放二极管,芯片的实际工作频率成倍上升。

由于本《两轮平衡小车》号称是史上最"烂"的,因此,偷工减料也属正常,见谅。。。。

使用特权

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

本版积分规则