SemiDrive E3 MCAL 配置 :PWM 硬體觸發 ADC 採樣

一、前言

在使用 ADC 進行採樣時,ADC 的硬體觸發採樣是 ADC 的典型應用。

本文將介紹 SemiDrive E3 MCAL 配置 :PWM 硬體觸發 ADC 採樣。

硬體平台:芯馳 E3640 Gateway 開發板

軟體平台:SemiDrive_E3_MCAL_V3.0

二、EB 配置  

2.1 ADC 配置

ADC 的 Hardware 觸發對應的是 ADC 中 Group 的觸發方式,所以首先對需要作為 HW(下文中 Hardware 以 HW 為簡稱)觸發方式的 Group 進行配置。

將 AdcGroupTriggSrc 設置為 ADC_TRIGG_SRC_HW(註:每個 ADC Unit 可以至多設置 4 個 Group,作為 HW 觸發的 Group 必須配置在當前 Unit 中的第 0 個 Group,

並且每個 Unit 下至多只能配置 1 個 HW 觸發的 Group)

Group 的轉換模式在 HW 觸發下,一定要設置為 OneShot 模式。

在 MCAL3.0 及之後的 MCAL 軟體版本中,HW 觸發的 group 的 AccessMode 如果設置為 ADC_ACCESS_MODE_SINGLE,此時 StreamingBufferMode 的設置並不影響

調用流程如下所述:

1. Adc_EnableHardwareTrigger(),將 Group 的 Status 轉換為 ADC_BUSY;

2. 等待該 Group的Status 至 ADC_STREAM_COMPLETED;

3. Adc_ReadGroup();該步會獲取採樣值,並且自動開啟新一輪轉換,並將 Group 的 Status 轉換為ADC_BUSY;

如果接下來需要重複:轉換->讀值->轉換->讀值,那麼只要確保 Group 的 Status 至 ADC_STREAM_COMPLETED 後調用 Adc_ReadGroup 就可以。

一般來說,觸發信號會源源不斷的以一定頻率產生,而 ADC 的轉換和讀值會不斷重複進行,如果在此情況下使用 HW 觸發的 Group,推薦配置方式如下:

1. AdcGroupConversionMode->ADC_CONV_MODE_ONESHOT

2. AdcGroupAccessMode->ADC_ACCESS_MODE_SINGLE;

需要注意

2.2 PORT 配置

ADC 引腳配置

UART 引腳配置

2.3 PWM 配置

此處採用  etimer1 進行硬體觸發 ADC,具體  PWM 模塊介紹請參照《SemiDrive_E3_MCAL_User_Guide_Rev03.00》 PWM 章節。



2.4 Xtrg 配置

TmuxIndir

Xtrg 下,可用於觸發 ADC 的 mux 存在 2 種:

  • TmuxDir
  • TmuxIndir

使用 TmuxIndir 的方式觸發 ADC 是推薦使用的方法,此方式可滿足使用需求,TmuxDir 觸發就不再贅述。

1. TmuxIndrtInstanceId:有 TmuxIndrtInstanceId0~TmuxIndrtInstanceId7 八個 mux 控制器,只是 id 值。


2. TriggerSigSel:選擇觸發源。

3. TidPool0Config 與 TidPool1Config TmuxDir 的觸發關係,由 PWM/ETIMER 中的 EID 決定;而 TmuxIndir 中的觸發關係,由 xtrg 自己產生的 tid 決定。

此處介紹一下 EID 

  1. EID 為 8 位二進制數,範圍在 0~255之 間;
  2. EID 分成兩部分,高三位和低五位:xxx | xxxxx;
  1. 高三位(取值範圍為 000~111,即 0 到 7),對應前文所述的 TargetLut_x(x 即為此處高三位的值)

      例:如 EID = 001 | xxxxx,那麼此時 TmuxDrt 中的 TargetLut_1 就會生效;如 EID = 011 | xxxxx,那麼此時 TmuxDrt 中的 TargetLut_3 就會生效,以此類推;

  1. 低五位(取值範圍為 00000~11111,即 0~31;但實際使用時,範圍為 00000~01111,即0~15),此處的值對應即將觸發 ADC 的第 x 個 Channel;

      例:如 EID = xxx | 00011,那麼此時即將觸發 ADC 中 LogicalId 為 3 的 channel;

綜上所述,EID 決定了 Xtrg 的 TmuxDir 中哪一個 TargetLut_x 生效,並且決定了即將觸發的 ADC 的通道序號。

