一、引言
AS32系列MCU芯片集成4個(gè)高級(jí)定時(shí)器,每個(gè)定時(shí)器包含一個(gè)32位自動(dòng)重載計(jì)數(shù)器,該計(jì)數(shù)器由可編程預(yù)分頻器驅(qū)動(dòng),支持遞增、遞減、中心計(jì)數(shù)、編碼器模式等計(jì)數(shù)方式。
高級(jí)定時(shí)器具有6個(gè)獨(dú)立通道,可實(shí)現(xiàn)測(cè)量輸入信號(hào)的脈沖寬度、可編程PWM輸出、帶死區(qū)插入的互補(bǔ)PWM等功能。
二、PWM簡(jiǎn)介
PWM,全稱(chēng)脈沖寬度調(diào)制。它是一種用數(shù)字信號(hào)來(lái)模擬模擬電壓的技術(shù)。簡(jiǎn)單來(lái)說(shuō),就是快速地在“開(kāi)”(高電平)和“關(guān)”(低電平)之間切換,通過(guò)改變一個(gè)周期內(nèi)“開(kāi)”的時(shí)間比例,來(lái)控制平均電壓。
2.1****輸出比較模式
定時(shí)器被配置為PWM模式時(shí),會(huì)用到比較寄存器。
周期: 由自動(dòng)重載寄存器決定。計(jì)數(shù)器從0計(jì)數(shù)到這個(gè)值,然后歸零,這個(gè)過(guò)程就是一個(gè)PWM周期。
占空比: 由比較寄存器決定。它設(shè)定了電平翻轉(zhuǎn)的閾值。
工作流程:
1.計(jì)數(shù)器從0開(kāi)始向上計(jì)數(shù)。
2.當(dāng)計(jì)數(shù)器的值 小于 比較寄存器的值時(shí),輸出高電平(例如)。
3.當(dāng)計(jì)數(shù)器的值 達(dá)到或超過(guò) 比較寄存器的值時(shí),輸出翻轉(zhuǎn)為低電平。
4.計(jì)數(shù)器到達(dá)自動(dòng)重載值后歸零,輸出重新變?yōu)楦唠娖?,開(kāi)始下一個(gè)周期。
通過(guò)修改比較寄存器的值,就改變了高電平在一個(gè)周期內(nèi)持續(xù)的時(shí)間,從而改變了 占空比 。
輸出比較可用于:
控制LED亮度: 占空比越大,LED越亮。
驅(qū)動(dòng)舵機(jī): 舵機(jī)的角度由PWM脈沖的寬度精確控制。
控制電機(jī)速度: 通過(guò)改變平均電壓來(lái)調(diào)節(jié)直流電機(jī)轉(zhuǎn)速。
音頻輸出: 通過(guò)極高頻率的PWM,經(jīng)過(guò)濾波后可以生成簡(jiǎn)單的音頻信號(hào)。
2.2****輸入捕獲
輸入捕獲功能就像一個(gè)“高速抓拍機(jī)”。當(dāng)外部引腳上發(fā)生一個(gè)特定事件(如上升沿)時(shí),它立刻“抓拍”下當(dāng)前計(jì)數(shù)器的值,并保存起來(lái)。通過(guò)分析兩次“抓拍”的值,我們就能計(jì)算出這個(gè)事件的時(shí)間參
定時(shí)器配置為輸入捕獲模式時(shí),會(huì)用到 捕獲寄存器 。
工作流程:
1.定時(shí)器的計(jì)數(shù)器一直在自由運(yùn)行。
2.當(dāng)輸入引腳上出現(xiàn)第一個(gè)上升沿時(shí),硬件會(huì)立即將計(jì)數(shù)器當(dāng)前的值復(fù)制到捕獲寄存器中,并產(chǎn)生一個(gè)中斷。
3.在中斷服務(wù)程序里,程序讀取這個(gè)捕獲值(記為t1),并同時(shí)將捕獲邊沿設(shè)置為 下降沿 。
4.當(dāng)引腳出現(xiàn)下降沿時(shí),硬件再次將計(jì)數(shù)器的當(dāng)前值捕獲(記為t2)。
5.程序計(jì)算 t2 - t1,這個(gè)差值就是高電平期間計(jì)數(shù)器計(jì)數(shù)的次數(shù),再乘以計(jì)數(shù)周期,就得到了高電平脈沖的精確寬度。
6.同理,可以再捕獲下一個(gè)上升沿,計(jì)算出整個(gè)信號(hào)的周期。
輸入捕獲可用于:
測(cè)量脈沖寬度和頻率: 例如解碼紅外遙控信號(hào)(NEC協(xié)議)、測(cè)量超聲波測(cè)距模塊返回的脈沖寬度。
解碼編碼器信號(hào): 讀取旋轉(zhuǎn)編碼器的位置和速度。
測(cè)量數(shù)字信號(hào)的占空比。
三、軟件設(shè)計(jì)
本文同時(shí)啟用定時(shí)器HTIM1與HTIM5的通道1與通道2。其中,兩個(gè)定時(shí)器的通道1均配置為PWM輸出模式,以生成PWM信號(hào);相應(yīng)的通道2則工作在輸入捕獲模式,并采用中斷驅(qū)動(dòng)方式,以精確測(cè)量PWM信號(hào)的頻率與占空比。最終,測(cè)量數(shù)據(jù)將通過(guò)串口打印輸出。引腳連線如下:PD4->PH9, PC9->PD5

