一、AD转换基本原理
AD(Analog to Digital) 意思是:模—数转换,它是外部世界模拟信号和计算机之间联系的接口。它将连续变化的模拟信号转换为数字信号,以便计算机和数字系统进行处理、存储、控制和显示。
AD转换器是用来通过一定的电路将模拟量转变为数字量。模拟量可以是电压、电流等电信号,也可以是压力、温度、湿度、位移、声音等非电信号。但在AD转换前,输入到AD转换器的输入信号必须经各种传感器把各种物理量转换成电压信号。AD转换后,输出的数字信号可以有8位、10位、12位、14位、16位等。
S3C2410/S3C2440的CMOS模数转换器可以接收8个通道的模拟信号输入,并将它们转换为10位的二进制数据。在2.5MHZ的A/D转换时钟下,最大的转化速率可达500SPS(SPS:samples per secone 每秒采样的次数)。
S3C2410的AD采集的最小量化单位为3.3V/(2^10)=3.222mV,也即当输入最大电压3.3V时,10位数据位为11 1111 1111 (对应十进制是1024),此时对应的电位器阻值为:1024*3.222mV*10^4/3.3≈10KΩ。
二、AD转换相关的寄存器:
ADC控制寄存器(ADCCON)
ADC触摸屏控制寄存器(ADCTSC)
ADC启动延时寄存器(ADCDLY)
ADC转换数据寄存器(ADCDATn)
说明:
时钟公式:A/D converter freq. = PCLK/(prescaler+1) = f
Conversion time = 1/(f / 5cycles) = 1/200KHz = 5 us
通过设置ADC控制寄存器ADCCON,ADCCON[14]位启用预分频器,ADCCON[13:6]位配置预分频值prescaler valuef,从而根据公式得到所需时钟频率(A/D converter freq.)。
ADCDATn有ADCDAT0和ADCDAT1两个ADC转换数据寄存器。
ADCDATn为只读。
在触摸屏应用中,ADCDAT0和ADCDAT1保存X和Y位置转换数据。
普通的AD转换,只用ADCDAT0来保存转换后的数据。
启动AD转换,寄存器ADCCON[0]位置置1即可,后加while(ADCCON&0x1);等待成功开启。
等待转换结束,使用while(!(ADCCON&0x8000));即可。
通过寄存器ADCDAT0低10位读取转换结果(ADCDAT0&0x3ff)。
三、AD接口编程一般步骤
1、设置AD是否分频、工作时钟、工作方式
2、选择模拟输入通道
3、启动AD转换
4、等待AD转换结束
5、读取AD转换结果
四、编程实例及代码
从A/D转换器的通道0获取模拟数据,并将转换后的数字量在CRT上打印出来。
1.定义与A/D转换相关的寄存器。
#define rADCCON (*(volatile unsigned *)0x58000000) //ADC控制寄存器
#define rADCTSC (*(volatile unsigned *)0x58000004) //ADC触摸屏控制寄存器
#define rADCDLY (*(volatile unsigned *)0x58000008) //ADC启动或间隔延时寄存
器
#define rADCDAT0 (*(volatile unsigned *)0x5800000c) //ADC转换数据寄存器0
#define rADCDAT1 (*(volatile unsigned *)0x58000010) //ADC转换数据寄存器1
2.对A/D转换器进行初始化。这里的参数ch表示选择的通道号。
void AD_Init(unsigned char ch){
rADCDLY = 100; //ADC启动或间隔延时
rADCTSC = 0; //选择ADC模式
rADCCON = (1<<14)|(49<<6)|(ch<<3)|(0<<2)|(0<<1)|(0); //设置ADC控制寄存器
}
3.获取A/D的转换值。参数ch为选用的通道号。
int Get_AD(unsigned char ch){
int i;
int val=0;
if(ch>7) return 0; //通道不能大于7
for(i=0;i<16;i++){ //为转换准确, 转换16次
rADCCON |= 0x1; //启动 A/D 转换
rADCCON = rADCCON & 0xffc7 | (ch<<3);
while (rADCCON & 0x1); //避免第一个标志出错
while (!(rADCCON & 0x8000)); //避免第二个标志出错
val += (rADCDAT0 & 0x03ff);
Delay(10);
}
return (val>>4); //为转换准确, 除以16取均值
}
4. UART打印A/D的转换值。
void display_adc(int val)
{
int ch=val;
ch=ch&0x200;ch=ch>>9;sendc(ch);
ch=val;ch=ch&0x100;ch=ch>>8;sendc(ch);
ch=val;ch=ch&0x80;ch=ch>>7;sendc(ch);
ch=val;ch=ch&0x40;ch=ch>>6;sendc(ch);
ch=val;ch=ch&0x20;ch=ch>>5;sendc(ch);
ch=val;ch=ch&0x10;ch=ch>>4;sendc(ch);
ch=val;ch=ch&0x8;ch=ch>>3;sendc(ch);
ch=val;ch=ch&0x4;ch=ch>>2;sendc(ch);
ch=val;ch=ch&0x2;ch=ch>>1;sendc(ch);
ch=val;ch=ch&0x1;sendc(ch);
uart_txd('n');uart_txd('r');
}
5. 主函数
void main(void)
{
uart_init();
AD_Init(0);
while(1)
{
int val;
val=Get_AD(0);
display_adc(val);
}
}
UART相关配置见UART篇
上一篇:S3C2410 UART 发送变量字符
下一篇:mini2440A 裸机编程:串口控制LED灯的亮灭
推荐阅读最新更新时间:2024-11-13 15:52
设计资源 培训 开发板 精华推荐
- AM1/4S-1224SH30Z 24V 0.25 瓦 DC/DC 转换器的典型应用
- 用于 LED 照明的 10W、3-LED 大电流 LED 驱动器
- ADM1186-1ARQZ 四路电压升降序器和监视器的典型应用电路
- 1、2-LED 工业用大功率 LED 驱动器
- 使用 NXP Semiconductors 的 MPC5534 的参考设计
- 用于手机的 4-LED 白光 LED 驱动器
- LT8331IMSE 48V 输出 SEPIC 转换器的典型应用电路
- AT91SAM9G10-EK2、SAM9G10-EK2 评估套件基于 SMART AT91SAM9G10 SAM9G MCU
- 【已验证】USB转相机假电池供电
- NCP171AMX170165TCGEVB:NCP171:LDO 稳压器,超低 50nA Iq,具有双电源模式,80mA 评估板