色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何利用DMA的觸發循環實現對eTMR的PWM周期計數呢?

冬至子 ? 來源:安德魯的設計筆記本 ? 作者:安德魯蘇 ? 2023-10-09 09:45 ? 次閱讀

引言

最近在一個支持客戶的項目中,客戶工程師向我提出了一個需求,希望能實現使用YTM32微控制器,對輸出的PWM信號,每30個周期觸發一次中斷,用于調整占空比,這樣便于動態調整向目標的控制量。來活了,開搞。

分析問題

一開始我能想到的實現方式,是使用軟件直接對產生PWM信號的eTMR模塊的Overflow中斷進行計數。但客戶工程師King提到,需要輸出的PWM信號頻率可能會比較高,頻繁進出eTMR的中斷會影響CPU運行控制算法的效率,希望能夠通過硬件機制實現。

eTMR的調試模式Modulization

此時,我最初想到的是利用eTMR輸出信號的調制模式(Modulization)。調試模式實際上是將相互調制的兩個輸出信號進行邏輯與,然后再輸出。此時,使用兩路PWM,一路作為載波信號,另一路作為包絡信號,控制載波信號,可以實現調輸出控制信號占空比的功能(直流電機控制算法中調整負載驅動能力的過程中就用到了類似的思路)

26.4.16 Modulation Implementation The eTMR0 and supports channel outputs modulated by eTMR1 channel 1 output. The eTMR3 supports channel outputs modulated by eTMR2 channel 1 output. Any of the 8 channels of eTMR0 and eTMR3 can be configured to support this modulation function. This function is enabled by configuring CIM_ETMROPT1[ETMR0_CHxOUTSEL] and CIM_ETMROPT1[ETMR3_CHxOUTSEL]. See ETMR0 Output Modulation Select and ETMR3 Output Modulation Select for details.

但King提到,當前使用的YTM32B1MD14芯片的四個eTMR都被他用掉了,沒有額外的eTMR可以專門用來產生載波信號(或者包絡信號)。同時,調制模式是對時間進行同步控制的,但客戶工程師明確提到,這個應用場景需要對周期數量進行控制,在PWM周期時間靈活變化的場景中,控制時長和控制數量是不等價的。因此,調制模式不適合解決這個問題。

FTM的多次重載事件

King還提到,他記得之前他用過的一家友商微控制器平臺上,就已經設計了這個功能。我一看,果不其然,確實有,對應著FTM模塊的寄存器字段FTM_CONF[LDFQ],如圖x所示。

FTM0->CONF = FTM_CONF_LDFQ(30);/ *Allow each 32times reload opportunity interrupt * /

image.png

圖x FTM_CONF[LDFQ]字段

通過閱讀手冊原文,我明確了思路,意識到在應用中的重點可能不是中斷,而是調整占空比。這時,我想起來YTM32的手冊里也有類似的關于Loading Frequency的設計。如圖x所示。

image.png

圖x eTMR模塊的同步載入機制

其中大意是,eTMR的一些同計數相關的寄存器,同時還設計了緩沖寄存器(或稱為“影子寄存器”),包括 CHMASK、INIT、MID、MOD、CH_VAL0和CH_VAL1。當啟用eTMR后,這些寄存器的值就被鎖定了,只有在特定的時刻才會從各自對應的影子寄存器中載入新值。

這其實也是一些能夠適配高頻率計數器的高級定時器的標配設計,為了獲取更高的計數精度,計數的時鐘源的頻率有時甚至會高于驅動定時器外設數字部分工作的系統總線時鐘頻率,此時,通過總線設置的計數器相關寄存器的值,就需要在合適時刻,由兩個時鐘域同步后,才能生效(由影子寄存器載入到實際起作用的寄存器中)。

使用這個功能的意義還在于,留給軟件一些時間,用于先后完成多個寄存器的配置,然后在同一個時間點上,讓多個參數配置同時生效。在數字系統設計中,也稱之為防止“沖突冒險”,否則,某些中間狀態可能會意外觸發系統崩潰(例如電機控制應用場景中,在某個瞬間可能同時導通H橋的上下兩個橋臂,以至于燒掉電機的線圈導線)。

