AD
This presentation is the property of its rightful owner.
Sponsored Links
1 / 14

AD 轉換 PowerPoint PPT Presentation


  • 94 Views
  • Uploaded on
  • Presentation posted in: General

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

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.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Ad

AD轉換


Ad

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


Ad

FORM<2,0>


Ad

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


Ad

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


Ad

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


Ad

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


Ad

AD範例(CH0)

#include<stdio.h>//呼叫stdio(標準輸入輸出)指令巨集

#include <p30F6015.h>//呼叫p30F3011(IC)指令巨集

#include <timer.h>

int s=0,z=0,c=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;

}


Ad

void _ISR _ADCInterrupt(void)

{

s=ADCBUF9&0x3ff;

IFS0bits.ADIF = 0 ; // 1 = Interrupt request has occurred

// 0 = Interrupt request has not occurred

}

void ADC10_Initial(void)

{

ADPCFG = 0xFFFE;// 0B 1111 1111 1110 1100

// 1 = Analog input pin in Digital mode

// 0 = Analog input pin in Analog mode

ADCON1 = 0x00EE;// 0b 0000 0000 1110 1110

ADCON2 = 0x0406;// 0b 0000 0110 0000 1100

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

}


Ad

void _ISR _T1Interrupt(void)

{

PORTE=s>>2;

IFS0bits.T1IF = 0;

}

intmain(void)

{

ADC10_Initial( );

Init_Timer1();

TRISB = 0x0001;

TRISE = 0x0000;

while(1);

}


  • Login