經(jīng)常有人想利用STM32定時(shí)器輸出一些任意波形來(lái)滿足應(yīng)用需求。比方最近有人在某論壇發(fā)帖咨詢想使用STM32芯片的TIM1實(shí)現(xiàn)如下4路特征的驅(qū)動(dòng)波形?!鞠旅娌ㄐ沃划嫵隽藘蓚€(gè)周期】

通過(guò)觀察不難看出,四路波形是有規(guī)律的周期性波形。不過(guò)除了/B路外,其它三路不太容易通過(guò)定時(shí)器PWM輸出模式來(lái)簡(jiǎn)單實(shí)現(xiàn)。
我們知道,對(duì)于STM32常規(guī)定時(shí)器,其比較輸出功能較常用的輸出模式主要是PWM輸出模式和比較輸出切換模式。其中PWM輸出模式是指定時(shí)器輸出控制單元根據(jù)計(jì)數(shù)器的值與比較寄存器的值的比較結(jié)果來(lái)決定輸出電平的高低。而比較輸出切換模式是指定時(shí)器輸出控制單元在計(jì)數(shù)器的值與比較寄存器的值匹配相等時(shí),做輸出電平的切換。即如果發(fā)生匹配之前是高電平的,發(fā)生匹配時(shí)輸出電平切換為低電平。反之亦然。
結(jié)合到本案例,對(duì)于A路、/A路及B路輸出波形我們就可以考慮使用比較輸出切換模式來(lái)實(shí)現(xiàn)。
我們這里假設(shè)定時(shí)器的計(jì)數(shù)器采用向上計(jì)數(shù)模式,每記800個(gè)時(shí)鐘單位為1個(gè)計(jì)數(shù)周期?!鞠蛏嫌?jì)數(shù)模式,ARR=800-1】
對(duì)于A路,當(dāng)CCR=200和 CCR=700時(shí)發(fā)生輸出切換,這樣周期性的修改CCR的值,從而實(shí)現(xiàn)目前所期望的輸出波形。此時(shí)我們可以使用比較事件觸發(fā)DMA,通過(guò)DMA將下次要用來(lái)做比較的數(shù)據(jù)從內(nèi)存?zhèn)鞯较鄳?yīng)通道的CCR寄存器。
同理,對(duì)于/A路,當(dāng)CCR=300和 CCR=600時(shí)發(fā)生輸出切換。同樣開(kāi)啟該通道的比較事件觸發(fā)DMA傳輸,實(shí)現(xiàn)CCR寄存器的數(shù)據(jù)循環(huán)更新。
同樣,對(duì)于B路,參照上面的相同做法。當(dāng)CCR=100和CCR=400時(shí)做輸出切換。
至于最后的/B路,可以跟上面一樣采用比較輸出切換模式。不過(guò),該通道直接使用PWM輸出模式更方便,具體到這里我們可以使用PWM2輸出模式,CCR=500.
下面是基于STM32F4系列芯片的TIM1來(lái)實(shí)現(xiàn)上述輸出波形的配置及相關(guān)用戶代碼介紹。其中,代碼是基于STM32CUBE庫(kù)。
一、基于上述分析,使用STM32CubeMx來(lái)完成基本的初始化配置。


從上面兩幅圖我們可以看出,TIM1的通道1/2/3都被配置為比較輸出切換模式。通道4被配置PWM2輸出模式?!玖硗?,注意下通道1/2/3三個(gè)比較輸出通道的初始比較值?!?/p>
前面說(shuō)了,我們要利用各通道的比較事件觸發(fā)DMA做CCR寄存器的數(shù)據(jù)更新,所以需做基于各個(gè)通道比較事件的DMA配置。見(jiàn)下圖,各通道CCR寄存器的數(shù)據(jù)更新都使用循環(huán)模式。

