基于STM32单片机PWM讲解(HAL库)
基于STM32单片机PWM讲解
一、PWM简介
PWM波形(Pulse Width Modulation,脉冲宽度调制波形)是一种占空比可变的脉冲波形。这种调制方式通过改变脉冲的宽度来控制电路中的信号强度和频率。具体来说,PWM波形中的高电平持续时间和低电平持续时间可以根据需要进行调整,从而实现对模拟信号电平的数字编码。
二、PWM原理图
输出比较可以通过**比较定时计数器的值 CNT 与设定的比较值 CCR,**可以控制输出引脚的电平状态(置高或置低),从而实现生成一定频率和占空比的 PWM 波形。
以下是PWM大致原理框图
以下是PWM大体时序图
以下是PWM重要参数:
频率 = 1/Ts
占空比 = Ton / Ts【高电平占该周期的比例】
分辨率 = 占空比变化步距【精确占空比变化】
三、PWM配置
TIM_HandleTypeDef pwm_handle = {0};//有结构体就要寻址到底
TIM_OC_InitTypeDef pwm_config = {0};
void PWM_init(uint16_t ARR,uint16_t PSC)
{pwm_handle.Instance = TIM4;//定时器选择pwm_handle.Init.Prescaler = PSC;//PSC预分频pwm_handle.Init.Period = ARR;//重载寄存数值pwm_handle.Init.CounterMode = TIM_COUNTERMODE_UP;//计数模式(向上计数)pwm_handle.Init.AutoReloadPreload = TIM_OUTPUTSTATE_DISABLE;//重载寄存器HAL_TIM_PWM_Init(&pwm_handle);pwm_config.OCMode = TIM_OCMODE_PWM1;//PWM模式向上模式pwm_config.Pulse = ARR/2; //CRR值后面要改现在无所谓pwm_config.OCPolarity = TIM_OCPOLARITY_LOW; //有效电平HAL_TIM_PWM_ConfigChannel(&pwm_handle,&pwm_config,TIM_CHANNEL_3);HAL_TIM_PWM_Start(&pwm_handle,TIM_CHANNEL_3);
}//map初始化
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)//弱函数
{if(htim->Instance == TIM4){GPIO_InitTypeDef gpio_initstruct;//设结构体//打开GPIO的时钟__HAL_RCC_GPIOB_CLK_ENABLE();__HAL_RCC_TIM4_CLK_ENABLE();gpio_initstruct.Pin = GPIO_PIN_8;//根据自己所需功能改引脚gpio_initstruct.Mode = GPIO_MODE_AF_PP;//复用推挽模式gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;//高速gpio_initstruct.Pull = GPIO_PULLUP; //上拉//调用GPIO初始函数HAL_GPIO_Init(GPIOB,&gpio_initstruct);}
}//修改ccr寄存器值
void set_pwmprogrem(uint16_t val)//修改ccr的值从而(ARR),从而改变脉冲
{__HAL_TIM_SET_COMPARE(&pwm_handle,TIM_CHANNEL_3,val);
}
附图