编写加速度传感器代码遇到的问题,请高手指点~

[复制链接]
 楼主| zhangxiwl 发表于 2008-10-7 23:37 | 显示全部楼层 |阅读模式
这个问题属于程序算法+物理方面的问题,困惑我很久..希望大家指点..<br />系统功能为:使用三轴加速度传感器芯片测量汽车的加速度,maga16为CPU。<br />要求显示出的值为车子的实际加速度。即:显示的值=测出的值-静止时的值。<br />汽车行驶的方向为X轴,水平面与X轴垂直的方向为Y轴,垂直于X,Y平面的轴为Z轴。这个坐标轴的参考对象是传感器芯片PCB板,以板子为基准,当PCB板倾斜时该坐标轴也倾斜。<br />在设计算法时,如果汽车在水平面行驶,则Z轴输出为1g,X轴和Y轴测量出的值即为应该显示的值,关键就在车子倾斜时的算法,比如车子在斜坡上时..<br />以下是我的代码,AD转换共10位,单片机参考电压选5V。其中adc_data为模数转换的结果,adc_mux为AD通道选择,acceler为字符数组,该传感器芯片灵敏度为0.6v/g.其中在车子行驶在坡路时,显示出的X轴和Y轴数据不正常(主要显示X轴,其次是Y轴的数据。Z轴数据的算法不用修改了),改了很久都没成功,希望大家指教:<br />unsigned&nbsp;char&nbsp;cal_data;<br />float&nbsp;cal_xg;<br />if(adc_mux==0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//x&nbsp;raxi<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;acceler[0]='X';<br />&nbsp;&nbsp;&nbsp;&nbsp;if(adc_data&gt=317)&nbsp;&nbsp;//0g时输出电压AD结果为317<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;adc_data-=317;<br />&nbsp;&nbsp;&nbsp;&nbsp;acceler[7]='-';&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;adc_data=317-adc_data;<br />&nbsp;&nbsp;&nbsp;&nbsp;acceler[7]='+';&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;if(adc_data_z&lt=110)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;cal_xg=15129-adc_data_z*adc_data_z;<br />&nbsp;&nbsp;&nbsp;&nbsp;cal_xg=sqrt(cal_xg);<br />&nbsp;&nbsp;&nbsp;&nbsp;cal_data=cal_xg;<br />&nbsp;&nbsp;&nbsp;&nbsp;adc_data=abs(adc_data-cal_data);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;adc_xg=adc_data;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;if(adc_mux==1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//y&nbsp;raxi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;acceler[0]='Y';<br />&nbsp;&nbsp;&nbsp;&nbsp;if(adc_data&gt=337)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//0g时输出电压AD结果为337<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;adc_data-=337;<br />&nbsp;&nbsp;&nbsp;&nbsp;acceler[7]='-';<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;adc_data=337-adc_data;<br />&nbsp;&nbsp;&nbsp;&nbsp;acceler[7]='+';&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(adc_data_z&lt=110)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;cal_xg=15129-adc_data_z*adc_data_z;<br />&nbsp;&nbsp;&nbsp;&nbsp;cal_xg=sqrt(cal_xg);<br />&nbsp;&nbsp;&nbsp;&nbsp;cal_data=cal_xg;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;adc_data=abs(adc_data-cal_data);<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;adc_yg=adc_data;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;if(adc_mux==2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//z&nbsp;raxi<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;acceler[0]='Z';<br />&nbsp;&nbsp;&nbsp;&nbsp;if(adc_data&gt=331)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//0g时输出电压AD结果为331<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;adc_data-=331;<br />&nbsp;&nbsp;&nbsp;&nbsp;acceler[7]='+';&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;adc_data=331-adc_data;<br />&nbsp;&nbsp;&nbsp;&nbsp;acceler[7]='-';&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;adc_data_z=adc_data;<br />&nbsp;&nbsp;&nbsp;&nbsp;}
wuming1106 发表于 2008-10-8 08:54 | 显示全部楼层

呵呵~这个东西我也尝试过,是用数字式的加速度传感器

你用的是什么型号的传感器?
 楼主| zhangxiwl 发表于 2008-10-8 09:09 | 显示全部楼层

MMA7260Q~望指教

飞思卡尔的MMA7260Q~
 楼主| zhangxiwl 发表于 2008-10-16 14:42 | 显示全部楼层

哪位使用过这种传感器?

哪位使用过这种传感器?<br />怎样才能够实现,显示车辆实际加速度?
dragon_hn 发表于 2008-10-16 15:33 | 显示全部楼层

传感器是要校验的

首先把PCB水平静止放置,读取X,Y,Z三轴的ADC结果,保存到EEPROM中。然后把PCB水平倒置,读取X,Y,Z三轴的ADC结果,保存到EEPROM中。然后……<br /><br />把六个方向都测试完毕,再计算到底是XXX/g,XXX不一定要是多少mV,用16进制表示的ADC结果就行了。<br /><br />因为MMA7260Q的输出电压是跟MMA7260Q的VCC相关的,MEGA16的ADC结果是跟Vref相关的,还有焊接时的高温会倒置MMA7260Q输出漂移。<br /><br />再不行的话请我吃饭先^_^
cauhorse 发表于 2008-10-16 17:08 | 显示全部楼层

先标定,再使用

试试。
 楼主| zhangxiwl 发表于 2008-10-17 00:19 | 显示全部楼层

标定、校验的目的是什么呢?

我感觉MMA7260不应该叫加速度传感器,而应该叫力传感器。<br />因为它在静止时有输出,而如果静止是不应该有象征加速度值的输出的。<br />标定是为了减小误差吗..其实主要的问题不是误差而是计算原理..<br />一直很困惑..<br />关键就是,如果在坡路上面PCB板沿路面加速行驶,它与水平面有一定角度。<br />芯片输出的值并不是实际加速度值,<br />而应该是实际加速度减去在此位置静止时输出的值,<br />这两者的差才是芯片实际输出的值。<br />这个芯片是否可以实现显示车辆真实加速度的功能呢???<br />大家有什么好的想法么??<br />先谢谢大家了<br />
awey 发表于 2008-10-17 00:25 | 显示全部楼层

标定、校验的目的就象在杆秤上标刻度

记得小时后看过别人做杆称,因称杆的粗细不一,也不均匀,所以要等做好后,再分别用已知重量的铁块做标准,来确定杆上的刻度。
dragon_hn 发表于 2008-10-17 03:09 | 显示全部楼层

笔误:应该叫校正、校准,而不是校验!

如附图所示。<br />要计算汽车的加速度,必须假设汽车只有Y方向的加速度,Z方向就是重力加速度G。<br />当汽车上坡的时候,Z方向的重力加速度正交分解,就能测出坡度,知道了坡度,再把Y正交分解,就能算出Y方向的实际加速度。<br />当然汽车在Y方向的重力加速度也会正交分解到Z方向。<br /><br />初中数学知识,高中物理知识。<br /><br />MMA7260在静止时是有Z方向的输出的,X和Y为中间值,这点在DATASHEET中有详细的描述。
jiyiche 发表于 2009-8-13 21:52 | 显示全部楼层
个人理解:我觉得要测小车的加速度,必须知道小车所在的坡的角度,或者要知道小车在静止时的XYZ轴输出值,然后在这基础上才能算出加速度。因为小车在静止时,芯片有一个重力加速度,小车加速行驶时,是要去除这个标定值的。呵呵,刚接触这东西,个人浅薄理解。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

10

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

5

主题

10

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部