📄 4通道ad转换程序.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 + -