ADC的初始化如果沒設置好,對於整個系統是有很大的影響的,首先就是拖慢采集速度。
再有就是沒打開通道沒有檢測。那直接看710的ADC初始化代碼來理解吧
還有一個ADC一直沒去關注的問題,就是轉換時鍾,可能這就是我們有時候采不准的問題吧。
A/D在10位模式下需要12個時鍾周期(12TAD),在12位模式下需要14個時鍾周期(14TAD)
A/D共有256個可能的TAD選項,由ADC轉換時鍾位ADCS<7:0>(ADxCON3<7:0>)指定。下面是TAD值與ADCS控制位以及器件指令周期Tcy之間的關系。
TAD = Tcy(ADCS + 1)
ADCS = TAD/Tcy - 1
為了獲得正確的A/D轉換結果,必須選擇A/D轉換時鍾,以確保75ns的最小TAD時間。ADC有一個專用內部RC時鍾源。
主要就是選擇了內部時鍾(ADRC=1),就不需要選擇ADCS位。如果選擇了指令時鍾那TAD = Tcy,詳細配置在下圖了,也沒有說明這個,就這樣認為了。
- 要用的引腳需要先設置為輸入。
- 27 AD1PCFGH=0XFFFF; //選擇AN0引腳作為模擬輸入
28 AD1PCFGL=0XFFF0; 這兩個寄存器設置需要注意,0為模擬輸入,所以你要多個采集的話就要把那幾位置零了 - AD1CSSL=0X0001; //對AN0進行掃描, 還有就是這個寄存器的設置了。對哪幾個掃描
- 其他的不用糾結,就那樣沒問題
1 /************************************************************ 2 **FileName: ADC.c 3 **Author: cm Version : V1.0 Date: 2017-4-16 4 **Chip: dsPIC33FJ256GP710 5 **Description: ADC 6 ** 工作頻率FCY=40M 7 ** 使用外部XT 應定義XT_PLL 8 **Function List: 9 ** 10 ***********************************************************/ 11 #include "ADC.h" 12 #include "Delay.h" 13 #define N 7 14 void Init_ADC() 15 { 16 _TRISB0=1; //端口引腳定義 17 _TRISB1=1; 18 _TRISB2=1; 19 _TRISB3=1; 20 _TRISA9=1; 21 _TRISA10=1; 22 AD1CON1bits.ADON=0; //禁止ADC 23 AD1CON1bits.AD12B=0; //選擇10位模式 24 AD1CON2bits.VCFG=0B011; //參考電壓選擇外部Vref+和外部Vref- 25 AD1CON3bits.ADCS=0X02; //選擇了內部時鍾后來設置轉換時間的,見上面貼的圖片 26 AD1CON3bits.ADRC=0; //1為選擇內部時鍾,0為系統時鍾 27 AD1PCFGH=0XFFFF; //選擇AN0引腳作為模擬輸入 28 AD1PCFGL=0XFFF0; 29 AD1CHS0=0X0000; //確定如何將輸入分配給采樣保持通道 30 AD1CON2bits.CHPS=0B00; //使用的通道為CH0 31 AD1CON1bits.SIMSAM=0; //按順序依次單獨采樣多個通道中每個通道 32 AD1CSSL=0X0003; //對AN0進行掃描 33 AD1CON1bits.SAMP=0; //手動采樣 34 AD1CON1bits.FORM=0B00; //緩沖區的存儲方式輸出格式為整數 35 AD1CON4=0X0004; //給每個模擬輸入分配16字的緩沖區 36 AD1CON1bits.ADON=1; //開啟ADC 37 } 38 39 unsigned int ADC(unsigned int input) 40 { 41 static unsigned int AD=0; 42 AD1CHS0=input; 43 AD1CON1bits.SAMP=1; //收到采樣 44 DelayUs(1); //延時等待 45 AD1CON1bits.SAMP=0; //開始裝換 46 while(!AD1CON1bits.DONE); 47 AD=ADC1BUF0; //取值 48 return AD; 49 } 50 51 unsigned int filter(unsigned int ANx) 52 { 53 unsigned int sum,AD_value,i; 54 for(i=0;i<20;i++) 55 { 56 sum=ADC(ANx)+sum; 57 } 58 AD_value=sum/20; 59 sum=0; 60 return AD_value; 61 } 62 63 unsigned int filter1(unsigned int ANx) 64 { 65 66 unsigned int AD_temp; 67 unsigned int value_buf[N]; 68 unsigned char count,i,j; 69 for ( count=0;count<N;count++) 70 { 71 value_buf[count]=ADC(ANx); 72 DelayMs(1); 73 } 74 for (j=0;j<N-1;j++) 75 { 76 for (i=0;i<N-j;i++) 77 { 78 if ( value_buf[i]>value_buf[i+1] ) 79 { 80 AD_temp = value_buf[i]; 81 value_buf[i]= value_buf[i+1]; 82 value_buf[i+1] = AD_temp; 83 } 84 } 85 } 86 return value_buf[(N-1)/2]; 87 } 88 unsigned int filter2(unsigned int ANx) 89 { 90 unsigned int sum,AD_value,i; 91 for(i=0;i<5;i++) 92 { 93 sum=filter1(ANx)+sum; 94 } 95 AD_value=sum/5; 96 sum=0; 97 return AD_value; 98 }