AVR单片机ADC的应用
1.数模转换的基础知识
数模转换器(ADC)基本上是一个比例上的问题,即由ADC产生的数字值跟输入模拟量与转换器量程的比值有关的。转换关系如下:
Vin/Vfullscale=X/(2N-1)其中X是数字输出,N是数字输出的位数(ADC的位数),Vin是模拟输入量的值,Vfullscale是模拟输入量的最大值。
数模转换的转换精度计算:
Vresolution=Vfullscale/((2N-1)
2.AVR微控器的ADC介绍
AVR微控器的ADC具有两个ADC寄存器:ADC控制与状态寄存器ADCSR控制ADC的运行;ADC多路复用选择器ADMUX,控制8个测量的模拟量输入。
为了ADC以最大的精度操作时,要求使用50HZ---200K HZ之间的时钟频率,选择合适的比例分频因子以获得50HZ---200KHZ的转换频率。由于ADC的速度比较慢,如果处理器在ADC转换数据时处于等待状态,会浪费时间,则ADC通常采用中断模式。ADC初始化:
(1)设置ADCSR的最低三位,确定分频因子
(2) 设置ADIE为1,打开中断模式
(3)设置ADEN为高电平,使ADC有效
(4) 设置ADSC,以马上开始转换
3.应用
系统功能:当在模拟通道3输入电压超过3V时,系统点亮红色LED;当输入电压小于2V时,点亮黄色LED,当输入电压在2V--3V间,点亮绿色LED.
硬件连接:三个LED分别接至AT908535的PORD口的PORTD.0、 PORTD.1、PORTD.2AVR微控制器的ADC外设会根据所使用的具体微控制器而有所不同,所有的ADC都对VCC连接中的引脚电压有噪声抑制要求,有些拥有内置的噪声消除器,有些则拥用在内部控制Vref的能力,使用ADC时需要查看相关微控制器的手册。
程序代码:
#i nclude<90s9535.h>
#define LEDS PORTD
#define red 0xfe
#define yellow 0xfd
#define green 0xfc
#define uchar unsigned char
interrupt[ADC_INT] void adc_isr(void)
{
uchar adc_data; //variable for ADC result
adc_data=ADCW; //read all 10bits into variable
if(adc_data>(3*1023)/5)
LEDS=red;
else(adc_data<(2*1023)/5)
LEDS=yellow;
else
LEDS=green;
ADCSR=ADCSR|0x40; //start the next conversion
}
void main()
{
DDRD=0x07; //least signifcant 3 bits for output
ADMUX=0x03; //select to read only channel 3
ADCSR=0xCE; //ADC中断,64分频
#asm("sei")
while(1); //等待ADC中断产生
}