|
新手快速入門《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); }
|