如果從當前King描述的單路PWM控制信號的應用場景上看,僅對單路PWM進行控制,不需要多路PWM協同工作的情況下,實際沒啥必要啟用這個緩沖的功能,要求硬件立即載入生效即可,這也是對軟件最干凈和友好的方式。

從手冊上的描述來看,eFTM_SYNC[LDFRQ]是同FTM_CONF[LDFQ]功能最接近的,八成是他想要的。

終極大招-使用觸發鏈

然而,我又察覺到了一種潛在的需求,或許King就是想要實現通過軟件更新PWM占空比的節奏,因此提到了使用中斷的需求(實際上經過同步多次載入事件的事件確實也能產生中斷),并且提供的樣例代碼中使用了32次同步,而我們家的eTMR在這里最多僅能配置16次同步?我覺得這事可能還有下文,說不準還需要超過32次的周期,那時,僅靠eTMR或者FTM自身的設計,也不能完全搞定了。

如此,我又想出來一個終極大招。我打算對PWM信號同時對外發出的觸發信號Trigger進行計數,不過YTM32微控制器系統中沒有專門對Trigger進行計數的外設模塊(我印象中,只有老東家的LPC系列微控制器上的一個偏門的外設SCT,為了管理硬件實現的狀態機模型,可以對Trigger計數并作為狀態轉換的一個判定條件),但幸運的是,YTM32中設計了一個基于大循環和小循環的DMA控制器,其中大循環就是對DMA的觸發進行計數的,我可以利用DMA的大循環計數器來實現對eTMR的DMA觸發信號計數。并且DMA的大循環(觸發循環)也有重載機制(自動繞圈計數)和中斷,并且長度可配置31比特長度,遠遠超出32次的限制,完美符合對PWM脈沖累計計數可編程的需求。

解決問題

現在,大方向已經有了,就是要確定從eTMR的Overflow事件,到DMA的大循環,能不能走出一條通路。這就需要在手冊里搜集零星的相關的描述,把所有線索串在一起。

從實現可能性從大到小,反推整個觸發鏈:先要確認DMA控制器(DMAMUX)能夠捕獲到來自eTMR的觸發信號,然后在eTMR中確認eTMR的觸發信號能否同PWM的一次輸出周期關聯起來,最后再查閱如何配置eTMR產生對應的觸發信號。這三個環節環環相扣,如果連不上,這事可能也就搞不成了。小心翼翼。。。

確認DMAMUX中的eTMR相關觸發源

在DMA章節中,查閱關于DMAMUX的表項,它是芯片系統集成過程中列寫的,每款芯片的DMAMUX表項都不一樣,因此需要具體去查。如圖x所示。

image.png

圖x DMAMUX中關于eTMR的觸發源

看到表中的內容,我差一點淚流滿面,這真是誠意滿滿啊。這里要注意,此處DMAMUX能捕獲的觸發信號不是十分規整的,eTMR1和eTMR2包含的8個通道,每個通道是可以獨占一個DMA觸發通道的,而eTMR0和eTMR3就只能各自定時器的所有通道共享一個DMA觸發通道。在本例中,將使用eTMR0的這個共享的觸發通道進行說明。為什么選用這個通道呢?一方面是因為獨占觸發通道的用例更簡單,另一方面,是因為客戶工程師King那邊現在用的就是eTMR0的CH2,如此調下來的用例可以在他的板子上驗證。

OK,這里已經確認了,DMA是可以接收來自eTMR的觸發信號。接下來就要看eTMR是如何產生這個觸發信號了。

eTMR產生觸發信號

查閱手冊中關于eTMR的章節,在關于DMA的功能介紹中,有如下內容:

26.4.19 DMA All eTMRs support DMA, this function is enabled by setting CH_CTRL[DMAEN]=1. The DMA request is generated when STS[CHxF]=1. The DMA request is cleared by clearing STS[CHxF]. The DMA priority is higher than the interrupt.

