本节通过一个测量电阻值的电路来学习如何把测量的数字结果转换成能够理解的物理数据,并将其显示出来。
【例8-3】电路图如图8-7所示。用PIC单片机的A/D转换功能测量RV2滑动端的对地电阻值,并将其显示在4位数码管上。设主频为4MHz。
电路图在光盘位置:“\Example\Chapter8\S083\adcsmg4.DSN”。
图8-7 电位器电阻值测量电路图
题意分析
●由图8-7可知A/D输入通道用的是RA0,所以程序中应该把A口置为输入状态并把A/D转换通道设为AN0。
●W1是一个4位的数码管显示器件。
●题意要求测量RV2滑动端的对地电阻值x,而A/D转换只能得到一个相对的数字电压值v,那么x和v有什么关系呢?根据欧姆定律可知x与RA0的输入电压v成正比。当滑动端移到最右侧时x为0,v为0V(对应数字值为0);当滑动端移到最左侧时x为5000Ω,v为5V(对应数字值为1023)。由此可得出
x/(5000-0)=v/(1023-0)
其中,v值可以通过PIC的A/D转换获得。由此推出
x=5000*v/1023;
这样只需要编程实现获得v的值就可以得到x。然后调用DisplayData函数就可以显示x的数值了。
●为了获得10位的转换结果v(程序中用adcres表示),这需要对转换结果寄存器ADRESH和ADRESL的内容进行有机组合。本例采用转换结果右对齐(ADFM=1),即ADRESL保存转换结果的低8位,ADRESH的最低两位保存转换结果的高两位。需要把两个寄存器的内容合成一个10位的值,这样需要一个10位的变量来保存,由于C语言中没有10位的变量类型,所以用16位的整型变量adcres来保存此10位结果。经过以上分析,可以得出adcres与ADRESH、ADRESL的关系。
adres=(((unsignedint)ADRESH)<<8)+ADRESL;
这里(unsignedint)的作用是把ADRESH扩展为16位数据,这样左移8位后不会丢失原有数据。加小括号的作用是明确表示运算顺序。(www.daowen.com)
设计过程
1)用MPLAB新建项目S083,语言工具选择为“HI-TECH Universal Toolsuite”,保存在“C:\S083”文件夹下(本项目所有内容参考光盘“\Example\Chapter8\S083”文件夹内容)。
2)新建main.c文件并加入项目中,其内容如下所示。
3)新建seg74.h文件并加入项目中,其内容如下所示。
4)新建seg74.c文件并加入项目中,其内容如下所示。
5)新建myfuncs.h文件并加入项目中,其内容如下所示。
6)新建myfuncs.c文件并加入项目中,其内容如下所示。
7)程序录入完毕后,保存并编译。然后用调试工具Proteus VSM载入电路图adcsmg4.DSN来模拟运行。运行时用鼠标控制电位器滑动端使其滑动到最右端,观察数码管显示结果,正常是0000。再用鼠标控制电位器滑动端使其滑动到最左端,观察数码管显示结果,正常是5000。再用鼠标控制电位器滑动端使其滑动到正中间,即电位器百分比显示50%,观察数码管显示结果,读者会发现结果是2497,并不是想象中的2500,其中原因是因为A/D转换存在一定误差。如果误差在用户要求允许的范围内就不用在意了,若用户有更高的要求,可以根据产品性能或价格的指标来决定采用硬件方法(用高分辨率A/D转换器)或软件方法(软件滤波)来减小误差,提高精度。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。