×
单片机 > 单片机程序设计 > 详情

ATMEGA16 多通道AD采集

发布时间:2020-06-19 发布时间:
|

 

 

//ADEN置位即启动ADC  ,否则ADC功能关闭。在转换过程中关闭ADC将立即中止正在进行的转换。同时ADEN清零会将ADIE(AD结束中断使能)清除。另外工作在连续模式下如果没有对ADEN清零则AD采样一直运行。

#include "main.h"

#define  HOT_MUX    4
#define  MIX_MUX    5
#define  POWER_MUX  7
#define  AD_PORT    PORTA
#define  AD_DIR     DDRA

//采集次数
#define  HOT_SAMP_CNT    4     
#define  MIX_SAMP_CNT    4       
#define  POWER_SAMP_CNT  4     

unsigned char AD_READY = 0;
volatile unsigned int buf[8];

volatile unsigned int AD_hot_result = 0;
volatile unsigned int AD_mix_result = 0;
volatile unsigned int AD_power_result = 0;

void ADC_Init(void)
{
    AD_PORT &= ~(1<  AD_DIR &=  ~(1<     ADMUX = (1<  ACSR |= 0x80;     //禁止模拟比较器
 SFIOR = 0x00;       //连续转换模式
 ADCSRA = (1< }

#pragma interrupt_handler ADC_ISR:15
void ADC_ISR(void)
{
    unsigned int temp = 0;
 static unsigned int sum = 0;
 static unsigned char cnt = 0;
 static unsigned char AD_status = 0;
 
 if (cnt == 0)                   //切换通道时第一个数据必须舍弃
 {
     cnt = 1;
  ADCSR|=(1<   return;
 } 

 temp = ADCL;
 temp |= (unsigned int)ADCH<<8;
 sum += temp;
 
 switch(AD_status)
 {
  case 0:                  

   if (++cnt > HOT_SAMP_CNT)
   {       
    AD_status++;
    ADMUX = (1<     AD_hot_result = sum / HOT_SAMP_CNT;
    cnt = 0;
    sum = 0;
   }
   break;
  case 1:                 

   if (++cnt > MIX_SAMP_CNT)
   {       
    AD_status++;
    ADMUX = (1<     AD_mix_result = sum / MIX_SAMP_CNT;
    cnt = 0;
    sum = 0;
   }
   break; 
  case 2:                 //电源电压
   if (++cnt > POWER_SAMP_CNT)
   {       
    AD_status = 1;  
    ADMUX = (1<     AD_power_result = sum / POWER_SAMP_CNT;
    cnt = 0;
    sum = 0;
    AD_READY = 1;

     ADCSR &= ~(1<     return;
   }
   break;    
 }
 ADCSR|=(1< }

unsigned int Res_Matrixing_Temper(unsigned int temp)
{
    float Rt = 0;
 float T_inv = 0;
 float temper = 0;
 
 Rt = (float)50000*temp/(1024-temp);
 T_inv = log(Rt/50000)/3950 + 1/298.15;
 temper =  (1/T_inv -273.15)*10 + 0.5; 
 
    return ((unsigned int)temper);    
}

void get_AD_result(void)
{
    unsigned int t1 = 0;
 float T_inv = 0;
 float Rt = 0;
 float temp = 0;
    if (AD_READY == 1)
 { 
  AD_READY = 0;
  
        t1 = Res_Matrixing_Temper(AD_hot_result);    
 
  buf[0] = t1/100;
  buf[1] = t1/10%10;  
  buf[2] = t1%10;
  
  t1 = Res_Matrixing_Temper(AD_mix_result); 
  buf[3] = t1/100;
  buf[4] = t1/10%10;  
  buf[5] = t1%10; 
  
 }
}

关键字:ATMEGA16  多通道  AD采集 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
8051单片机的函数发生器的设计