新手快速入门《ADC范例》中列举了两种ADC转换方式:查询和中断方式。
我再补充一种:ADC噪声抑制模式:
/* ********************************************************
* 文件: adc.c
* 功能: ADC转换实验-ADC噪声抑制模式
* 工具: WinAVR20050214(AVR-GCC)
* mcu : Atmega8
* 时钟: 外部晶体8MHz
* 日期: 2005年10月25日
******************************************************** */
/**********************************************************/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
//单端通道,不放大
#define AD_SE_ADC0 0x00 //ADC0
#define AD_SE_ADC1 0x01 //ADC1
#define AD_SE_ADC2 0x02 //ADC2
#define AD_SE_ADC3 0x03 //ADC3
#define AD_SE_ADC4 0x04 //ADC4
#define AD_SE_ADC5 0x05 //ADC5
#define AD_SE_ADC6 0x06 //ADC6
#define AD_SE_VBG 0x1E //VBG 内部能隙1.23V电压基准,校准用
#define AD_SE_GND 0x1F //接地 校准用
//常量定义
#define Vref 2655 //mV 实测的Vref引脚电压4.93V供电
/*-------函数声明----------------------------------------------------------------------------------*/
uint16_t read_adc(unsigned char adc_input);
uint16_t Measured_Vol_INT(void);
/*----------------------------------------------------------------------------------------------------*/
SIGNAL(SIG_ADC) //ADC中断服务程序
{
}
uint16_t Measured_Vol_INT(void)
{
uint16_t M_Volt=0; //变换后的电压mV
uint32_t temp32;
uint8_t i;
for(i=0;i<24;i++)
{
sei();
MCUCR|=0x90; //休眠使能、ADC噪声抑制模式
ADMUX=0xC0|AD_SE_ADC0; //单端输入ADC0
ADCSRA|=(1<<ADIE); //使能ADC中断
ADCSRA|=(1<<ADEN)|0x06; //ADC 使能的时候,
asm("sleep"); //进入ADC噪声抑制模式将自动启动一次AD转换
temp32=(uint32_t)ADC*Vref;
M_Volt+=(uint16_t)(temp32/1023);
}
ADCSRA&=~(1<<ADIE); //禁止ADC中断
cli();
return(M_Volt/24);
}