而具體是哪個 ADC Unit,就由生效的 TargetLut_x 決定,如下所述:

  • TargetLut_x = 0000 0001->對應觸發 ADC1
  • TargetLut_x = 0000 0010->對應觸發 ADC2
  • TargetLut_x = 0000 0100->對應觸發 ADC3
  • TargetLut_x = 0000 0101->對應同時觸發 ADC1、ADC3,具體優先級由 Xtrg決定,不建議如此使用。

      結合上文所敘述內容,具體 TmuxDrt 和 EID 結合使用例子如下:EID = 010 00011,此時 Xtrg 中 TmuxDir 的 TargetLut_2生效,並假設此時 TargetLut_2 = 1,此時 TriggerSigSel = EPWM1_CMP0

  • TargetLut_0 = 1
  • TargetLut_1 = 1
  • TargetLut_2 = 1
  • TargetLut_3 = 1
  • TargetLut_4 = 1
  • TargetLut_5 = 1
  • TargetLut_6 = 1
  • TargetLut_7 = 1

     並且此時EID = 010 | 00011,那麼此時通過 EPWM1_CMP0 經過 Xtrg 的 TmuxDir 時,會查找 TargetLut_2  配置的內容(EID 高三位為 2),發現:TargetLut_2 = 1,所以此時將觸發 ADC1,而 EID 低 5 位為 00011(數值 3),所以將觸

發 ADC1 中,硬體觸發的 Group 中 LogicalId 為 3 的channel,我們再回到 TmuxIndir ,TmuxIndir 中 tid 由內部的 tid pool 產生,而具體配置的值就由 TidPool0Config 和 TidPool1Config 確定。

     TidPool0Config 和 TidPool1Config 實際為兩個 32 位的寄存器,所以每個選項取值範圍是:000...000(32 位)~111...111(32 位),即 0~4294967295;每個 TidPoolConfig 分割為 4 個部分,每個部分 8 位,而這 8 位的功能就替代了

上文所敘述的 EID:例如 TidPool0Config 為  011 00001 010 00001 001 00001 000 00000,實際上代表了 4 個 TID 值(此處 TID 和上文的 EID 對應),每個 8 位也是由高 3 位和低 5 位組成,功能和前文所述的 EID 一致。

4. TermValConfig和TermTidConfig

     將兩個配置項進行合併敘述,現在已知 TidPool0Config 和 TidPool1Config 產生了確定觸發關係的 TID,那麼如何確定當前選擇哪個具體的 TID 就由 TermValConfig 或者 TermTidConfig 決定。

首先,TidPool0Config 和 TidPool1Config 中取 TID 的方式是在 tidpool 中,存在一個不斷循環的指針,當這個指針指向哪個 TID,就會選擇當前的 TID 值,這個指針的輪詢速度不能控制,具體工作方式如下:

TIDpool 中指針從 TID0 開始輪詢。

TermValConfig:取值範圍是 0~7,已知 TidPool0Config 為 4 個TID,TidPool1Config 為 4 個 TID,而 TermValConfig 決定了從第 0 個 TID 輪詢到第幾個 TID 結束,具體含義:

例如:

TermValConfig = 4

此時 tidpool 中的指針會從 TidPool0Config 中的 TID0 直至 TidPool1Config 的 TID4 結束並開始重複;

而 TermTidConfig 是一個 8 位配置項,取值範圍為 0~255,它也可以用來決定 Tidpool 指針到哪個 TID 結束輪詢並開始下一輪循環。

例如:

TermTidConfig = 255

在 TID0~TID7 中,其中一個 TID 的取值為 11111111(255),那麼就會到達終點開始下一輪。

TermValConfig 和 TermTidConfig 是共同生效的,但是建議使用 TermValConfig,這樣比較直觀,TermTidConfig 可以配一個無法匹配的值,比如 11111111。

TargetLut:用於確定觸發具體哪個ADC Unit。

配置完上述內容後,代入 sdrv_xtrg_tmux0_drt_config 接口

sdrv_xtrg_tmux0_indrt_config(&xtrg_dev, &TmuxIndrtConfig_0);

此類配置可以滿足某個 ADC Unit 下,一個 Hw Group 可以至多配置 8 個 channel。

三、 函數部分

3.1 中斷函數



3.2 主函數

四、總結

     將 ADC 觸發模式設置為硬體觸發,通過 PWM 設置觸發頻率,通過 XTRG 模塊鏈接到 ADC 上,此 Demo 通過延時 100us,列印 ADC 的觸發次數來驗證 ADC 可以在 100us 被多次觸發,且頻率可調。

五、 參考文檔

   《SemiDrive_E3_MCAL_User_Guide_Rev03.00》

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論