#include#include "adcproc.h"#include "utils.h"#include "globdefs.h"#define SKIP_SAMPLES 1//ADC采样时忽略样本数#define BYTE unsigned char#define ADC_MUX_I 0x00//MUX选择第0通道#define ADC_MUX_U 0x01#define ADC_MUX_T 0x02BYTE fADCFlag = 0;int iADCData = 0;void InitADCSystem(void){ PORTA_PORTA0 = PORTA_PORTA1 = PORTA_PORTA2 = 0; //内部上拉电阻无效,减少干扰 DDRA_DDA0 = DDRA_DDA1 = DDRA_DDA2 = 0; //输入 ADMUX_REFS1 = ADMUX_REFS0 = 1; //内部参考电压2.56V ADCSRA_ADATE = 0; //单次转换模式 ADMUX_ADLAR = 0; //结果右对齐}void OpenADCSystem(void){ ADCSRA_ADEN = 1; //允许ADC转换 ADCSRA_ADIE = 1; //中断使能}void CloseADCSystem(void){ ADCSRA_ADEN = 0; ADCSRA_ADIE = 0; //关闭ADC中断}void SetADCInput(TMEAS_CHAN channel){ switch(channel) { case TMEAS_I_SENSE: ADMUX = ADMUX & 0xF0 | ADC_MUX_I; //ADMUX_MUX3=ADMUX_2=ADMUX_1=ADMUX_0=0; break; case TMEAS_U_SENSE: ADMUX = ADMUX & 0xF0 | ADC_MUX_U; //ADMUX_MUX3=ADMUX_2=ADMUX_1=0;ADMUX_0=1; break; case TMEAS_T_SENSE: ADMUX = ADMUX & 0xF0 | ADC_MUX_T; //ADMUX_MUX3=ADMUX_2=ADMUX_0=0;ADMUX_1=1; break; }}int ADCGetData(BYTE aver){ int adccode = 0; BYTE repeats = (1 << aver) + SKIP_SAMPLES; BYTE i = 0; fADCFlag = 0; for(i = 0; i < repeats; i++) { ADCSRA_ADSC = 1; //开始转换 while(!fADCFlag)//等待ADC中断 { ; } if(i > (SKIP_SAMPLES - 1)) { SREG_I = 0;//M8C_DisableGInt; adccode += iADCData; SREG_I = 1;//M8C_EnableGInt; } fADCFlag = 0; } adccode >>= aver; return (adccode);}#pragma vector=ADC_vect__interrupt void ADCConverted(void){ iADCData = ADC; fADCFlag = 1;}