1,新建工程,我選的是STM32F103ZET6芯片,選擇定時器的PWM功能。
2、配置時鐘,我這里配的是內(nèi)部時鐘,有需要的可以自己改。
3、配置定時器,默認(rèn)就可以,因為代碼里面需要對配置的初始化代碼進(jìn)行修改的,而修改后才可以實現(xiàn)該功能。
4、生成代碼后,修改代碼,找到PWM初始化函數(shù),修改為如下,注意要把初始化函數(shù)前面的 static 關(guān)鍵字也去掉,而且函數(shù)聲明也要跟著修改。
void MX_TIM4_Init(uint16_t pre,uint16_t pul) //修改初始化函數(shù),改變頻率與PWM{ //占空比=Pulse/Period;頻率:f=48M/pre/per
TIM_MasterConfigTypeDef sMasterConfig; TIM_OC_InitTypeDef sConfigOC;
htim4.Instance = TIM4; htim4.Init.Prescaler =pre; //分頻(關(guān)鍵) htim4.Init.Period = 100-1;//計數(shù)周期 (關(guān)鍵,若100的計數(shù)周期對于一些頻率跟占空比誤差大的話,可以自己計算更改調(diào)試計數(shù)周期大小) htim4.Init.CounterMode = TIM_COUNTERMODE_UP; htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_PWM_Init(&htim4) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); }
sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = pul;//脈沖計數(shù)(關(guān)鍵) sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); }
HAL_TIM_MspPostInit(&htim4);
}
5、接著在自己需要的代碼里插入,PWM開始停止函數(shù)就可以啦。
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1); //PWM開啟函數(shù)MX_TIM4_Init(uint16_t pre,uint16_t pul);//改變參數(shù)就可實現(xiàn)改變占空比跟頻率的目的了HAL_TIM_PWM_Stop(&htim4, TIM_CHANNEL_1);//停止PWM
這里我說一下核心部分: 占空比=(Pulse/Period)*100%; 頻率:f = CLK/Prescaler/Period; 影響PWM占空比跟頻率的參數(shù)這主要是Pulse,Prescaler,Period;頻率跟占空比都與Period(計數(shù)周期)有關(guān),只要我們把計數(shù)周期定下來,修改Prescaler、跟Pulse這兩個值,就可以直接修改PWM的頻率跟占空比了。具體要多少的占空比跟頻率,就自己計算一下就可以了。 舉個例子說明一下:這里Period設(shè)為100,如果我要設(shè)定一個頻率為1500Hz、占空比5%的PWM波,只需要傳入?yún)?shù)Pulse=5(占空比=Pulse/Period*100%=(5/100)*100%=5%),Prescaler=320(f=系統(tǒng)頻率/分頻/計數(shù)周期=48M/320/100=1500Hz),邏輯分析儀采集結(jié)果如下圖:
補(bǔ)充一點:如果頻率要求快,而且精度要求高的,就選用晶振大的 STM32 系列,晶振大誤差就小,這里如果定好占空比的話,只調(diào)頻率可以調(diào)到很準(zhǔn)確,或者定好頻率調(diào)占空比也是一樣,如果要同時改變頻率跟占空比,頻率高了就會有誤差了,所以選用大晶振可以減小點誤差。
附一個根據(jù)我這里的晶振大小算出來的頻率占空比表(已全部用示波器調(diào)試驗證):
-
PWM
+關(guān)注
關(guān)注
116文章
5522瀏覽量
219470 -
STM32
+關(guān)注
關(guān)注
2293文章
11032瀏覽量
365130
發(fā)布評論請先 登錄
STM32開發(fā)入門進(jìn)階必備!《STM32嵌入式系統(tǒng)開發(fā)—基于STM32CubeMX和HAL庫》新書發(fā)布!

STM32CubeMX生成的FreeRTOS源碼格式如何優(yōu)化?
STM32CubeMX用于STM32配置和初始化C代碼生成
工程師開發(fā)利器:STM32CubeMX 與 eDesignSuite 的協(xié)同開發(fā)

使用stm32cubeMX無法生成mdk工程文件?
STM32CubeMX的菜單介紹

評論