3.1軟件分析
HTIM1初始化函數(shù): void User_TIM1_Config(uint32_t arr, uint32_t psc, uint32_t rcr);
硬件使能與準(zhǔn)備
- GPIOD_CLK_ENABLE(); // 使能GPIOD時(shí)鐘
- HTIM1_CLK_ENABLE(); // 使能HTIM1時(shí)鐘
定時(shí)器時(shí)基配置
- TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上計(jì)數(shù)
- TIM_TimeBaseInitStructure.TIM_Period = arr; // 設(shè)定周期
- TIM_TimeBaseInitStructure.TIM_Prescaler = psc; // 設(shè)定預(yù)分頻
- TIM_TimeBaseInitStructure.TIM_RepetitionCounter = rcr; // 重復(fù)計(jì)數(shù)
輸入捕獲配置(通道2)
- TIM_IC_InitStructure.TIM_Channel = TIM_Channel_2; // 使用通道2
- TIM_IC_InitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; // 上升沿捕獲
- TIM_IC_InitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; // 直接輸入
- TIM_IC_InitStructure.TIM_ICFilter = 0x0; // 無(wú)濾波器
- TIM_IC_InitStructure.TIM_ICPrescaler = 0x0; // 每個(gè)事件都捕獲
中斷與PWM輸出配置
中斷使能:
- TIM_IT_Update://定時(shí)器溢出更新中斷
- TIM_IT_CC2://通道2捕獲/比較中斷
PWM****輸出配置(通道1):
- TIM_OC_InitStructure.TIM_OCMode = TIM_OCMode_PWM1; // PWM模式1
- TIM_OC_InitStructure.TIM_Pulse = arr/2; // 初始占空比50%
- TIM_OC_InitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // 高電平有效
注:HTIM5配置除GPIO引腳外其余配置通HTIM1,此外HTIM5和HTIM1掛在不同總線下,讀者使用時(shí)需自行計(jì)算外設(shè)時(shí)鐘
在輸入捕獲模式下,當(dāng)相應(yīng)的 ICx 信號(hào)檢測(cè)到跳變沿后,將使用捕獲/比較寄存器(TIMx_CCRx)來(lái)鎖存計(jì)數(shù)器的值。簡(jiǎn)單的說(shuō)就是通過(guò)檢測(cè) TIMx_CHx 上的邊沿信號(hào),在邊沿信號(hào)發(fā)生跳變(比如上升沿/下降沿)的時(shí)候,將當(dāng)前定時(shí)器的值(TIMx_CNT)存放到對(duì)應(yīng)的通道的捕獲/比較寄存(TIMx_CCRx)里面,完成一次捕獲。

從上圖可以看出,t1-t2 時(shí)間就是需要測(cè)量的高電平時(shí)間,假如定時(shí)器工作在向上計(jì)數(shù)模式,測(cè)量方法是:首先設(shè)置定時(shí)器通道 x 為上升沿捕獲,這樣在 t1 時(shí)刻,就會(huì)捕獲到當(dāng)前的 CNT 值,然后立即清零 CNT,并設(shè)置通道 x 為下降沿捕獲,這樣到 t2 時(shí)刻,又會(huì)發(fā)生捕獲事件,得到此時(shí)的 CNT 值,記為 CCRx2。根據(jù)定時(shí)器的計(jì)數(shù)頻率,就可以算出 t1-t2 的時(shí)間,從而得到高電平脈寬。在 t1-t2 時(shí)間內(nèi)可能會(huì)出現(xiàn) N 次定時(shí)器溢出,因此還需要對(duì)定時(shí)器溢出進(jìn)行處理,防止因高電平時(shí)間過(guò)長(zhǎng)發(fā)生溢出導(dǎo)致測(cè)量數(shù)據(jù)不準(zhǔn)。CNT計(jì)數(shù)的次數(shù)等于:N*ARR+CCRx2,有了這個(gè)計(jì)數(shù)次數(shù),再乘以 CNT 的計(jì)數(shù)周期,即可得到 t2-t1 的時(shí)間長(zhǎng)度,即高電平持續(xù)時(shí)間。部分邏輯在中斷函數(shù)中實(shí)現(xiàn):
- void TIM1_IRQ_Handler()
- {
- static uint32_t TIM1_counter=0;
- /* Get the value of TIM_CNT*/
- if (TIM1_GetComplete==0)
- {
- if (TIM_GetITStatus(TIM1, TIM_IT_Update)!= RESET)
- {
- TIM1_Update_counter++;
- TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
- }
- if (TIM_GetITStatus(TIM1, TIM_IT_CC2)!= RESET)
- {
- TIM1_counter++;
- if (TIM1_counter==1)
- {
- TIM1_Update_counter=0;
- TIM1_Value1=TIM_GetCounter(TIM1);
- }
- if (TIM1_counter==2)
- {
- TIM1_Value2=TIM_GetCounter(TIM1);
- TIM1_counter=0;
- TIM1_GetComplete=1;
- }
- TIM_ClearITPendingBit(TIM1, TIM_IT_CC2);
- }
- }
- else
- {
- TIM_ClearITPendingBit(TIM1, TIM_IT_Update | TIM_IT_CC2);
- }
- }
計(jì)算并輸出PWM信號(hào)周期和頻率的函數(shù)
- /* Calculate the input frequency and period */
- TIM1_Input_Poriod=(10000*TIM1_Update_counter-TIM1_Value1+TIM1_Value2);
- TIM1_Input_Poriod = TIM1_Input_Poriod/20;
- Printf("TIM1 Input_Poriod: %d usrn", (uint32_t)TIM1_Input_Poriod);
- Printf("TIM1 Frequence: %d hzrn", (uint32_t)(1000000/TIM1_Input_Poriod));
- TIM1_Update_counter=0;
- TIM1_GetComplete=0;
- ClearCache();
其中第三行的20 為 HTIM1的時(shí)鐘頻率為20M。
四、開(kāi)發(fā)板驗(yàn)證:

審核編輯 黃宇
-
mcu
+關(guān)注
關(guān)注
147文章
18588瀏覽量
385929 -
MCU芯片
+關(guān)注
關(guān)注
3文章
258瀏覽量
12526
發(fā)布評(píng)論請(qǐng)先 登錄
AS32系列MCU芯片中CRC計(jì)算模塊的應(yīng)用介紹
FreeRTOS 在 AS32系列RISC-V 架構(gòu)MCU電機(jī)驅(qū)動(dòng)中的應(yīng)用實(shí)踐與優(yōu)化
32位MCU芯片國(guó)產(chǎn)品牌(32系列單片機(jī)常用型號(hào)有哪些)
基于 AS32X601 微控制器的定時(shí)器模塊(TIM)技術(shù)研究與應(yīng)用實(shí)踐
抗輻照MCU芯片:衛(wèi)星互聯(lián)網(wǎng)光模塊選型的關(guān)鍵考量
AS32系列MCU調(diào)試教程 SPI調(diào)試的常見(jiàn)問(wèn)題解析
AS32系列MCU芯片I2C模塊性能解析與調(diào)試
第二十二章 TIM——高級(jí)定時(shí)器
第二十一章 TIM——通用定時(shí)器
一文讀懂熱界面材料:TIM1與TIM2的奇妙世界
靈動(dòng)微電子MM32MCU的主流型芯片選型
TIM2輸入捕獲,DMA開(kāi)啟中斷傳輸輸入捕獲數(shù)據(jù),程序跑的過(guò)程中,DMA一直中斷,TIM6只觸發(fā)一次中斷,怎么解決?
無(wú)法通過(guò)DMA讀取輸入捕獲寄存器的值

AS32系列MCU芯片TIM模塊的捕獲和比較
評(píng)論