STM32单片机—PWM波
- PWM波概述
- 定时器产生PWM配置
- CubeMX配置产生PWM波
- Hal库产生PWM实现呼吸灯程序设计
- 固件库PWM波程序配置及实现
PWM波概述
- 什么是PWM
PWM简称脉冲宽度调制,即在一个周期内存在不同极性的电平状态。 - PWM频率
是指一秒钟内从高电平时间在到低电平时间,再从低电平跳到高电平的瞬间次数,也就是一秒钟内有多少个PWM的周期。f = T / 1(HZ) - PWM输出模式
PWM模式1:
向上计数时,当CNT < CCRx 时,输出有效电平,否则为无效电平; 向下计数时,当CNT > CCRx 时输出为无效电平,否则为有效电平。
PWM模式2:
向上计数时,一当CNT < CCRx 时,输出无效电平,否则为有效电平; 在向下计数时,一旦 CNT > CCRx 时输出为有效电平,否则为无效电平。
定时器产生PWM配置
- 配置时钟(GPIO、TIM、映射等)
- 配置GPIO
- 配置定时器参数
- 配置输出PWM参数
CubeMX配置产生PWM波
-
时钟配置
- 采用外部高速晶振
- 时钟树配置
- 采用外部高速晶振
-
定时器配置
- 开启定时器
- PWM波参数设置
频率、占空比、PWM模式、有效值等参数
- 开启定时器
Hal库产生PWM实现呼吸灯程序设计
//变量定义
uint16_t pwmVal=0; //调整PWM占空比
uint8_t dir=1; //设置改变方向 1 渐亮 0 渐灭
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3); //使能 Timer4 第3通道 PWM 输出
while(1)
{
HAL_Delay(1);
if( dir == 1) //渐亮方向
pwmVal++; //逐渐提高占空比
else //渐灭方向
pwmVal--; //逐渐降低占空比
if(pwmVal > 498) //超过ARR 改变方向
dir = 0;
else if(pwmVal == 0)
dir = 1;
//修改比较值,修改占空比
__HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_3,pwmVal);
}
固件库PWM波程序配置及实现
-
使能时钟配置
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE) //初始化GPIOB时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //初始化定时器时钟
-
GPIO结构体配置
//GPIO初始化 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Speed = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Mode = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);
-
定时器结构体配置
//定时器初始化 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //不分频 TIM_TimeBaseStructure.TIM_Prescaler = psc; TIM_TimeBaseStructure.TIM_Period = arr; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit( TIM4, &TIM_TimeBaseStructure ); //初始化结构体 TIM_Cmd( TIM4, ENABLE); //使能定时器4
-
输出比较PWM结构体配置
//PWM初始化 TIM_OCInitTypeDef TIM4PWM_InitStructure; TIM4PWM_InitStructure.TIM_OCMode = TIM_OCMode_PWM1; //定时器模式1 TIM4PWM_InitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较模式输出使能 TIM4PWM_InitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //选择有效输出极性 TIM_OC3Init(TIM4, &TIM4PWM_InitStructure); //配置PWM通道 TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能预装载寄存器
-
PWM初始化Init函数
void TIM4_Init(u16 psc, u16 arr) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM4PWM_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //初始化GPIOB时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //初始化定时器时钟 //GPIO初始化 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); //定时器初始化 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //不分频 TIM_TimeBaseStructure.TIM_Prescaler = psc; TIM_TimeBaseStructure.TIM_Period = arr; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit( TIM4, &TIM_TimeBaseStructure ); //初始化结构体 TIM_ITConfig( TIM4, TIM_IT_Update, ENABLE); //使能中断 允许更新中断源 //PWM初始化 TIM4PWM_InitStructure.TIM_OCMode = TIM_OCMode_PWM1; //定时器模式1 TIM4PWM_InitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较模式输出使能 TIM4PWM_InitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //选择有效输出极性 TIM_OC3Init(TIM4, &TIM4PWM_InitStructure); //配置PWM通道 TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能预装载寄存器 TIM_Cmd( TIM4, ENABLE); //使能定时器4 }
-
主函数程序设计
//通过PWM波驱动呼吸灯 //变量定义 u8 dir = 1; //方向 1 渐亮 0 渐灭 u16 pwmVal = 0; //pwm有效值 //定时器初始化 TIM4_PWM_Init(72-1,1000-1); while(1) { delay_ms(1); if(dir == 1) pwmVal++; else pwmVal--; if(pwmVal == 999 ) dir = 0; else if(pwmVal == 0) dir = 1; TIM_SetCompare3(TIM4,pwmVal); }
-
定时器产生PWM常用库函数
结构体初始化 void TIM_OCxInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); 设置比较值的函数 void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1); 使能输入比较值预装载 void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); 使能自动重装载的预装载寄存器允许位 void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState); 配置修改极性 void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);