ABOV单片机模数转换ADC部分代码实现讲解及示例代码-[MC96F6332D]

一、准备工作

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;进行免费获取。


因为小编自己能力水平有限,文中难免有错误或表达失误的信息,还望广大阅读者留言批评指正,谢谢!

猜你喜欢

转载自blog.csdn.net/praguejing/article/details/105346616