⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 4通道ad转换程序.c

📁 学习AVR单片机的基础实验程序 适合初学者学习提高
💻 C
字号:
#define ENABLE_BIT_DEFINITIONS
#include "iom64.h"  
#include <intrinsics.h>
#define FIRST_ADC_INDEX 0
#define LAST_ADC_INDEX 3
#define Num_result 11                    //每一个AD通道的采样次数为11次     
#define ADC_VREF_TYPE 0x40         
float adc_date[LAST_ADC_INDEX-FIRST_ADC_INDEX+1];     //存放每一路AD通道的转换结果的数组
float ADresults[Num_result];              //4个AD通道转换结果暂存数组   
unsigned char AD_Final=0;              //单通道AD转换11次采样后标志   
unsigned int input_index=0;            
#define ADC0 1
#define ADC1 2
#define ADC2 3
#define ADC3 4
unsigned char times=0;
unsigned int temp1,temp2;
float voltage;
float current;
  

float ADFilte(void)                    //AD去极值数字滤波,结果处理
 {
   float Filte_result=0;
   unsigned int i,j;
   float temp;
   unsigned int count;
   for(j=0;j<Num_result-1;j++)
   {
      for(i=0;i<Num_result-j;i++)
      {
         if(ADresults[i]>ADresults[i+1])
         {
            temp=ADresults[i];
            ADresults[i]=ADresults[i+1];
            ADresults[i+1]=temp;
          }
       }  
   }    
   for(count=1;count<(Num_result-1);count++)
   {
     Filte_result+=ADresults[count];
   }
   return Filte_result/(Num_result-2);
 }

float V_I(float vol)
{
  current=4+((vol-80)/(400-80))*16;
  return current;
}

#pragma vector=ADC_vect
__interrupt void AD_process(void)
{  
  //unsigned char times=0;   
  //unsigned int temp1,temp2;
   
   temp1=ADCL;
   temp2=ADCH;
   temp2=(temp2<<8)+temp1;
  ADresults[times]=temp2;               //将结果移到数组ADresults[]     
  times++;   
  if(times==Num_result)    
  {
     voltage=ADFilte();   
     adc_date[input_index]=V_I(voltage);
     times=0;
     if (++input_index>(LAST_ADC_INDEX-FIRST_ADC_INDEX))
       input_index=0;
     ADMUX=(FIRST_ADC_INDEX|ADC_VREF_TYPE)+input_index;
     AD_Final=1;
  }
}

void main(void)
{ 
  WDTCR=(1<<WDCE)|(1<<WDE);    
  WDTCR = 0x00;
  DDRF&=~(1<<ADC0)|(1<<ADC1)|(1<<ADC2)|(1<<ADC3);              // 初始化I/O端口
  PORTF=0x00;     

  ADMUX=0x40;                         //ADC参考电源选择AVCC,AREF外部并接电容,ADC0单端输入
  ADCSRB=0x00;                        //连续自由转换
  ADCSRA=0xAF;                        //ADC允许,自动触发转换,ADC转换中断允许位,128分频,ADCclk=(16MHz/128)=125kHz
  
  asm("sei"); 
  ADCSRA|=(1<<ADSC); //开启ADC    
  
  while(1)
  {
     if(AD_Final==1)  //转换够11次
     AD_Final=0;   
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -