[STM32F1] STM32F103 定时器超过1kH无法输出

[复制链接]
1157|7
 楼主| Hufei1994 发表于 2020-3-7 15:10 | 显示全部楼层 |阅读模式
1、代码是通过Cudemx配置的,频率配置为1khz时,能正常输出PWM
2、频率配置为10khz时,输出一直为高电平。TIM1 TIM2都是这样的问题
代码如下:
void MX_TIM2_Init(void)
{
  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {0};

  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 71;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 99;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 0;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
  {
    Error_Handler();
  }
  HAL_TIM_MspPostInit(&htim2);

}

时钟.png
定时器2.png
香水城 发表于 2020-3-7 17:25 | 显示全部楼层
你的pwm输出功能函数呢?

还有   sConfigOC.Pulse = 0; 如果始终这样,是不可能有PWM输出的,不管1K还是10Khz,除非别的地方有再配置。
 楼主| Hufei1994 发表于 2020-3-7 17:38 | 显示全部楼层
香水城 发表于 2020-3-7 17:25
你的pwm输出功能函数呢?

还有   sConfigOC.Pulse = 0; 如果始终这样,是不可能有PWM输出的,不管1K还是10 ...

高级定时器和普通定时器存在一样的问题,IO速度设置为高速的
功能函数如下:

  HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_4);
  __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4, 5000);
  
  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
  HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);
sky.sun.zz 发表于 2020-3-7 17:47 | 显示全部楼层
htim2.Init.Prescaler = 71;
预分频71,当然PWM频率上不去
 楼主| Hufei1994 发表于 2020-3-7 19:06 | 显示全部楼层
sky.sun.zz 发表于 2020-3-7 17:47
htim2.Init.Prescaler = 71;
预分频71,当然PWM频率上不去

72000000/(71+1)/(99+1)=10000
感觉没问题啊?
香水城 发表于 2020-3-7 19:30 | 显示全部楼层
本帖最后由 香水城 于 2020-3-7 20:08 编辑
Hufei1994 发表于 2020-3-7 17:38
高级定时器和普通定时器存在一样的问题,IO速度设置为高速的
功能函数如下:


我看你ARR又是设置为99,CCR又设置为5000,这时也不会有PWM输出的,CCR要小于ARR的值,不然看不到波形的。

 楼主| Hufei1994 发表于 2020-3-7 21:28 | 显示全部楼层
香水城 发表于 2020-3-7 19:30
我看你ARR又是设置为99,CCR又设置为5000,这时也不会有PWM输出的,CCR要小于ARR的值,不然看不到波形的 ...

还真是,比较值怎么可以比计数值小呢。我太**了
谢谢版主!!!
sky.sun.zz 发表于 2020-3-8 17:55 | 显示全部楼层
Hufei1994 发表于 2020-3-7 19:06
72000000/(71+1)/(99+1)=10000
感觉没问题啊?

一个时钟周期产生PWM上下沿,应该只有1/2频率吧?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

160

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部