前言
一、ADC(模数转换电路)
功能: 能够将模拟信号转换成数字信号表示值的电路
ad比较重要的参数:
- 量程
- 位数 精度–》数字信号改变1对应多大的模拟信号变化
精度=量程/2的位数次方 - 速率(转换速率)
- 误差
2440的adc是内部电路;
量程为0-3.3V,位数为10,转换速率最高位500k(工作在2.5M);
二、ADC的两种工作模式
1.单次转换:
(1)读转换:读一次转换一次(第一次的结果丢弃)
(2)start转换:一个start信号转换一次
2.连续转换
三、ADC电路的使用
S3C2440有板载的AD输入,原理图如下:
这里的AIN0引脚并非复用引脚,所以只需要使能ADC电路即可;
四、编程方法
- A/D 转换的数据可以通过中断或查询方式访问。中断方式的总体转换时间为从 A/D 转换器开始到转换数据的读取,可能由于中断服务程序的返回时间和数据访问时间而延迟。查询方式是通过检查转换结束标志位的 ADCCON[15],可以确定读取 ADCDAT 寄存器的时间。
- 还提供了其它启动 A/D 转换的方法。在转换的读启动模式 ADCCON[1]设置为 1 后,A/D 转换启动同时读取数据;
- ADC控制的相关寄存器如下:
五、 ADC编程
#include "adc.h"
void adc_init()
{
ADCCON = (1<<14)|(19<<6);// 使能分频 0通道 start模式 (这里的两个或不能分开写),也设置了AIN0为输入通道
}
void adc_init_read()
{
ADCCON = (1<<14)|(19<<6)|(1<<1);// 使能分频 0通道 read模式
}
void get_adc()
{
int adc = -1;
while (!(ADCCON & (1<<15))); //等待有数据转换成功
adc = ADCDAT0 & 0x3ff;
uprintf("adc = %d\r\n", adc);
}
void start_read()
{
int adc = -1;
adc = ADCDAT0; //空转一次
}
void start()
{
ADCCON |= 1;
}
5.1 单次转换
这里的start信号必须在循环内得到的转换数值才是动态变化的,放在循环外部数据时不变的;
void main(void)
{
uart_init();
uprintf("ni hao pc!\r\n");
adc_init();
while(1)
{
start(); //单次转换,所以start放在循环外面里面获取的adc数据是固定的
get_adc(); //获取ADC转换数值
delay();
}
}
5.2 连续转换
void main(void)
{
uart_init();
uprintf("ni hao pc!\r\n");
adc_init_read();
start_read(); //读转换可以做到单次转换做到连续
while(1)
{
get_adc();
delay();
}
}
最终的转换结果为:
5.3 ADC中断
void adc_eint()
{
ADCCON = (1<<14)|(19<<6);// 使能分频 0通道 start模式 (这里的两个或不能分开写)
INTSUBMSK &= ~(1<<10);
INTMSK &= ~(1<<31);
}
void do_adc()
{
int adc = -1;
while (!(ADCCON & (1<<15)));
adc = ADCDAT0 & 0x3ff;
uprintf("adc = %d\r\n", adc);
SUBSRCPND |= 1<<10;
SRCPND |= 1<<31;
INTPND |= 1<<31;
}
总结
本期和大家主要分享的是ADC电路的基本原理以及ADC模数转换电路的编程使用,分为两种模式,单次转换和连续转换两种转换模式,单词转换需要用户自己每次手动进行转换,而连续转换,当数据转换完毕时,对应的标志位会置位,接下来可以对数据寄存器中的数据进行读取即可;最后,各位小伙伴们如果喜欢我的分享可以点赞收藏哦,你们的认可是我创作的动力,一起加油!