1 / 14

AD 轉換

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>.

shelley
Download Presentation

AD 轉換

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. AD轉換

  2. 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 時取樣 .

  3. FORM<2,0>

  4. 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

  5. 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 有更多時間間隔可以利用

  6. 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

  7. 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 – 不掃描

  8. /* 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; • }

  9. /* 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 • }

  10. void _ISR _T1Interrupt(void) { PORTB=s>>1; IFS0bits.T1IF = 0; } int main(void) { ADC10_Initial( ); Init_Timer1(); TRISB = 0x0001; while(1); }

  11. 請使用CH2並變更輸入端

More Related