搭建了基礎(chǔ)的環(huán)境,配置了一個(gè)簡(jiǎn)單的工程后,CubeMx的基本操作就會(huì)了。然后基于這個(gè)操作往下推進(jìn),開(kāi)始對(duì)關(guān)鍵模塊定時(shí)器的攻略,這個(gè)部分需要先熟悉一下Stm32的定時(shí)器基本原理。
《STM32參考手冊(cè)》中僅對(duì)定時(shí)器的介紹就已經(jīng)占了100多頁(yè),這里就不一一展開(kāi),挑一些關(guān)鍵的理解一下。
STM32一共有8個(gè)都為16位的定時(shí)器。其中TIM6、TIM7是基本定時(shí)器﹔TIM2、TIM3、TIM4、TIM5是通用定時(shí)器﹔TIM1和TIM8是高級(jí)定時(shí)器。這些定時(shí)器使STM32具有定時(shí)、信號(hào)的頻率測(cè)量、信號(hào)的PWM測(cè)量、PWM輸出、三相6步電機(jī)控制及編碼器接口等功能,都是專門(mén)為電機(jī)控制領(lǐng)域量身定做的。
先說(shuō)說(shuō)基本定時(shí)器,特點(diǎn):
- 時(shí)鐘源都是TIMxCLK,時(shí)鐘經(jīng)過(guò)PSC預(yù)分頻輸入至脈沖計(jì)數(shù)器TIMx_CNT
- 只能夠向上計(jì)數(shù),只有向上計(jì)數(shù)模式
- 工作的計(jì)數(shù)器TIMx_CNT直接由時(shí)鐘觸發(fā),當(dāng)TIMx_CNT的值等于重載寄存器TIMx_ARR中的值N時(shí),產(chǎn)生溢出事件,可觸發(fā)中斷,或DMA請(qǐng)求,CNT的值重置為0,重新開(kāi)始計(jì)數(shù)。
再看看通用定時(shí)器,特點(diǎn):
- 具備基礎(chǔ)的定時(shí)功能外,還具備輸入脈沖頻率檢測(cè),輸出PWM的功能
- 具備編碼器接口
- 溢出時(shí)觸發(fā)中斷或DMA
- 相對(duì)基本定時(shí)器具備脈沖捕獲/比較寄存器,能夠用于捕獲外部輸入的脈沖數(shù)量和脈寬
試試通用定時(shí)器的觸發(fā)中斷的功能。
第一步:選擇時(shí)鐘源,配置如下圖所示,選擇內(nèi)部時(shí)鐘。設(shè)置分頻系數(shù)與觸發(fā)中斷計(jì)數(shù)器,在下圖的PSC和Counter Period設(shè)置。
第二步:撰寫(xiě)打開(kāi)定時(shí)器中斷的代碼,?生成代碼后,需要一個(gè)關(guān)鍵步驟,就是在用戶代碼編輯區(qū)域,打開(kāi)定時(shí)器TIM3的使能。如下圖所示,可以看到User code begin2 的字樣,這里就是經(jīng)過(guò)CubeMx生成代碼之后,用戶編程序的地方。
HAL_TIM_Base_Start_IT(&htim3);
?然后在中斷程序中輸入我們需要執(zhí)行的操作,中斷程序在哪里呢?
?第三步:增加執(zhí)行函數(shù)。在下圖函數(shù)的這個(gè)里面,因?yàn)镃ubeMX在配置了中斷之后,就會(huì)自動(dòng)生成專門(mén)的中斷.c文件,這里TIM3_IRQHandler就是TIM3的中斷執(zhí)行函數(shù),在其中加入我們個(gè)人需要執(zhí)行的代碼。
?然后電機(jī)debug運(yùn)行,得到如下結(jié)果,累加時(shí)間與分頻時(shí)間相同。
再試試中斷生成一路PWM的功能
第一步:配置GPIO
第二步:配置初始電平。如下圖配置PA4的輸出為輸出模式, 并且設(shè)置初始輸出電平為高電平。
?第三步:配置中斷執(zhí)行函數(shù),執(zhí)行輸出電平的翻轉(zhuǎn),生成占空比為50%的PWM。
void TIM3_IRQHandler(void)
{
/* USER CODE BEGIN TIM3_IRQn 0 */
g_main_count ++;
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_4);
/* USER CODE END TIM3_IRQn 0 */
HAL_TIM_IRQHandler(&htim3);
/* USER CODE BEGIN TIM3_IRQn 1 */
/* USER CODE END TIM3_IRQn 1 */
}
輸出結(jié)果,輸出周期為42ms。由于此時(shí)我的定時(shí)器時(shí)鐘為18M,分頻系數(shù)為18,counter period為20000,經(jīng)過(guò)18分頻后,定時(shí)器時(shí)鐘為1M,電平反轉(zhuǎn)周期等于 20000/1000000 = 1/50 = 0.02s,約為20ms,單個(gè)電平持續(xù)時(shí)間為20ms,兩個(gè)電平則為40ms左右,因此基本符合。這里也有個(gè)問(wèn)題就是為什么不是精確的20ms,而是21ms。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-460104.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-460104.html
到了這里,關(guān)于搭建stm32電機(jī)控制代碼框架(二)——Stm32CubeMx配置定時(shí)器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!