這段內容是說,通過配置eTMR_CHn_CTRL[DMAEN]=1,就能啟用產生DMA觸發的功能,相當于是把eTMR到DMAMUX的信號通路打開了,允許eTMR發出DMA觸發信號(Request)。當eTMR通道的計數匹配事件產生后,eTMR_STS[CHxF]標志位置1,就會產生一個DMA的觸發(原本也可以產生一個中斷)。但這個標志位應該是需要被清零,才能捕獲到下次觸發。這里又說DMA的優先級高于中斷,估計大概率不會需要通過中斷服務程序清零了。一種可能的情況是,DMA捕獲到來自外設的觸發信號后,向外設回發的應答信號,可以用來作為硬件清零CHxF標志位的操作。

但進一步理解下,這里還要注意,不能直接用eTMR的計數器溢出事件觸發,而必須通過一個通道的事件觸發。因此為了產生DMA的觸發信號,還需要再啟用一個eTMR通道。這個問題不大,單從具體的應用場景看,反正是要產生PWM信號的,直接用這個輸出PWM波形的通道觸發DMA,也是可行的。有一些資深的玩家可能要提問了,那有沒有可能僅用定時器觸發DMA呢?比如要使用固定周期的DMA向UART引擎送數,向總線上發送心跳數據包。答案是,沒有。目前在YTM32B1MD微控制器的DMAMUX中,入選的定時器只有eTMR,(其他例如TMR、LPTMR、pTMR等尚未入選),而使用eTMR則不得不通過一個eTMR通道才能產生DMA觸發。但是,YTM32微控制器平臺上還涉及了另一個同觸發相關的外設TMU(Trigger Mux Module),其中收納了pTMR,也能發揮一定的聯動作用)

軟件

編寫本例的軟件工程源代碼,編譯,下載,調試,可以正常觸發DMA中斷,說明已經搭建起觸發鏈,按照預期方式工作。

但在調試過程中出現一點小插曲。我在樣例工程中設定eTMR的PWM的頻率是100Hz,指定DMA捕獲到1000次PWM的觸發信號后觸發一次中斷。如代碼所示:

void etmr_init(void)  
{  
    /* setup counter. */  
    eTMR_CounterInit_Type etmr_init;  
    etmr_init.ClkSrc = eTMR_CounterClkSrc_BusClk;  
    etmr_init.ClkFreqHz = CLOCK_FIRC_FREQ_HZ;  
    etmr_init.StepFreqHz = CLOCK_FIRC_FREQ_HZ / 100000u; /* 100khz. */  
    etmr_init.InitVal = 0u;  
    etmr_init.MidVal  = 0u;  
    etmr_init.ModVal  = 1000; /* 100 hz for timeout. */  
    etmr_init.EnableRunningOnDebug = false;  
    etmr_init.EnableGlobalCountingBase = false;  
    eTMR_InitCounter(BOARD_ETMR_PORT, &etmr_init);  
      
    /* setup channel. */  
    eTMR_ChannelOutputCompareInit_Type etmr_chn_init;  
    etmr_chn_init.EnableComplementaryMode = false;  
    etmr_chn_init.EnableDoubleSwitchMode = false;  
    etmr_chn_init.InitOutputLogic = eTMR_OutputLogic_Low;  
    etmr_chn_init.EnableDma = true; /* enable to generate request to trigger the dma. */  
    etmr_chn_init.OutputCompareEventForVal0 = eTMR_OutputCompareEvent_ToOutputLogic1;  
    etmr_chn_init.OutputCompareEventForVal1 = eTMR_OutputCompareEvent_ToOutputLogic0;  
    etmr_chn_init.Val0 = 0;  
    etmr_chn_init.Val1 = 200;  
    eTMR_InitChannelOutputCompare(BOARD_ETMR_PORT, BOARD_ETMR_CHN, &etmr_chn_init);  
  
}  
  
void etmr_dma_init(void)  
{  
    /* setup dma. */  
    dma_init(1000); /* collect pwm triggers for each period. */  
  
    /* setup etmr. */  
    etmr_init();  
      
    /* start etmr counter. */  
    eTMR_StartCounter(BOARD_ETMR_PORT);  
}

預計觸發DMA中斷的時間間隔大約在10s左右,但實際上,觸發DMA中斷的周期基本上在5s,頻率差了2倍??如圖x所示。

image.png

圖x 測量DMA的觸發時間間隔

