2019年9月3日 星期二

DSP TI TMS320F28335 最簡單ADC功能設置


TI TMS320F28335的ADC要如何設置,下面有一個簡單的範例幫助大家
了解,請參考下面說明。

 TMS320F28335有一個12 bit ADC,有兩路的S/H(取樣保持),有16個取樣
通道。這樣可以用一個ADC取樣到16個訊號,這16個訊號源為ADCINA0
~ADCINA7與ADCINB0~ADCINB7,配合Sequencer(排序器),將這16個訊
號源排序,經過MUX開關切換,讓訊號源依序進到ADC進行轉換。





























Cascaded mode(串聯模式)
在Autosequencer(自動排序),去設定CONV00~CONV15各別是對應那個
ADCINXX,等到開始進行轉換,就會從CONV00對應的ADCINXX開始
進行,依序到CONV15。



ADC設定流程
1.對ADC設定參數
#先設定HSPCLK,HSPCLK = SYSCLKOUT/2*ADC_MODCLK2
   在下面的程式範例初始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)






沒有留言: