打印

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

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

    {
    adc_data-=337;
    acceler[7]='-';
    }
    else
    {
    adc_data=337-adc_data;
    acceler[7]='+';            
    }    
    if(adc_data_z<=110)
    {
    cal_xg=15129-adc_data_z*adc_data_z;
    cal_xg=sqrt(cal_xg);
    cal_data=cal_xg;
    
    adc_data=abs(adc_data-cal_data);
    }        
    adc_yg=adc_data;    
    }
    if(adc_mux==2)        //z raxi
    {
    acceler[0]='Z';
    if(adc_data>=331)        //0g时输出电压AD结果为331

    {
    adc_data-=331;
    acceler[7]='+';        
    }
    else
    {
    adc_data=331-adc_data;
    acceler[7]='-';            
    }
    adc_data_z=adc_data;
    }

相关帖子

沙发
wuming1106| | 2008-10-8 08:54 | 只看该作者

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

你用的是什么型号的传感器?

使用特权

评论回复
板凳
zhangxiwl|  楼主 | 2008-10-8 09:09 | 只看该作者

MMA7260Q~望指教

飞思卡尔的MMA7260Q~

使用特权

评论回复
地板
zhangxiwl|  楼主 | 2008-10-16 14:42 | 只看该作者

哪位使用过这种传感器?

哪位使用过这种传感器?
怎样才能够实现,显示车辆实际加速度?

使用特权

评论回复
5
dragon_hn| | 2008-10-16 15:33 | 只看该作者

传感器是要校验的

首先把PCB水平静止放置,读取X,Y,Z三轴的ADC结果,保存到EEPROM中。然后把PCB水平倒置,读取X,Y,Z三轴的ADC结果,保存到EEPROM中。然后……

把六个方向都测试完毕,再计算到底是XXX/g,XXX不一定要是多少mV,用16进制表示的ADC结果就行了。

因为MMA7260Q的输出电压是跟MMA7260Q的VCC相关的,MEGA16的ADC结果是跟Vref相关的,还有焊接时的高温会倒置MMA7260Q输出漂移。

再不行的话请我吃饭先^_^

使用特权

评论回复
6
cauhorse| | 2008-10-16 17:08 | 只看该作者

先标定,再使用

试试。

使用特权

评论回复
7
zhangxiwl|  楼主 | 2008-10-17 00:19 | 只看该作者

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

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

使用特权

评论回复
8
awey| | 2008-10-17 00:25 | 只看该作者

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

记得小时后看过别人做杆称,因称杆的粗细不一,也不均匀,所以要等做好后,再分别用已知重量的铁块做标准,来确定杆上的刻度。

使用特权

评论回复
9
dragon_hn| | 2008-10-17 03:09 | 只看该作者

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

如附图所示。
要计算汽车的加速度,必须假设汽车只有Y方向的加速度,Z方向就是重力加速度G。
当汽车上坡的时候,Z方向的重力加速度正交分解,就能测出坡度,知道了坡度,再把Y正交分解,就能算出Y方向的实际加速度。
当然汽车在Y方向的重力加速度也会正交分解到Z方向。

初中数学知识,高中物理知识。

MMA7260在静止时是有Z方向的输出的,X和Y为中间值,这点在DATASHEET中有详细的描述。

使用特权

评论回复
10
jiyiche| | 2009-8-13 21:52 | 只看该作者
个人理解:我觉得要测小车的加速度,必须知道小车所在的坡的角度,或者要知道小车在静止时的XYZ轴输出值,然后在这基础上才能算出加速度。因为小车在静止时,芯片有一个重力加速度,小车加速行驶时,是要去除这个标定值的。呵呵,刚接触这东西,个人浅薄理解。

使用特权

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

本版积分规则

5

主题

10

帖子

0

粉丝