这个问题属于程序算法+物理方面的问题,困惑我很久..希望大家指点.. 系统功能为:使用三轴加速度传感器芯片测量汽车的加速度,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; } |