首页 > 代码库 > ADC取样

ADC取样

#include<ioavr.h>#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 = http://www.mamicode.com/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;}

 

ADC取样