这个问题属于程序算法+物理方面的问题,困惑我很久..希望大家指点..<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 char cal_data;<br />float cal_xg;<br />if(adc_mux==0) //x raxi<br /> {<br /> acceler[0]='X';<br /> if(adc_data>=317) //0g时输出电压AD结果为317<br /> {<br /> adc_data-=317;<br /> acceler[7]='-'; <br /> }<br /> else<br /> {<br /> adc_data=317-adc_data;<br /> acceler[7]='+'; <br /> }<br /> if(adc_data_z<=110)<br /> {<br /> cal_xg=15129-adc_data_z*adc_data_z;<br /> cal_xg=sqrt(cal_xg);<br /> cal_data=cal_xg;<br /> adc_data=abs(adc_data-cal_data);<br /> }<br /> adc_xg=adc_data;<br /> }<br /> if(adc_mux==1) //y raxi <br /> {<br /> acceler[0]='Y';<br /> if(adc_data>=337) //0g时输出电压AD结果为337<br /><br /> {<br /> adc_data-=337;<br /> acceler[7]='-';<br /> }<br /> else<br /> {<br /> adc_data=337-adc_data;<br /> acceler[7]='+'; <br /> } <br /> if(adc_data_z<=110)<br /> {<br /> cal_xg=15129-adc_data_z*adc_data_z;<br /> cal_xg=sqrt(cal_xg);<br /> cal_data=cal_xg;<br /> <br /> adc_data=abs(adc_data-cal_data);<br /> } <br /> adc_yg=adc_data; <br /> }<br /> if(adc_mux==2) //z raxi<br /> {<br /> acceler[0]='Z';<br /> if(adc_data>=331) //0g时输出电压AD结果为331<br /><br /> {<br /> adc_data-=331;<br /> acceler[7]='+'; <br /> }<br /> else<br /> {<br /> adc_data=331-adc_data;<br /> acceler[7]='-'; <br /> }<br /> adc_data_z=adc_data;<br /> } |
|