再翻了翻手冊,總算是找到root cause了。在手冊中關于輸出比較模式的介紹中提到,每個通道配備的兩個匹配事件,都可以讓標志位CHxF置位,那也就意味著,每個PWM周期都會產生兩個觸發信號。這也就解釋了DMA中斷觸發的周期比預想中少了一半的情況。如果還想得到預定時間長度的中斷周期,就得把大循環的長度設置為雙倍!

26.4.5 Output Compare Mode When CHx_CTRL[CHMODE]=0x2, the channel x is in output compare mode. In this mode, each channel can set, clear, or toggle the output when the counter reaches the specific value defined by CH_VAL0[VAL0] and CH_VAL1[VAL1]. Configure CH_CTRL[VAL0CMP] and CH_CTRL[VAL1CMP] to select the action of the corresponding channel when the counter reaches the CH_VAL0[VAL0] and CH_VAL1[VAL1]. As shown in Figure eTMR Output Compare. The channel flag (STS[CHxF]) will be set when a compare event occurs.

總結

本例實現了一種利用DMA的大循環(觸發循環)對eTMR模塊產生PWM信號波形進行計數并產生周期中斷的功能,相對于硬件IP通過重載同步機制中設計的計數方式,本例利用對DMA觸發信號進行計數,可以實現更多數量的計數,并且具有更廣泛的普適性。

文中使用的DMA觸發計數方法,不僅僅可用于對定時器觸發信號的計數,還可用于實現對DMAMUX能夠捕獲的其他觸發信號的計數。更進一步,如果配合其他的觸發管理設備(例如Trigger Mux),形成觸發鏈,還可以進一步擴大DMA觸發計數方法的適用范圍。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 微控制器
    +關注

    關注

    48

    文章

    7542

    瀏覽量

    151316
  • 寄存器
    +關注

    關注

    31

    文章

    5336

    瀏覽量

    120230
  • 定時器
    +關注

    關注

    23

    文章

    3246

    瀏覽量

    114719
  • 串口中斷
    +關注

    關注

    0

    文章

    64

    瀏覽量

    13882
  • PWM信號
    +關注

    關注

    3

    文章

    95

    瀏覽量

    20142
