STM32F0使用LL库实现PWM输出
在本次項(xiàng)目中,限于空間要求我們選用了STM32F030F4作為控制芯片。這款MCU不但封裝緊湊,而且自帶的Flash空間也非常有限,所以我們選擇了LL庫實(shí)現(xiàn)。本文我們將說明如何通過LL庫實(shí)現(xiàn)PWM信號(hào)的輸出。
1、概述
我們知道STM32的TIM計(jì)時(shí)器可以輸出PWM信號(hào),這測(cè)我們也采用STM32F030F4中的TIM3通用計(jì)時(shí)器來實(shí)現(xiàn)我們想要的功能。TIM3通用計(jì)時(shí)器由一個(gè)16位的自動(dòng)重新加載計(jì)數(shù)器組成,由一個(gè)可編程的預(yù)定標(biāo)器驅(qū)動(dòng)。其結(jié)構(gòu)如下圖所示:
它可以用于各種目的,包括測(cè)量輸入信號(hào)的脈沖長度(輸入捕獲)或生成輸出波形(輸出比較和PWM)。使用定時(shí)器預(yù)標(biāo)量和RCC時(shí)鐘控制器預(yù)標(biāo)量,輸出的PWM脈沖長度和波形周期可以調(diào)整從幾微秒到幾毫秒。我們這里實(shí)現(xiàn)一個(gè)占空比0%到100%可調(diào),頻率為200Hz的PWM波形。
2、TIM配置
我們?cè)谑褂肨IM3輸出PWM波,我們必須對(duì)其進(jìn)行相應(yīng)的配置。關(guān)于TIM3的配置我們需要關(guān)注:TIM3控制寄存器1 (TIM3_CR1)、TIM3預(yù)置寄存器(TIM3_PSC)、TIM3自動(dòng)重載寄存器(TIM3_ARR)以及對(duì)應(yīng)通道的捕獲比較寄存器。
首先來看一看TIM3控制寄存器1 (TIM3_CR1),這個(gè)寄存器用于配置TIM計(jì)時(shí)器。其結(jié)構(gòu)如下:
對(duì)于TIM3控制寄存器1 (TIM3_CR1)我們主要需要說一下計(jì)數(shù)器使能(CEN)位。而其它的位通過初始化函數(shù)設(shè)置就可以了。
TIM3預(yù)置寄存器(TIM3_PSC)用以配置TIM計(jì)數(shù)器的工作頻率,這個(gè)工作頻率的計(jì)算是:psc的工作頻率/(psc的值+1)。其結(jié)構(gòu)如下:
TIM3自動(dòng)重載寄存器(TIM3_ARR)用以配置輸出PWM波的頻率或者說周期。因?yàn)檫@個(gè)值就是計(jì)數(shù)器的計(jì)數(shù)周期。其結(jié)構(gòu)如下:
我們?cè)O(shè)置了技術(shù)器的時(shí)鐘頻率,計(jì)數(shù)的周期,要想得到PWM波,我們還需要告訴TIM一個(gè)占空比。關(guān)于占空比實(shí)際上是在捕獲比較寄存器中設(shè)置的。
3、PWM實(shí)現(xiàn)
我們已經(jīng)如何通過配置TIM得到PWM波形輸出,我們接下來就是通過軟件來實(shí)現(xiàn)我們的想法。其配置代碼如下:
/* TIM3 初始化配置 */ static void TIM3_Init_Configuration(void) {LL_TIM_InitTypeDef TIM_InitStruct = {0};LL_TIM_OC_InitTypeDef TIM_OC_InitStruct = {0};LL_GPIO_InitTypeDef GPIO_InitStruct = {0};/* TIM3時(shí)鐘使能 */LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM3);/* TIM3初始化配置 */TIM_InitStruct.Prescaler = 47;TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP;TIM_InitStruct.Autoreload = TIMPERIOD;TIM_InitStruct.ClockDivision = LL_TIM_CLOCKDIVISION_DIV1;LL_TIM_Init(TIM3, &TIM_InitStruct);LL_TIM_DisableARRPreload(TIM3);LL_TIM_OC_EnablePreload(TIM3, LL_TIM_CHANNEL_CH4);TIM_OC_InitStruct.OCMode = LL_TIM_OCMODE_PWM1;TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_DISABLE;TIM_OC_InitStruct.OCNState = LL_TIM_OCSTATE_DISABLE;TIM_OC_InitStruct.CompareValue = 0;TIM_OC_InitStruct.OCPolarity = LL_TIM_OCPOLARITY_HIGH;LL_TIM_OC_Init(TIM3, LL_TIM_CHANNEL_CH4, &TIM_OC_InitStruct);LL_TIM_OC_DisableFast(TIM3, LL_TIM_CHANNEL_CH4);LL_TIM_SetTriggerOutput(TIM3, LL_TIM_TRGO_RESET);LL_TIM_DisableMasterSlaveMode(TIM3);/* TIM使用GPIO時(shí)鐘使能 */LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOB);/* TIM3 GPIO配置:PB1 ??------> TIM3_CH4 */GPIO_InitStruct.Pin = LL_GPIO_PIN_1;GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;GPIO_InitStruct.Alternate = LL_GPIO_AF_1;LL_GPIO_Init(GPIOB, &GPIO_InitStruct);LL_TIM_CC_EnableChannel(TIM3,LL_TIM_CHANNEL_CH4);LL_TIM_EnableCounter(TIM3); }在這段配置代碼中,有幾個(gè)值需要說一下。Prescaler 值我們?cè)O(shè)為47,所以在48MHz的系統(tǒng)時(shí)鐘下,TIM計(jì)數(shù)器的工作頻率就是1MHz。Autoreload 的值我們?cè)O(shè)為了5000,所以可以得到PWM的頻率為200Hz。CompareValue值設(shè)為了0,所以我們只能得到占空比為0%的PWM。若我們想要得到占空比為50%的PWM,則CompareValue值應(yīng)設(shè)為2500才行。配置完成后各寄存器的值如下圖所示:
這要得到的只是固定占空比的PWM波,若想動(dòng)態(tài)修改占空比則需要修改捕獲比較寄存器的值。使用函數(shù)LL_TIM_OC_SetCompareCH4(TIM3,pulse)就可以了,其中pulse是處于0到Autoreload 的值的整數(shù)。
4、總結(jié)
我們通過上述操作,就實(shí)現(xiàn)了基于LL庫的PWM波的輸出。我們將代碼下載到目標(biāo)板,并修改占空比和監(jiān)視器波形輸出。
上圖是占空比為50%的波形圖。
上圖是占空比為20%的波形圖。
上圖是占空比為80%的波形圖。
歡迎關(guān)注:
總結(jié)
以上是生活随笔為你收集整理的STM32F0使用LL库实现PWM输出的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 报错 Specified k
- 下一篇: PID控制器开发笔记之五:变积分PID控