請教各位....關於PIC24H ADC多通道採樣的問題
|
||||
---|---|---|---|---|
新會員
|
Dear All:
我參考了下面這份教學,試著去設定MCU的ADC Function (我使用的MCU是PIC24HJ256GP610) http://www.microchip.com.tw/modules/w ... glefile.php?cid=4&lid=229 將採樣速率設為16kHz,試著要採樣AN0,AN1兩個通道以後,再進入中斷。 但是不管我將 AD1CON2bits.SMPI 設定成任何值,它還是固定16kHz進入中斷。 code如下,能否幫忙check一下,小弟是哪邊設錯了呢? 為何不會連續讀兩個channel後再進入中斷? 另外一個問題,dsPIC的標頭檔,有ADCBUF0~ADCBUFF 16個buffer。 但是PIC24H的MCU只有ADC1BUF0這個buffer。如果我分別要sample兩個通道,那我要怎麼讀出來呢? 我試著把 PIC24H的標頭檔增加了ADCBUF0~ADCBUFF (在dsPIC同樣位址),無法正確的讀出值。 盼各位先進不吝指教,謝謝! #define ADC_AUX 0 #define ADC_MIC 1 int auxAD = 0; int micAD = 0; /*==================================================================== ADC1 initial ====================================================================*/ void initAdc1(void) { // Data Output Format: unsigned AD1CON1bits.FORM = 0; //ADC work normally in IDLE mode AD1CON1bits.ADSIDL = 0; // 自動轉換 AD1CON1bits.SSRC = 7; // ADC Sample Ctrl: Sampling begins immediately after conversion AD1CON1bits.ASAM = 1; // 10bit working AD1CON1bits.AD12B = 0; // 順序採樣 AD1CON1bits.SIMSAM = 0; // 參考電壓 AVDD,AVSS AD1CON2bits.VCFG = 0; // 自動掃描輸入 AD1CON2bits.CSCNA = 1; // 輸入只選 A 組 AD1CON2bits.ALTS = 0; // only CH0 working AD1CON2bits.CHPS = 0; // AD 要轉換2次後才產生一次中斷 AD1CON2bits.SMPI = 1; //ADCBUFx 暫存器列設定成單組模式 AD1CON2bits.BUFM = 0; // ADC Clock is derived from Systems Clock AD1CON3bits.ADRC = 0; // Auto Sample Time = 13*Tad AD1CON3bits.SAMC = 27; // ADC Conversion Clock Tad = Tcy*(ADCS+1), Tcy = 2/Fosc = 25nS, Fosc=80Mhz // = 25ns*64=1.6uS (8Mhz) {16MIPS with PLL} // ADC Conversion Time for 10-bit Tc = 12*Tad = 19.2us // Tsamp + Tconv = 27*Tad + 12*Tad = 39*1.6uS=62.4uS 16kHz AD1CON3bits.ADCS = 63; //AD1CHS: A/D Input Select Register //AD1CHS0bits.CH0SA = ADC_MIC; // MUXA +ve input selection (AN1) for CH0 AD1CHS0bits.CH0NA = 0; // MUXA -ve input selection (Vref-) for CH0 //AD1PCFGH/AD1PCFGL: Port Configuration Register AD1PCFGL = 0xFFFF; AD1PCFGH=0xFFFF; AD1PCFGLbits.PCFG1 = 0; // AN0 as Analog Input(mic_in) AD1PCFGLbits.PCFG0 = 0; // AN1 as Analog Input(aux_in) //AD1CSS Register //Enable AN0,AN1 for channel scan AD1CSSH= 0X0000; AD1CSSL= 0X0000; AD1CSSLbits.CSS1 = 1; // AN0 as Analog Input(mic_in) AD1CSSLbits.CSS0 = 1; // AN1 as Analog Input(aux_in) IFS0bits.AD1IF = 0; // Clear the A/D interrupt flag bit IEC0bits.AD1IE = 1; // Do Not Enable A/D interrupt AD1CON1bits.ADON = 1; // Turn on the A/D converter } /*==================================================================== _ADC1Interrupt(): ====================================================================*/ void __attribute__((interrupt, no_auto_psv)) _ADC1Interrupt(void) { IFS0bits.AD1IF = 0; //Clear the ADC1 Interrupt Flag auxAD = ADCBUF0; micAD = ADCBUF1; _updateAD = 1; //There are new value. }
發表於: 2008/12/26 0:07
|
|||
|