前言
PWM理论相关,点下方链接
Cube配置
打开STM32CubeMX新建工程,选择STMF103ZET6芯片,选择外部高速晶振(HSE)。根据数据手册,LED3管脚PB5配置为定时器3的通道2输出。同时TIM3的通道2配置为PWM
配置系统时钟为72MHz。由上一例可知,定时挂载到APB1,时钟频率为72MHz。此处设置为7200-1分频。经过分频后的时钟频率为10000Hz,若要设置PWM周期为20ms,则计数器的值为200-1。
其他参数为默认不用修改。其中Pulse的为设置脉宽,即为捕获/比较寄存器(TIMx_CCRx)。通过修改它的值可以修改占空比。
生成报告,以及生成代码,编译程序。添加应用程序
调整PWM脉宽有两种方式,一种是调用TIM3->CCR2 = pwm_value;修改脉宽,另一种通过__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,pwm_value);修改脉宽
不建议通过每调用一次PWM就对PWM进行一次初始化初始化来修改脉宽,量过波形就发现不对,在高电平的地方由有很多半波组成。
例
void user_pwm_setvalue(uint16_t value)
{
TIM_OC_InitTypeDef sConfigOC = {0};
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = value;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);
}
调用函数进行调整
在把main()函数中添加HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2)开启定时器PWM输出。在while循环中不断修改脉宽,实现LED亮度渐变。Pulse的值最大为200,从0开始,每100ms增加10,当增加到200时,又逐渐递减到0。
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_Delay(100);
if(pwm_value == 0) step = 10;
if(pwm_value == 200) step = -10;
pwm_value += step;
TIM3->CCR2 = pwm_value;
//__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,pwm_value);
}
在main.c函数前面声明pwm_value,step变量.编译程序下载。按复位后可以看到LED1亮度渐变闪烁。