140 likes | 227 Views
AD 轉換. ADPCFG : 1: 一般數位 I/O 0: 類比輸入功能 (AD 轉換 ) ADCONX : 控制 ADC 模式 ADCHS : 選擇輸入埠轉換 ADON : 0 轉換致能關閉 1 轉換致能開啟 ADSIDL : 0 繼續運作或閒置模式 1 停止閒置模式 SIMSAM : 0: 各自順序取樣 1: 同時取樣 ASAM : - 設為 1 時,當上次 AD 轉完後成後,立即自動取樣 (SAMP 位元會自動設為 1) , - 設為 0 時,採手動取樣模式,將 SAMP 位元設定為 1 時取樣. FORM<2,0>.
E N D
ADPCFG: 1: 一般數位I/O0: 類比輸入功能(AD轉換) ADCONX : 控制ADC模式 ADCHS: 選擇輸入埠轉換 ADON:0 轉換致能關閉1轉換致能開啟 ADSIDL:0 繼續運作或閒置模式 1停止閒置模式 SIMSAM:0:各自順序取樣 1: 同時取樣 ASAM :- 設為1 時,當上次AD轉完後成後,立即自動取樣(SAMP位元會自動設為1), - 設為 0 時,採手動取樣模式,將SAMP位元設定為 1 時取樣 .
SSRC<2:0>- 啟動AD轉換的觸發信號來源選擇 111 = 自動轉換(需參考到 ADCON3 暫存器的設定) 011 = 馬達控制 PWM 間隔結束時,結束取樣ADC開始轉換 (需參考到SEVTCMP 暫存器的設定)馬達專用的dsPIC才有此功能 010 = Timer 3 計時比較完成後,結束取樣ADC開始轉換 001 = INT0 腳位電位轉態時,結束取樣ADC開始轉換 (需參考到INTCON2 <INT0EP> 位元的設定) 000 = 手動轉換, SAMP=1 時取樣,清除 SAMP 位元後轉換 SAMP:1:開始取樣,取樣結束SAMP為0,然後AD開始轉換(DONE=1or ADIF=1代表轉換完成) DONE:DONE為1代表轉換完成,啟動時將會清除為0。 VCFG<2:0> - 參考電壓源的選擇 • 000 –AVDD , AVSS • 001 – 外接 VREF+ , AVSS • 010 –AVDD ,外接 VREF- • 011 – 外接 VREF+ ,外接 VREF- • 1xx –AVDD , AVSS
CSCNA : 1:採用自動掃描方式自A組多工器輸入,B組多工器不具有掃瞄輸入功能。 ALTS: 0: 只有多工器A輸入 1: 先選多工器A在換B(輪流的方式) SMPI<3:0> - 設定 AD 要轉換幾次後才產生一次中斷 (這些轉換後的資料會被存到 ADCBUFx 的暫存器列裡) BUFM –ADCBUFx 暫存器列設定成單組或兩組模式 BUFS –ADCBUFx 採兩組模式時的狀態指示位元 當 BUFM 位元 = 0 結果存入單一組16個緩衝器裡 -ADCBUF0,1,2…E,F 每次 ADIF 中斷產生後,指標歸零指向 ADCBUF0 每次 ADIF 中斷產生後,新的轉換資料會蓋掉上一次的存在ADCBUF0 的資料 考慮中斷發生之後,軟體是否可在資料被下一輪的轉換結果覆蓋前 對這一輪的資料做處置 ! 當 BUFM 位元 = 1 結果會分組自動存入兩組的8個緩衝器裡 BUFS 位元會指出目前 AD 轉換使用那組緩衝器 BUFS = 1, AD 目前填入第二組緩衝器 ADCBUF8 -F 當使用此模式時 , 每一輪的轉換最多可在儲存 8 個資料後中斷. 雖然單次可儲存資料量變少, 但 CPU 有更多時間間隔可以利用
SAMC<4:0> : 設定自動轉換時的取樣時間 (0 TAD to 31 TAD) ADRC : =1時,使用內建RC振盪時脈;=0 時,使用系統時脈 ADCS<5:0> -AD 轉換時脈的時間 (TAD) ◎必需先設定為自動取樣與轉換模式 假設石英晶體用10MHz,並使用8 倍的倍頻電路使工作頻率為 80MHz = 12.5ns (Fosc) Tcy= (1 / Fosc) x 4 = 50ns 最小的 TAD 需大於 154ns,最小的轉換時間 =154ns * 12 = 1.85us ※因為是10-bitADC所以12是固定的,如果換成12-bitADC 就必須變為14Tad ADCS<5,0>=2*(Tad/Tcy)-1 = 2*(154/50)-1 = 5.16 ADCS<5,0>=6; Actual TAD = Tcy/2(ADCS<5:0> + 1)=175ns SAMC=01111 ADCS = 0110 A/D = 取樣時間 + 轉換時間 = 15 Tad + 12 Tad = (15 + 12) x 175uS = 4.725us
ADCHS CH0N(A or B): A 組多工器負端輸入選擇 1 = 輸入選 AN1 , 0 = 輸入選 Vref- CH0S(A or B)<3:0> : A 組多工器正端輸入選擇 1111 : 選擇 AN15為輸入端 …… 0000 : 選擇 AN0為輸入端 ADCSSL CSSL<15:0> - 輸入掃描選擇 • 1 – 啟動掃描該腳位 • 0 – 不掃描
/* ADC轉換 */ • #include <p30F4011.h> //呼叫p30F3011(IC)指令巨集 • #include <timer.h> • int s=0; • _FWDT(WDT_OFF); • void Init_Timer1( void ) • { • T1CON = 0; • IFS0bits.T1IF = 0; • IPC0bits.T1IP = 6; • IEC0bits.T1IE = 1; • T1CONbits.TCS = 0; • T1CONbits.TCKPS=1; //TCKPS<1:0>: Timer Input Clock Prescale Select bits • //11 = 1:256 prescale value • //10 = 1:64 prescale value • //01 = 1:8 prescale value • //00 = 1:1 prescale value • PR1=1250; // ((10MHz*8[選擇的8倍頻])/4[內部除頻])/8/1250=2KHz 中斷為0.5ms • T1CONbits.TON=1; • }
/* ADC 中斷 */ • void _ISR _ADCInterrupt(void) • { s=ADCBUF0 & 0x3ff; • IFS0bits.ADIF = 0 ; // 1 = Interrupt request has occurred • // 0 = Interrupt request has not occurred • } • void ADC10_Initial(void) • { • ADPCFG = 0xFFFE; // 0B 1111 1111 1111 1110 • // 1 = Analog input pin in Digital mode • // 0 = Analog input pin in Analog mode • ADCON1 = 0x00EE; // 0b 0000 0000 1110 1110 • ADCON2 = 0x0404; // 0b 0000 0100 0000 0100 • ADCON3 = 0x0f06 // 0b 0000 1111 0000 0110 • ADCSSL = 0x0001; // 0:不掃描 1:啟動掃瞄腳位 • ADCHS = 0x0000 ; IEC0bits.ADIE = 1 ; // 中斷旗標 IPC2bits.ADIP = 7 ; // Set Priority to 7 >> highest !! • ADCON1bits.ADON = 1; // turn ADC ON • }
void _ISR _T1Interrupt(void) { PORTB=s>>1; IFS0bits.T1IF = 0; } int main(void) { ADC10_Initial( ); Init_Timer1(); TRISB = 0x0001; while(1); }