收藏 人收藏

    評論

    相關推薦

    STM32 TIMER+DMA輸出PWM異常案例的問題解析

    有人使用STM32U575的TIMER加上DMAPWM輸出。具體就是利用某TIMER的一個通道的比較事件觸發DMA,通過
    的頭像 發表于 09-28 09:04 ?8104次閱讀
    STM32 TIMER+<b class='flag-5'>DMA</b>輸出<b class='flag-5'>PWM</b>異常案例的問題解析

    TC275 TOM模塊進行電機控制,如何實現一個PWM周期兩次更新占空比和周期

    實現電機控制的PWM雙更新,目前實現觸發ADC中斷,但是不知道怎么去兩次更新占空比和周期,有大佬清楚的嗎?
    發表于 02-05 06:16

    STM32L151定時器上升沿觸發ADC采樣,為什么每個PWM周期內會觸發第二次采樣?

    PWM低電平的時候,不知道為什么每個PWM周期內會觸發第二次采樣? 此外,如何確保ADC采樣到PWM正脈沖的中間時刻
    發表于 05-24 07:37

    stm32 AD采樣周期如何計算?

    , ADC_ExternalTrigInjecConv_T1_TRGO); 那么AD的采樣周期如何計算?AD轉換完成后,進入AD中斷,計算FOC,設置一次占空比,發PWM波,再觸發A
    發表于 02-25 15:43

    利用定時器產生PWM

    中斷(上升沿觸發)到之時,獲取計數器的計數值,通過這個值就知道一個脈沖的時間周期。時間周期的倒數就是外部信號的
    發表于 08-16 08:37

    如何去實現ADC定時器觸發+DMA雙緩沖的設計

    如何去實現ADC定時器觸發+DMA雙緩沖的設計
    發表于 01-25 06:21

    如何利用DMA方式去實現串口的轉發功能

    如何利用DMA方式去實現串口的轉發功能利用DMA方式實現
    發表于 01-27 07:55

    應用筆記(三)| 運用DMA 功能實現高級定時器和ADC 的同步觸發采樣

    完成后,ADC 的 6 路轉換也完成了,并且轉換結果也被傳輸到 RAM,可通過 CH1 的 傳輸完成中斷,將 DMA 的參數重新配置,就實現了多路 ADC 的循環采樣;通過 ATIM 的比較通道 4,去
    發表于 07-08 17:02

    請問如何使用定時器DMA PWM改變周期

    ;pwmData[5] = 60;pwmData[6] = 70;pwmData[7] = 80;pwmData[8] = 90;pwmData[9] = 100;HAL_TIM_PWM_Start_DMA
    發表于 12-27 07:21

    如何在使用定時器更新中斷來了解設備何時達到計數周期

    檢測到邊沿時計數器會重新啟動。我正在使用定時器更新中斷來了解何時達到計數周期。這是有效的,除了重置計數器的行為也會觸發此中斷。僅當某個引腳
    發表于 12-27 07:38

    如何使用HAL從TIM觸發DMA

    每次計時器完成其計數周期時,我都試圖讓 DMA 移動一個數據單元。DMA循環的,所以它會不斷地這樣做。我將從緩沖區移動到
    發表于 01-11 07:40

    如何利用DMA功能創建帶有高級定時器1的PWM序列?

    你好!我有 NUCLEO H743-ZI 板,我正在嘗試利用 DMA 功能創建帶有高級定時器 1 的 PWM 序列。代碼主要由 cubeMX 生成。我正在使用 PWM 模式 2,中心對
    發表于 02-03 06:40

     巧妙利用pwm原理,PWM控制LED實現呼吸燈

    實驗目標 利用STM32定時器產生PWM信號; 利用PWM信號實現呼吸燈。 什么是PWM信號
    的頭像 發表于 10-14 18:26 ?4.4w次閱讀
     巧妙<b class='flag-5'>利用</b><b class='flag-5'>pwm</b>原理,<b class='flag-5'>PWM</b>控制LED<b class='flag-5'>實現</b>呼吸燈

    在一個周期實現PWM到DC的轉換

    在一個周期實現PWM到DC的轉換
    發表于 05-18 20:05 ?1次下載
    在一個<b class='flag-5'>周期</b>內<b class='flag-5'>實現</b><b class='flag-5'>PWM</b>到DC的轉換

    運用 DMA 功能實現高級定時器和 ADC 的同步觸發采樣

    運用DMA功能實現高級定時器和ADC的同步觸發采樣在做BLDC電機控制時,需要ADC的采樣時刻和定時器產生的PWM波形相配合,才能獲取準確的采樣值,本文介紹了CW32F030系列芯片通
    發表于 06-06 13:35 ?31次下載
    主站蜘蛛池模板: 亚洲午夜精品AV无码少妇| 亚洲成年人影院| 亚洲国产精品一区二区动图 | 日日夜夜狠狠干| 亚洲成人三级| 97伦理电影在线不卡| 红尘影院在线观看| 欧美 日韩 无码 有码 在线| 欧美性xxxx18| 2022国产精品不卡a| 国产中的精品AV一区二区| 热久久综合这里只有精品电影| 午夜宅宅伦电影网中文字幕| 99re1久久热在线播放| 久久re这里视频精品15| 臀精插宫NP文| 国产亚洲AV精品无码麻豆| 涩涩网站在线看| 俄罗斯孩交精品| 免费夜色污私人影院网站| 偷拍久久国产视频免费| 东京热百度影音| 日本wwwxx| 国产免费人视频在线观看免费| 欧美视频精品一区二区三区| WWW久久只有这里有精品| 日本精品在线观看视频| 国产99久久久国产精品免费看| 色多多污污在线播放免费| 国产欧美日韩精品a在线观看高清| 亚洲精品成人无码A片在线| 国产精品久久久久久久久齐齐 | 欧美性FREE玩弄少妇| 在线观看永久免费网站| 男人插曲女人的视频| 综合人妻久久一区二区精品| 国产免费网站看v片在线| 亚洲国产精品免费观看| 久久麻豆国产国产AV| 99久久精品国产自免费| 亚洲 欧美 国产 伦 综合|