【ADC】ADC初始化的注意事項


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,詳細配置在下圖了,也沒有說明這個,就這樣認為了。

 

  1. 要用的引腳需要先設置為輸入。
  2. 27     AD1PCFGH=0XFFFF;                        //選擇AN0引腳作為模擬輸入
    28     AD1PCFGL=0XFFF0;  這兩個寄存器設置需要注意,0為模擬輸入,所以你要多個采集的話就要把那幾位置零了
  3. AD1CSSL=0X0001;                            //對AN0進行掃描,    還有就是這個寄存器的設置了。對哪幾個掃描
  4. 其他的不用糾結,就那樣沒問題
 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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM