脉冲宽度调制模式允许您生成的信号的频率由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 */