STM32-HAL庫08-TIM的輸出比較模式(輸出PWM的另一種方式)
一、所用材料:
STM32F103C6T6最小系統(tǒng)板
STM32CUBEMX(HAL庫軟件)
MDK5
示波器或者邏輯分析儀
二、所學(xué)內(nèi)容:
通過定時(shí)器TIM的輸出比較模式得到預(yù)定頻率與占空比的PWM波形;其中定時(shí)器輸出比較模式與PWM模式的區(qū)別在于?。?!PWM模式在同一個(gè)TIM下所有輸出口的頻率一致不能單獨(dú)控制單個(gè)的頻率,而輸出比較模式就彌補(bǔ)了這一缺點(diǎn),可以對(duì)同一個(gè)TIM下的各個(gè)輸出口分別設(shè)置頻率。
三、CUBEMX配置:
第一步:老三件套-RCC,SYS,時(shí)鐘樹配置
第二步:TIM配置
關(guān)鍵參數(shù)配置:
- Prescale-(71)
- auto reload preload-Disable
- Output Compare Channel1 -Mode - Toggle on match
- Output Compare Channel2 -Mode - Toggle on match
以及點(diǎn)亮TIM2的所有中斷
四、MDK5程序配置:
只需要在main.c中加入中斷回調(diào)函數(shù)即可,具體程序如下:文章來源:http://www.zghlxwxcb.cn/news/detail-773637.html
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "tim.h"
#include "gpio.h"
/* USER CODE BEGIN PTD */
uint16_t OC_Channel1_Pulse=125; //改變?cè)撝悼梢愿淖働WM1的頻率
uint16_t OC_Channel2_Pulse=1000; //改變?cè)撝悼梢愿淖働WM2的頻率
uint32_t F_PWM1; //PWM1的頻率設(shè)定值
uint32_t F_PWM2; //PWM2的頻率設(shè)定值
float OC_Channel1_Duty=50; //PWM1占空比設(shè)定
float OC_Channel2_Duty=50; //PWM2占空比設(shè)定
void SystemClock_Config(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM1_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_OC_Start_IT(&htim1,TIM_CHANNEL_1); //使能TIM4通道1的輸出比較中斷
TIM_CCxChannelCmd(TIM1,TIM_CHANNEL_1,TIM_CCx_ENABLE); //使能TIM4通道1
HAL_TIM_OC_Start_IT(&htim1,TIM_CHANNEL_2); //使能TIM4通道1的輸出比較中斷
TIM_CCxChannelCmd(TIM1,TIM_CHANNEL_2,TIM_CCx_ENABLE); //使能TIM4通道1
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
F_PWM1=8000;
OC_Channel1_Pulse=1000000/F_PWM1;
F_PWM2=5000;
OC_Channel2_Pulse=1000000/F_PWM2;
HAL_Delay(1);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
/* USER CODE BEGIN 4 */
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
{
uint32_t OC_Count = 0;
OC_Count = __HAL_TIM_GET_COUNTER(htim);
if(htim->Instance == TIM1)
{
if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
{
if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8))
{
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,OC_Count + OC_Channel1_Pulse - OC_Channel1_Duty*OC_Channel1_Pulse/100);
}
else
{
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,OC_Count + OC_Channel1_Duty*OC_Channel1_Pulse/100);
}
}
else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
{
if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_9))
{
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,OC_Count + OC_Channel2_Pulse - OC_Channel2_Duty*OC_Channel2_Pulse/100);
}
else
{
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,OC_Count + OC_Channel2_Duty*OC_Channel2_Pulse/100);
}
}
}
}
/* USER CODE END 4 */
本文中的代碼資源免費(fèi)提供,下載頁面如下:
https://download.csdn.net/download/qq_45854134/88495306文章來源地址http://www.zghlxwxcb.cn/news/detail-773637.html
到了這里,關(guān)于STM32-HAL庫08-TIM的輸出比較模式(輸出PWM的另一種方式)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!