ST意法半导体
直播中

廉鼎琮

9年用户 1031经验值
私信 关注
[问答]

如何消除PWM 100%占空比中的小故障呢?

要控制直流电机驱动器,我需要将一个引脚设置为永久高电平,另一个引脚设置为反向 PWM。
如果我想反转电机方向,我需要交换这些设置。
所以我将两个引脚都配置为 PWM 输出。
但是如果我想将一个输出引脚设置为高电平,则忽略以下代码:
  • HAL_GPIO_WritePin(GPIOA, MOTOR_IN1_Pin, GPIO_PIN_SET);
该引脚保持低电平,可能是因为该引脚正式未处于 GPIO 模式?
所以我认为可以设置 100% 占空比具有相同的效果,但是当我在示波器上测量时,您会看到零伏的小毛刺。
所以我的问题可以通过两种方式解决:
如何让我的 PWM 输出引脚也接受 WritePin 命令?
或者
如何消除 100% 占空比中的小故障?

回帖(1)

高敏兰

2023-1-17 11:00:44
> 所以我认为可以设置 100% 的占空比具有相同的效果
它应该可以正常工作。假设 TIM1 以 1 kHz 频率向上计数(预分频器 7999 在 8 MHz 时钟下)并且您需要 100 毫秒的周期。因此,您将计数器周期设置为 99。PWM 脉冲设置为 0 时,您将获得 0% PWM,而 PWM 脉冲设置为 100 时,您将获得 100% PWM。
无论如何,您可以在 PWM 和 GPIO 之间切换引脚的模式。使用 HAL 这会产生一些开销,因为 GPIO init(对于另一个引脚)是


  • /*Configure GPIO pin Output Level */
  •   HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);

  •   /*Configure GPIO pin : LED_Pin */
  •   GPIO_InitStruct.Pin = LED_Pin;
  •   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  •   GPIO_InitStruct.Pull = GPIO_NOPULL;
  •   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  •   HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct);

而 PWM 输出模式初始化是(HAL_TIM_MspPostInit 中的代码):


  • GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
  •     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  •     GPIO_InitStruct.Pull = GPIO_NOPULL;
  •     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  •     GPIO_InitStruct.Alternate = GPIO_AF2_TIM1;
  •     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

唯一的区别是可以在寄存器级别(GPIOx->MODER)轻松切换的.Mode。
如果已经在寄存器级别:一旦您运行 PM 模式,每个通道都有一个强制输出模式,方法是将 TIMx_CCMRx 寄存器中的 OCxM 位设置为 100 rsp。101. 参见参考手册。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分