STM32CubeMX系列教程4:PWM
下图为PWM边沿对齐模式(递增计数配置)。图中CCRx为捕获/比较寄存器,OCxREF为输出比较信号,CCxIF为中断状态标识位。
在tim.c文件中我们找到刚才的定时器初始化函数。
/* TIM4 init function */ void MX_TIM4_Init(void) { TIM_MasterConfigTypeDef sMasterConfig; TIM_OC_InitTypeDef sConfigOC; htim4.Instance = TIM4; htim4.Init.Prescaler = 1080-1; htim4.Init.CounterMode = TIM_COUNTERMODE_UP; htim4.Init.Period = 2000-1; htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_PWM_Init(&htim4); sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig); sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1); HAL_TIM_MspPostInit(&htim4); }
刚才说到的,设置Pulse的值可以修改脉宽。这里我们在main.c文件中添加一个用户PWM设置函数,函数的参数为修改的值。
/* USER CODE BEGIN 4 */ void user_pwm_setvalue(uint16_t value) { TIM_OC_InitTypeDef sConfigOC; sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = value; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1); } /* USER CODE END 4 */
在把main()函数中添加HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1)开启定时器PWM输出。在while循环中不断修改脉宽,实现LED亮度渐变。Pulse的值最大为2000,从0开始,每100ms增加100,当增加到2000时,又逐渐递减到0。
/* USER CODE BEGIN 2 */ HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1); /* 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 = 100; if(pwm_value == 2000) step = -100; pwm_value += step; user_pwm_setvalue(pwm_value); } /* USER CODE END 3 */
在main.c函数前面声明pwm_value,step变量,user_pwm_setvalue()函数.编译程序下载。按复位后可以看到LED1亮度渐变闪烁。