TI TMS320F28335的ADC要如何設置,下面有一個簡單的範例幫助大家
了解,請參考下面說明。
通道。這樣可以用一個ADC取樣到16個訊號,這16個訊號源為ADCINA0
~ADCINA7與ADCINB0~ADCINB7,配合Sequencer(排序器),將這16個訊
號源排序,經過MUX開關切換,讓訊號源依序進到ADC進行轉換。
Cascaded mode(串聯模式)
在Autosequencer(自動排序),去設定CONV00~CONV15各別是對應那個
ADCINXX,等到開始進行轉換,就會從CONV00對應的ADCINXX開始
進行,依序到CONV15。
1.對ADC設定參數
在下面的程式範例初始SYSCLKOUT為150MHz,設定MODCLK2為"5",
可以得到HSPCLK=150/(2*5)=15MHZ
#再來設定ADC模組的Clock,ADC module clock = HSPCLK/ADC_CKPS,
在設定ADC_CLKPS=1,ADC clock=15MHz/(2*1) = 7.5MHz
#設定取樣維持時脈(SHCLK),ACQP_PS=SHCLK+1,設定SHCLK=15,
表示ACQ_PS=16個ADC Clock
2.寫入暫存器
#因為System clock的設定暫存器是受保護的,要修改暫存器去設定HSPCLK
前,需要加EALLOW來解除保護,更改完後,再寫EDIS來恢復保護。
HSPCLK修改=> SysCtrlRegs.HISPCP.all = ADC_MODCLK;
#寫入ADC暫存器,如前面描述的,設定ADC_SHCLK與ADC_CKPS,得到
ADC clock為7.5MHz,取樣時脈為15個ADC Clock。
AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK;
AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS
設置ADC運作模式,如下面程式範例,設定SEQ_CASC=1,將ADCINA0~
ADCINA7與ADCINB0~ADCINB7,16個訊號源串接。在這個實驗,只用
一個訊號源,所以設定SEQ1.bit.CONV00為ADCINA0,
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;
設置CONT_RUN,表示為連續模式,當Autosequence裡的訊號源都完成ADC
轉換後,Autosequence的指標就會直接回到第一筆訊號源,等待觸發,在觸
發後,從第一筆訊號源依序進行ADC轉換。但如果CONT_RUN為"0",在
Autosequence依序執行ADC轉換,指標會停在最後一筆訊號源,要設置
AD_CTRL2->RST_SEQx,才能讓Sequence序列回到第一筆。
AdcRegs.ADCTRL1.bit.CONT_RUN = 1;
#要觸發ADC轉換,如下方表格ADCTRL2->SOC_SEQ1裡所示,有SW、ePWM
、EXT3種方式。SW就如下面這個命令,由軟體直接設置ADCTRL2裡第13個bit
SOC_SEQ1, 就會依序將Sequence1內設定的訊號源進行ADC轉換。
AdcRegs.ADCTRL2.all = 0x2000;
3.讀出ADC轉換結果:
當ADC進行轉換,就要等待它轉換結束,將數值讀出來。所以會用While迴圈
,當Sequence1內的訊號完成ADC轉換,ADCST狀態暫存器裡的INT_SEQ1被設
為"1",再來將這個中斷Flag清除後,就可以將ADC轉換的資料,讀出來。在這
個例子,由於只用到CONV00, 所以只有一個ADCINA信琥源的數據,被存在
ADCRESULT0,
while (AdcRegs.ADCST.bit.INT_SEQ1== 0) {}
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;
showdata=AdcRegs.ADCRESULT0;
程式範例
void delay_loop(void);
#define ADC_MODCLK 0x5
#define ADC_CKPS 0x1
#define ADC_SHCLK 0xf
Uint16 showdata;
int main(void)
{
InitSysCtrl();
EALLOW;
SysCtrlRegs.HISPCP.all = ADC_MODCLK;
EDIS;
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
InitAdc(); // For this example, init the ADC
// Specific ADC setup for this example:
AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK;
AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; // 1
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;
AdcRegs.ADCTRL1.bit.CONT_RUN = 1;
AdcRegs.ADCTRL2.all = 0x2000;
for(;;)
{
while (AdcRegs.ADCST.bit.INT_SEQ1== 0) {} // 等待中断
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;
showdata=AdcRegs.ADCRESULT0;
delay_loop();
}
}
void delay_loop()
{
long i;
for (i = 0; i < 4500000; i++) {}
}
Reference:
1.http://www.ti.com/general/docs/litabsmultiplefilelist.tsp?literatureNumber=spru812a
=> TMS320x2833x, 2823x Analog-to-Digital Converter (ADC) Module Reference Guide (Rev. A)
沒有留言:
張貼留言