脉冲宽度调制模式允许您生成的信号的频率由TIMx_ARR寄存器的值决定,占空比由TIMx_CCRx寄存器的值决定.
在PWM模式(1或2)中,TIMx_CNT和TIMx_CCRx总是被比较,以确定是TIMx_CCRx&TIMx_CNT还是TIMx_CNT&TIMx_CCRx(取决于计数器的方向) .
下图显示了PWM边缘对齐模式(向上计数配置)

中心对准的PWM波形(ARR=8)

将系统时钟设置为216mhz。从上一章可知,定时器挂载到APB1,时钟频率为108MHz。因此,将分频设置为1080,分时钟频率为100,000Hz。如果PWM周期为20ms,计数器设置为2000-1。其他参数都是默认设置。可以使用parameterPulse在TIMx_CCRx寄存器中设置脉冲宽度。修改此参数可以改变占空比的设置。
初始的代码为:
点击(此处)折叠或打开
- /* 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);
-
- }
点击(此处)折叠或打开
- /* 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 */
点击(此处)折叠或打开
- /* 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 */