目录
1 ADC 简介
2 Exynos4412下的ADC控制器
2.1 总览
2.2 特征
2.3 ADC转换时间
2.4 IO口
编辑3 ADC寄存器详解
3.1 寄存器介绍
3.2 ADCCON控制寄存器
3.3 ADCDAT
3.4 CLRINTADC
3.5 ADCMUX
编辑
4 ADC编程
1 ADC 简介
ADC(Analog to Digital Converter)即模数转换器,指一个能将模拟信号转化为数字信号的电子元件
现在的芯片一般都集成了ADC功能,不需要单独再配置ADC的芯片。 怎么转换的不需要特别了解。
ADC主要参数:分辨率
ADC的分辨率一般以输出二进制数的位数来表示,当最大输入电压一定时,位数越高,分辨率越高; n位的ADC能区分输入电压的最小值为满量程输入的1/2^n; 比如一个12位的ADC,最大输入电压为1.8v,那么该ADC能区分的最小电压为1.8v/2^12≈0.00044v,当转换的结果为m时,则 实际的电压值为m*(1.8v/2^12);
2 Exynos4412下的ADC控制器
滑动变阻器VR1 0~1.8V编号
对应核心板引脚
2.1 总览
10位或12位CMOS模拟数字转换器(ADC)由4个通道的模拟输入组成。它将模拟输入信号以最大转换速率1MSPS,5MHz的A/D转换器时钟,转换为10位或12位的二进制数字代码。A/D转换器配备片上采样保持功能。ADC支持低功耗模式。
2.2 特征
分辨率:10位/12位(可选)
模拟输入范围:0 ~ 1.8V
2.3 ADC转换时间
PCLK是ADC的时钟源,分配器66降速后采样频率1Mhz,转换时间5个时钟可以转换1次,即5us。
2.4 IO口
3 ADC寄存器详解
3.1 寄存器介绍
实验只用到ADCCON、ADCDAT、ADCMUX
3.2 ADCCON控制寄存器
ECFLG:1代表模拟信号转换为数字信号已经完成 0代表没完成
PRSCEN:打开分频器
PRSCVL:分配器倍数,n+1
STANDBY:待机模式和工作模式
READ_START:触发方式 如果读了会开始下一次转换,不读数据一直会存在,不会转换
ENABLE_START:触发方式 1 ADC转换开始,转换完自动写0
(两种触发方式不能共存)
3.3 ADCDAT
只读,12位。读完需要进行处理,高位需要屏蔽清零。
3.4 CLRINTADC
本实验不需要
3.5 ADCMUX
同一时刻只能检测一个通道,但是可以分时复用
4 ADC编程
代码
#include "exynos_4412.h"int main()
{unsigned int AdcValue;/*设置ADC精度为12bit*/ADCCON = ADCCON | (1 << 16);/*使能ADC分频器*/ADCCON = ADCCON | (1 << 14);/*设置ADC分频值 ADC时钟频率=PLCK/(19+1)=5MHZ ADC转换频率=5MHZ/5=1MHZ*/ADCCON = ADCCON & (~(0xFF << 6)) | (19 << 6);/*关闭待机模式,使能正常模式*/ADCCON = ADCCON & (~(1 << 2));/*关闭通过读使能AD转换*/ADCCON = ADCCON & (~(1 << 1));/*选择转换通道,3通道*/ADCMUX = 3;while(1){/*开始转换*/ADCCON = ADCCON | 1;/*等待转换完成*/while(!(ADCCON & (1 << 15)));/*读取转换结果*/AdcValue = ADCDAT & 0xFFF;/*将结果转换成实际的电压值mv*/AdcValue = AdcValue * 0.44;/*打印转换结果*/printf("AdcValue = %dmv\n",AdcValue);}return 0;
}
5 练习
编程实现通过LED状态显示当前电压范围
注:
电压在1501mv~1800mv时,LED2、LED3、LED4、LED5点亮
电压在1001mv~1500mv时,LED2、LED3、LED4点亮
电压在501mv~1000mv时,LED2、LED3点亮
电压在0mv~500mv时,LED2闪烁
#include "exynos_4412.h"void Delay(unsigned int Time){while(Time--);}void Led_on(int num){switch(num){case 2:GPX2.DAT = GPX2.DAT | (1 << 7);case 3:GPX1.DAT = GPX1.DAT | (1 << 0);case 4:GPF3.DAT = GPF3.DAT | (1 << 4);case 5:GPF3.DAT = GPF3.DAT | (1 << 5);default:break;}}void Led_off(int num){switch(num){case 2:GPX2.DAT = GPX2.DAT & ~(1 << 7);case 3:GPX1.DAT = GPX1.DAT & ~(1 << 0);case 4:GPF3.DAT = GPF3.DAT & ~(1 << 4);case 5:GPF3.DAT = GPF3.DAT & ~(1 << 5);default:break;}}int main()
{unsigned int AdcValue;int i;GPX2.CON = GPX2.CON & (~(0xF << 28)) | (0x1 << 28); //LED2 GPX2_7 outputGPX1.CON = GPX1.CON & (~0xF) | 0x1; //LED3 GPX1_0 outputGPF3.CON = GPF3.CON & (~(0xF << 16)) | (0x1 << 16); //LED4 GPF3_4 outputGPF3.CON = GPF3.CON & (~(0xF << 20)) | (0x1 << 20); //LED5 GPF3_5 output/*设置ADC精度为12bit*/ADCCON = ADCCON | (1 << 16);/*使能ADC分频器*/ADCCON = ADCCON | (1 << 14);/*设置ADC分频值 ADC时钟频率=PLCK/(19+1)=5MHZ ADC转换频率=5MHZ/5=1MHZ*/ADCCON = ADCCON & (~(0xFF << 6)) | (19 << 6);/*关闭待机模式,使能正常模式*/ADCCON = ADCCON & (~(1 << 2));/*关闭通过读使能AD转换*/ADCCON = ADCCON & (~(1 << 1));/*选择转换通道,3通道*/ADCMUX = 3;while(1){/*开始转换*/ADCCON = ADCCON | 1;/*等待转换完成*/while(!(ADCCON & (1 << 15)));/*读取转换结果*/AdcValue = ADCDAT & 0xFFF;/*将结果转换成实际的电压值mv*/AdcValue = AdcValue * 0.44;if((AdcValue >= 0) && (AdcValue <= 500)){Led_on(2);Led_off(3);Led_off(4);Led_off(5);}else if ((AdcValue > 500) && (AdcValue <= 1000)){Led_on(2);Led_on(3);Led_off(4);Led_off(5);}else if ((AdcValue > 1000) && (AdcValue <= 1500)){Led_on(2);Led_on(3);Led_on(4); Led_off(5); }else if((AdcValue > 1500) && (AdcValue <= 1800)){Led_on(2);Led_on(3);Led_on(4); Led_on(5);}/*打印转换结果*/printf("AdcValue = %dmv\n",AdcValue);}return 0;
}