2、準(zhǔn)備或編寫用戶應(yīng)用代碼。
2.1 準(zhǔn)備3個(gè)數(shù)組,對(duì)應(yīng)存放用來(lái)動(dòng)態(tài)更新3個(gè)比較輸出通道CCR值的數(shù)據(jù)。數(shù)據(jù)的擬定請(qǐng)結(jié)合上面的介紹和待實(shí)現(xiàn)的波形特征。
uint16_t Data1_to_Comp[]={200,700}; //ch1
uint16_t Data2_to_Comp[]={600,300}; //ch2
uint16_t Data3_to_Comp[]={400,100}; //ch3
2.2 關(guān)閉通道1/2/3的比較寄存器的預(yù)裝功能,即修改CCR的值后立即生效,無(wú)須也不需等待更新事件。
__HAL_TIM_DISABLE_OCxPRELOAD(&htim1, TIM_CHANNEL_1);
__HAL_TIM_DISABLE_OCxPRELOAD(&htim1,TIM_CHANNEL_2);
__HAL_TIM_DISABLE_OCxPRELOAD(&htim1, TIM_CHANNEL_3);
2.3 開(kāi)啟TIM1通道1/2/3的比較輸出功能。
TIM_CCxChannelCmd(TIM1,TIM_CHANNEL_1, TIM_CCx_ENABLE);
TIM_CCxChannelCmd(TIM1,TIM_CHANNEL_2, TIM_CCx_ENABLE);
TIM_CCxChannelCmd(TIM1,TIM_CHANNEL_3, TIM_CCx_ENABLE);
2.4允許相應(yīng)通道比較事件的DMA請(qǐng)求并開(kāi)啟相應(yīng)通道的DMA傳輸功能。
hdma_tim1_ch1.State = HAL_DMA_STATE_READY;
HAL_DMA_Start_IT(&hdma_tim1_ch1,(uint32_t)Data1_to_Comp, (uint32_t)&TIM1->CCR1, 2);
__HAL_TIM_ENABLE_DMA(&htim1, TIM_DMA_CC1);
hdma_tim1_ch2.State= HAL_DMA_STATE_READY;
HAL_DMA_Start_IT(&hdma_tim1_ch2, (uint32_t)Data2_to_Comp, (uint32_t)&TIM1->CCR2,2);
__HAL_TIM_ENABLE_DMA(&htim1, TIM_DMA_CC2);
hdma_tim1_ch3.State= HAL_DMA_STATE_READY;
HAL_DMA_Start_IT(&hdma_tim1_ch3, (uint32_t)Data3_to_Comp,(uint32_t)&TIM1->CCR3, 2)
__HAL_TIM_ENABLE_DMA(&htim1, TIM_DMA_CC3);
2.5 使能TIM1通道4的PWM輸出功能并使能TIM1, 啟動(dòng)計(jì)數(shù)器計(jì)數(shù)。
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4);
三、結(jié)果驗(yàn)證。
經(jīng)過(guò)上面的準(zhǔn)備之后,編譯運(yùn)行工程代碼即可看到開(kāi)篇所期望的結(jié)果。【下面圖形是我使用MDK環(huán)境下的邏輯分析儀所得截圖,供參考】

好,到此上面案例就基本介紹完畢,全部配置及用戶代碼均貼出來(lái)了,供有需要的STM32用戶參考。
說(shuō)實(shí)話,要徹底搞明白上述過(guò)程并實(shí)現(xiàn)它,需要對(duì)STM32定時(shí)器輸出比較切換模式原理、定時(shí)器的部分寄存器的預(yù)裝特性、比較事件、DMA傳輸有較為細(xì)致和深入的理解。不像使用PWM輸出模式給個(gè)CCR的值即可輸出PWM波形那么簡(jiǎn)單。
最后補(bǔ)充兩點(diǎn),上面波形的實(shí)現(xiàn)是基于STM32的TIMER1一個(gè)定時(shí)器來(lái)完成的。如果換成別的定時(shí)器一個(gè)定時(shí)器可能實(shí)現(xiàn)不了,可能要用到2個(gè)定時(shí)器。這時(shí)往往涉及到定時(shí)器的主從同步問(wèn)題。其中的關(guān)鍵點(diǎn)就是要知道如何讓兩個(gè)定時(shí)器上下級(jí)聯(lián)并做同步啟動(dòng),實(shí)現(xiàn)上述輸出也是沒(méi)問(wèn)題的。
還有一點(diǎn),對(duì)于上述波形的實(shí)現(xiàn),如果我們使用STM32的高精度定時(shí)器實(shí)現(xiàn)起來(lái)就會(huì)更方便,STM32F334,STM32H7,STM32G4等系列都有高精度定時(shí)器。
-
單片機(jī)
+關(guān)注
關(guān)注
6074文章
45361瀏覽量
664404 -
STM32
+關(guān)注
關(guān)注
2307文章
11128瀏覽量
371426 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3361瀏覽量
121892
原文標(biāo)題:STM32定時(shí)器比較輸出切換模式之應(yīng)用實(shí)例
文章出處:【微信號(hào):stmcu832,微信公眾號(hào):茶話MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
學(xué)單片機(jī)之定時(shí)器部分
STM32單片機(jī)定時(shí)器介紹
52單片機(jī)有幾個(gè)定時(shí)器?52單片機(jī)定時(shí)器1和52單片機(jī)定時(shí)器2程序?qū)Ρ?/a>
基于stm32單片機(jī)的通用定時(shí)器配置
關(guān)于MCS_51和MSP430單片機(jī)定時(shí)器的應(yīng)用比較
51單片機(jī)的應(yīng)該如何使用定時(shí)器詳細(xì)資料和實(shí)例說(shuō)明
使用51單片機(jī)的定時(shí)器進(jìn)行計(jì)數(shù)實(shí)例的程序免費(fèi)下載
單片機(jī)定時(shí)器的工作模式TMOD設(shè)置資料說(shuō)明
使用51單片機(jī)定時(shí)器和計(jì)數(shù)器實(shí)現(xiàn)定時(shí)的實(shí)例說(shuō)明
使用單片機(jī)實(shí)現(xiàn)定時(shí)器的C語(yǔ)言實(shí)例免費(fèi)下載
STM32單片機(jī)定時(shí)器1設(shè)置成為AB項(xiàng)編碼器模式
STM32 單片機(jī)配置定時(shí)器輸出比較 + 中斷的步驟
STM32單片機(jī)一個(gè)定時(shí)器輸出不同頻率PWM波
STM32定時(shí)器的幾種輸出模式

單片機(jī) | STM32定時(shí)器比較輸出切換模式之應(yīng)用實(shí)例
評(píng)論