目录
一、ADC简介
二、Exynos_4412下的ADC控制器
三、ADC寄存器详解
四、ADC编程
一、ADC简介
ADC(Analog to Digital Converter)即模数转换器,指一个能将模拟信号转化为数字信号的电子元件
对于CPU来说只能处理数字信号,而很多外围输入信号都是模拟信号,所以就有了ADC。
以前用51的时候这个单片机功能比较少在使用一些传感器时需要在额外买ADC芯片,但是后来我学32以及现在用这个4412他们都比较高级内部集成了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);
二、Exynos_4412下的ADC控制器
可选10位精度或者12位精度,有四个通道,最大转换速度1M s是采样 ps是秒,采样频率是1M/s。
他有一个前提ADC时钟是5MHz。每五个时钟采样一次。支持采样保持功能和低功耗模式
模拟输入范围是0-1.8v,我发现一个问题4412的电压都很低,这样功耗低,不容易发热,但是驱动一些硬件的能力也随着减弱了。
PCLK是时钟源,是100M的,这里拿66M举例,当分频是65时,分频后的时钟频率就是1M
采样时间就是1M在除以5,因为他五个周期采样一次所以就是200kHz 也就是5us采样一次。
但是注意他不能超过5M因为他的极限速度是1M
三、ADC寄存器详解
控制寄存器、延时寄存器、数据寄存器、中断功能寄存器、选择通道
RES: 设置是10位还是12位
ECFLG:这个写的有问题它是只读的前面标错了,0正在转换1转换完成
PRSCEN: 1打开分频器0关闭分频器
PRSCVL:实际的分频倍数 一定要在19-255之间
STANDBY: 1待机模式(低功耗模式)0正常模式
READ_START:读走数据继续转化,不读就停止转化 1开启 0关闭
ENABLE_START:写1开始转化,然后自动变成0,开启READ_START模式此模式自动失效。
存储转化结果,读的时候要将高20位清零不然随机结果可能会影响结果。
由于ADC只有一个而我们有四个引脚支持ADC功能所以采取分时复用模式,同一时间只有一个通道可以转化
四、ADC编程
解压出一个新工程
#include "exynos_4412.h"
int main()
{
unsigned int adc_value;
//12
ADCCON = ADCCON | (1 << 16);
//使能ADC分频器
ADCCON = ADCCON | (1 << 14);
//100/(19+1)=5MHz 5 / 5 = 1MHz
ADCCON = ADCCON & (~(0xFF << 6)) | (19 << 6);
//关闭待机模式
ADCCON = ADCCON & (~(1 << 2));
//关闭通过读使能AD转换
ADCCON = ADCCON & (~(1 << 1));
ADCMUX = 3;
while(1)
{
//开始
ADCCON = ADCCON | 1;
while(!(ADCCON & (1 << 15)));
//读取
adc_value = ADCDAT & 0xFFF;
// 1800mV/2^12=1800/4096=0.44
adc_value = adc_value * 0.44;
printf("adc_value = %d mV\n",adc_value);
}
return 0;
}
最大是1801差不多,因为这个0.44是约值。