现在俺们来讨论只使用一个陀螺仪(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数值处。才能让小车能勇敢的站立起来!
待续。。。。。 |