一、准备工作
1、KEIL C51编译环境
2、CodeGen8 代码生成器
3、MC96F6332D 开发板
4、USB-OCD II仿真器
二、ADC的配置和代码生成
1、在CodeGen8 代码生成器的外设窗口中选择内部RC时钟作为时钟源,设置时钟源的频率为8MHz;设置外部P02引脚为ADC模拟输入引脚AN0,如下图①所示,ADC配置部分,触发采用ADST进行触发,数据对齐方式为LSB对齐,ADC采样时钟采用系统fx/1的时钟,具体配置如下图②所示;ADC部分生成的代码如下如③所示,其中包括ADC的初始化、开始和读取三部分:
2、点击CodeGen8 中的C 图标,自动打开KEIL C51软件;
3、在工程中增加ADC的计算函数:ADC读取内部数据寄存器后,对数据进行转换计算,可以方便的从单片机串口输出转换的结果,即ADC采集的数据便可以直观的被展现出来;ADC的计算函数代码如下所示:
float ADC_Calculation(void)
{
unsigned int adcVal;
ADC_start(0);
adcVal = ADC_read(); //获取ADC采集到的数据,为下面的计算做准备
return ((5.0/4096)*adcVal); //此处的参考电压默认为5.0V,如果MCU供电为3.3V,修改为3.3即可
}
注意:本例中MC96F6332D的ADC参考电压选择为MCU的供电电压,MC96F6332D同样支持外部的参考电压AVREF供电;本例中针对的MCU供电电压为5.0V;如果电源供电为3.3V,仅仅需要修改代码中数值从5.0V到3.3V即可实现;
4、编译工程,结果如下所示:
5、关于ADC工作流程简介:
1)、ADC的方框图如下所示:
2)、ADC的转换过程应该遵循如下流程:
3)、寄存器中重点分析控制寄存器:
ADCCRH寄存器配置为:无中断,ADST触发,LSB数据对齐方式,ADC转换频率选择fx/1;
ADCCRL配置为:内部的VDD为ADC的参考电压,选择模拟通道AN0(注意在I/O配置P02功能为AN0)
6、点击编译器的下载按钮,将刚刚编译好的代码下载到MCU中进行仿真调试。
7、连接串口助手到PC端,可以看到代码运行符合预期,因为工程程序中采用了WT定时1秒,所以ADC同样会进行1秒1次的数据采集,串口同样会1秒1次进行数据输出,如下所示:
上图①:MCU上电前已经把AN0接到了demo板的地引脚,可以看出板子上电初始化后对ADC的读取是正常的;
上图②:拔下AN0的连接线,ADC在不停的采集数据,此时AN0处于悬空状态,采集的数据会出现跳变,属于正常现象;
上图③:AN0连接到电源引脚,可以看出ADC读取的数据符合预期。
注意:本例中没有对数据进行滤波消抖处理,正常的项目上需要对数据进行滤波消抖,以防止ADC的数据跳变引起系统的误操作;关于ADC的滤波消抖算法大家可以自行百度,进行查阅。
三、实验现象(具体内容可以参考工程中的Readme.txt文件)
1、MCU主频选择为内部8MHz;
2、ADC没有连续转换功能,需要不断的进行触发转换;ADC的流程应该遵循参考用户手册中图11.56给出的流程;
3、本例中完整代码可以访问链接:https://share.weiyun.com/5dTOWxP;进行免费获取。
因为小编自己能力水平有限,文中难免有错误或表达失误的信息,还望广大阅读者留言批评指正,谢谢!