目录
1.ADC的一些概念
2.S5PV210的ADC控制器
3.ADC控制器的主要寄存器
4.代码编程实战
1.ADC概念
- ADC:模数转换,cpu只能识别数字量,但是外界的电压、温度、等等都是模拟量,所以要将模拟量转换成数字量给cpu进行数据处理。
- AD转换器,A只能是电压、所以AD之前还需要接一个传感器、将模拟信号转换成电压信号(模拟)。
- 量程:AD输入端的模拟电压要求有一个范围,一般是0~3.3V或0~5V或者是0~12V
- 精度:10位AD,表示转出来的数字量有2^10个档次,即1024,每个档次代表数字量的精度,比如量程为:0~3.3V,则每个格子代表的电压值是3.3V/1024=0.0032265V。如果此时AD转换后得到的数字量是447,则这个数字量代表的模拟值是:447×0.0032265V=1.44V。
- 转换速率:一般数据手册中描述转换速率用的单位是MSPS(第一个M是兆,S是sample,就是采样;PS就是per second,总的意思就是兆样本每秒,每秒种转出来多少M个数字值),需要额外配置时钟(不是MSPS,但有关),譬如S5PV210中的AD转换器,MSPS = 时钟频率/5。
- 通道数:AD转换的模拟量输入通道。
2. S5PV210的ADC控制器
- ADC的时钟框图:
- ADC控制器
1.电阻式触摸屏本身工作时依赖于AD转换,所以在210的SoC中电阻触摸屏接口本身和ADC接口是合二为一的。或者说电阻触摸屏接口使用了(复用了)ADC的接口。
2 (1)210一共支持10个ADC通道,分别叫AIN[0]~AIN[9]。理论上可以同时做10路AD转换。
(2)SoC的引脚至少分2种:digit数字引脚和analog模拟引脚。我们以前接触的GPIO都属于数字引脚,ADC channel通道引脚属于模拟引脚。数字引脚和模拟引脚一般是不能混用的。
3. ADC控制器的主要寄存器
- Register map
1 TSADCCON0 :必要的配置
2 TSDATX0、TSDATY0: 转出来的AD值存在这里,我们读也是读这里
3 ADCMUX 选择当前正在操作的AD通道
4. 代码编程实战
#include "main.h"
#define TSADCCON0 0xE1700000
#define TSDATX0 0xE170000C
#define TSDATY0 0xE1700010
#define ADCMUX 0xE170001C
#define rTSADCCON0 (*(volatile unsigned int *)TSADCCON0)
#define rTSDATX0 (*(volatile unsigned int *)TSDATX0)
#define rTSDATY0 (*(volatile unsigned int *)TSDATY0)
#define rADCMUX (*(volatile unsigned int *)ADCMUX)
static void delay(void)
{
volatile unsigned int i,j;
for(i = 0;i<4000;i++)
for(j = 0;j<1000;j++);
}
static void adc_init(void)
{
rTSADCCON0 |= (1<<16); //bit[16] = 1 => 12bit A/D conversion
rTSADCCON0 |=(1<<14); //A/D converter prescaler enable
rTSADCCON0 &= ~(0xff<<6);
rTSADCCON0 |=(65<<6); // A/D converter prescaler value
rTSADCCON0 &= ~(1<<2);
rTSADCCON0 &= ~(1<<1);
rADCMUX &= ~(0xf<<0);
}
void adc_start(void)
{
adc_init();
unsigned int math_val;
while(1)
{
//1. 打开ADC
rTSADCCON0 |= (1<<0);
//2. 等待ADC结束
while(!(rTSADCCON0 & (1<<15)));
//3. 读取ADC数字量、显示数字量
math_val = rTSDATX0&(0xfff<<0);
printf("x:bit14 = %d\n",(rTSDATX0&(0x1<<14)));
printf("x:math_val = %d\n",math_val);
math_val = rTSDATY0&(0xfff<<0);
printf("y:bit14 = %d\n",(rTSDATY0&(0x1<<14)));
printf("y:math_val = %d\n",math_val);
//4. 延时
delay();
}
}