MXD2020E的用法大概就是:测出X/Y轴输出信号的占空比,然后根据公式 An=(T1/T2-0.5)/20% 和 α = arcsin An/gn 即可算出倾斜角度
在网上找了一个程序,分析了一下 大概流程是这样的 用定时器测量高电平的时间,每10us进一次中断,制定了两个表格,每0.5°做一个元素,范围是-45°~45°,精度是0.5°,然后根据测量出来的时间 通过查表得到角度值
工程上要求精度是0.1°,测量范围是-90°~90°,如果现在还用表格有点不太现实对吗?通过示波器测量输出信号,占空比最大为70%,即90°,最小为30%,即-90°。要想提高精度,就要提高采样的频率,即缩短定时器每次进中断的时间,我采用的是12M晶振,
if(X_Pre==0)
TempX = 0; // 清除X轴计数器
else if(X_Current==1)
TempX++; // X轴计数器增加
else
Ax = TempX; // 导出X轴计数器结果
X_Pre = X_Current;
这是中断程序,Ax*单次中断的时间,即是高电平的时间,理论上单次中断的时间越短,则算出来的角度精度越高,但是采用12M晶振,实际测下来执行一次中断最短也要约5us,这样角度精度依然不够,想来想去,决定不用中断,直接在主函数中做,程序如下:
while(1)
{
key_scan();
if(key_en_flag)
{
key_en_flag = 0;
EA=0;
angel = 0;
for(i=0;i<10;i++)
{
while(X_IN);
while(!X_IN);
TR3=1;
while(X_IN);
TR3=0;
angel += TH3*256;
angel += TL3 ;
TL3= 0;
TH3= 0;
}
angel = angel/10;
angel = angel*2/3; //时钟周期个数*1/12us*8
angel = (angel/10000-0.5)*5;
angel = asin(angel);
angel = angel*180/PI;
angel = angel * 10;
angel = angel + 0.5;//四舍五入
angel = (int)angel;
EA = 1;
ranger_en = 1;
}
display(angel);
}
简单说下思路,当检测到测量按键以后,关闭总中断,等待信号输出脚的低电平,测到高定平时,开启定时器,测到低电平时,在关闭定时器,
得到定时器的值,即为高电平的时间,这样做10次,再取平均值,减小误差,得到了时间 (这样得到的时间值和实际的时间有大约10us的误差,不不知道什么原因,请高手们指点一下) 把测得时间带入两个公式 ,求出角度。
这样测试下来精度能达到0.1°,范围在-75°~90°之间,-75°~-90° 测不出来 不知道什么原因?
我知道上面讲的可能有很多错误,请高手们指点一下啊
|