?? 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 + -