|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
請問dsp2812中使用ADC的一個問題 |
| 作者:myboss 欄目:DSP技術(shù) |
請問各位大俠,我在使用2812的ADC時出現(xiàn)了一個問題,不知怎么解決: 采用雙序列方式的SEQ2進行ADC采樣,發(fā)現(xiàn)我的程序中adc結(jié)果寄存器里的結(jié)果值根本不對,而同樣的硬件設(shè)置,如果換成雙序列的SEQ1的ADC口進行采樣結(jié)果就對了,不知道什么原因,是SEQ2不能單獨這樣用嗎?請大俠們指點,在下感激不盡. 相關(guān)程序如下: interrupt void adc_isr(void); //using ADC interrupt ONLY to execute PROCESS in maincontrol main() { SysCtrlRegs.HISPCP.all = 0x3; // HSPCLK = SYSCLKOUT/6 InitAdc(); // DSP28_Adc.c PieVectTable.ADCINT = &adc_isr; PieCtrlRegs.PIEIER1.bit.INTx6 =1; //enable // Enable CPU Interrupt 3 IER |= M_INT1; // Configure ADC //AdcRegs.ADCTRL3.bit.SMODE_SEL=0x0; //設(shè)置連續(xù)采樣方式 AdcRegs.ADCMAXCONV.all = 0x0030; // Setup 4 convs on SEQ2 AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x9; // Setup ADCINB1 as 1st SEQ1 conv AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0xA; // Setup ADCINB2 as 2nd SEQ1 conv. AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0xB; // Setup ADCINB3 as 1st SEQ1 conv. AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x8; // Setup ADCINB0 as 2nd SEQ1 conv. AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ2 = 1; // Enable EVASOC to start SEQ2 AdcRegs.ADCTRL2.bit.INT_ENA_SEQ2 = 1; // Enable SEQ1 interrupt (every EOS) //Initalize EVB Timer4 to trigger ADC interrupt EvbRegs.T4PR = 0x07A1; //Setup period register; EvbRegs.T4CNT = 0x0000; //Timer4 counter; EvbRegs.GPTCONB.bit.T4TOADC = 2; //Enable EVASOC in EVB,通用定時器周期中斷啟動ADC; EvbRegs.T4CON.all = 0x1742; //Enable timer2 compare (upcount mode); //SAMPLE rate=150MHZ/(6*0x07A1*128)=100HZ.Timer2 is used by SAMPLE base; //150/6*61A8=1000hz; accurately is 1092hz; // count frequency=150MHZ/(6*128)=195312.5HZ AdcRegs.ADCTRL1.bit.CPS=1; //設(shè)定ADC內(nèi)核時鐘預(yù)定標,對外設(shè)時鐘HSPCLK二分頻 AdcRegs.ADCTRL3.bit.ADCCLKPS=4; //set ADCCLK = HSPCLK/[8*(ADCTRL1][7]+1)]=(150/6/16)MHz } interrupt void adc_isr(void) { *RFPressure=AdcRegs.ADCRESULT8; *LFPressure=AdcRegs.ADCRESULT9; *RRPressure=AdcRegs.ADCRESULT10; *LRPressure=AdcRegs.ADCRESULT11; RFPressure++; LFPressure++; RRPressure++; LRPressure++; EvbRegs.EVBIFRB.bit.T4CINT = 1; // reset T4C INT ; AdcRegs.ADCTRL2.bit.RST_SEQ2 = 1; // Reset SEQ2; AdcRegs.ADCST.bit.INT_SEQ2_CLR = 1; // Clear INT SEQ2 bit; PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // Acknowledge interrupt to PIE; return; } |
| 2樓: | >>參與討論 |
| 作者: myboss 于 2006/7/8 11:03:00 發(fā)布:
dsp的型號是TMS320LF2812DSP,謝謝 |
|
| 3樓: | >>參與討論 |
| 作者: hotpower 于 2006/7/9 21:11:00 發(fā)布:
雖然還沒時間真正搞2812,但樓主對位域的理解好象有些問題 AdcRegs.ADCMAXCONV.all = 0x0030; // Setup 4 convs on SEQ2 AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x9; // Setup ADCINB1 as 1st SEQ1 conv AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0xA; // Setup ADCINB2 as 2nd SEQ1 conv. AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0xB; // Setup ADCINB3 as 1st SEQ1 conv. AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x8; // Setup ADCINB0 as 2nd SEQ1 conv. AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ2 = 1; // Enable EVASOC to start SEQ2 AdcRegs.ADCTRL2.bit.INT_ENA_SEQ2 = 1; // Enable SEQ1 interrupt (every EOS) xxx.xxx.all應(yīng)該選擇16位數(shù)值. 而yyy.yyy.bit.bbb應(yīng)該只能選擇0或1吧~~~ |
|
| 4樓: | >>參與討論 |
| 作者: myboss 于 2006/7/10 18:59:00 發(fā)布:
謝謝,但是好像不是這個問題 AdcRegs.ADCCHSELSEQ1的結(jié)構(gòu)是這樣定義的: struct ADCCHSELSEQ1_BITS { Uint16 CONV00:4; Uint16 CONV01:4; Uint16 CONV02:4; Uint16 CONV03:4; }; union ADCCHSELSEQ1_REG{ Uint16 all; struct ADCCHSELSEQ1_BITS bit; }; AdcRegs.ADCCHSELSEQ1.bit.CONV00-03的范圍是0x0-0xf; 而AdcRegs.ADCMAXCONV的定義是: struct ADCMAXCONV_BITS { Uint16 MAX_CONV:7; // 6:0 Max NUMBER of conversions Uint16 rsvd1:9; // 15:7 reserved }; union ADCMAXCONV_REG { Uint16 all; struct ADCMAXCONV_BITS bit; }; AdcRegs.ADCMAXCONV.all的范圍是0x0000-0x007f 還是前面的問題,請用過ADC的SEQ2的大俠指教,不勝感激! |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |