打印
[STM32F1]

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

[复制链接]
897|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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);

}

定时器2.png (59.07 KB )

定时器2.png

时钟.png (299 KB )

时钟.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频率上不去

使用特权

评论回复
5
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
感觉没问题啊?

使用特权

评论回复
6
香水城| | 2020-3-7 19:30 | 只看该作者
本帖最后由 香水城 于 2020-3-7 20:08 编辑
Hufei1994 发表于 2020-3-7 17:38
高级定时器和普通定时器存在一样的问题,IO速度设置为高速的
功能函数如下:


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

使用特权

评论回复
7
Hufei1994|  楼主 | 2020-3-7 21:28 | 只看该作者
香水城 发表于 2020-3-7 19:30
我看你ARR又是设置为99,CCR又设置为5000,这时也不会有PWM输出的,CCR要小于ARR的值,不然看不到波形的 ...

还真是,比较值怎么可以比计数值小呢。我太**了
谢谢版主!!!

使用特权

评论回复
8
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

粉丝