https://www.waveshare.com/wiki/STM32CubeMX_Tutorial_Series:_PWM 

脉冲宽度调制模式允许您生成的信号的频率由TIMx_ARR寄存器的值决定,占空比由TIMx_CCRx寄存器的值决定.

在PWM模式(1或2)中,TIMx_CNT和TIMx_CCRx总是被比较,以确定是TIMx_CCRx&TIMx_CNT还是TIMx_CNT&TIMx_CCRx(取决于计数器的方向)

下图显示了PWM边缘对齐模式(向上计数配置) STM32 PWM 官方翻译.-LMLPHPCCRx是捕获/比较寄存器,OCxREF是输出比较sigal, CCxIF是中断标志。当TIMx_CCRx中的值低于计数器时,则输出处于高级别,或者处于低级别。


中心对准的PWM波形(ARR=8)
STM32 PWM 官方翻译.-LMLPHP
将系统时钟设置为216mhz。从上一章可知,定时器挂载到APB1,时钟频率为108MHz。因此,将分频设置为1080,分时钟频率为100,000Hz。如果PWM周期为20ms,计数器设置为2000-1。其他参数都是默认设置。可以使用parameterPulse在TIMx_CCRx寄存器中设置脉冲宽度。修改此参数可以改变占空比的设置。
STM32 PWM 官方翻译.-LMLPHP

初始的代码为: 

点击(此处)折叠或打开

  1. /* TIM4 init function */
  2. void MX_TIM4_Init(void)
  3. {
  4.   TIM_MasterConfigTypeDef sMasterConfig;
  5.   TIM_OC_InitTypeDef sConfigOC;
  6.   
  7.   htim4.Instance = TIM4;
  8.   htim4.Init.Prescaler = 1080-1;
  9.   htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
  10.   htim4.Init.Period = 2000-1;
  11.   htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  12.   HAL_TIM_PWM_Init(&htim4);
  13.   
  14.   sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  15.   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  16.   HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig);
  17.   
  18.   sConfigOC.OCMode = TIM_OCMODE_PWM1;
  19.   sConfigOC.Pulse = 0;
  20.   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  21.   sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  22.   HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1);
  23.   
  24.   HAL_TIM_MspPostInit(&htim4);
  25.   
  26. }
通过设置parameterPulse的值,可以修改脉冲宽度设置。在这里,我们在main.c文件中增加了一个用户PWM设置函数,该函数的参数需要修改。

点击(此处)折叠或打开

  1. /* USER CODE BEGIN 4 */
  2. void user_pwm_setvalue(uint16_t value)
  3. {
  4.     TIM_OC_InitTypeDef sConfigOC;
  5.   
  6.     sConfigOC.OCMode = TIM_OCMODE_PWM1;
  7.     sConfigOC.Pulse = value;
  8.     sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  9.     sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  10.     HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1);
  11.     HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1);
  12. }
  13. /* USER CODE END 4 */
在main()例程中,添加HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1)来启用计时器PWM输出。在while循环中,参数脉冲宽度会不断变化,使LED的亮度逐渐变化。参数脉冲的最大值为2000。从0开始,每100 ms增加100,当达到2000时,脉搏值逐渐减小到0。

点击(此处)折叠或打开

  1. /* USER CODE BEGIN 2 */
  2.   HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1);
  3. /* USER CODE END 2 */
  4.  
  5. /* Infinite loop */
  6. /* USER CODE BEGIN WHILE */
  7. while (1)
  8. {
  9. /* USER CODE END WHILE */
  10.  
  11. /* USER CODE BEGIN 3 */
  12.   HAL_Delay(100);
  13.   if(pwm_value == 0) step = 100;
  14.   if(pwm_value == 2000) step = -100;
  15.   pwm_value += step;
  16.   user_pwm_setvalue(pwm_value);
  17. }
  18. /* USER CODE END 3 */



10-26 02:45
查看更多