[STM32F1] 关于STM32 TIM8 PWM问题,郁闷死了,求大神帮忙!

[复制链接]
943|10
 楼主| sky86530430 发表于 2020-10-30 11:37 | 显示全部楼层 |阅读模式
本帖最后由 sky86530430 于 2020-10-30 11:42 编辑

我目前做一个项目需要使用TIM8 通道2,3输出两路PWM 20khz 占空比30%的波形,目前情况是波形是有了,但是波形不是连贯的,示波器上是一会有20kz的pwm波形,一会又没有,把时间分辨率调大,发现有跟没有的波形恰好又是一个 30%占空比的波形,STM32通用定时器做PWM我也是做过的,但没用过TIM8做,调了2天了真是要疯!

这是源代码:
  1. /*
  2. ******************************************************************************
  3. * Function Name  : TIM_PWM_Init
  4. * Description    :
  5. *                        
  6. * Input          : None
  7. * Output         : None
  8. * Return         :
  9. ******************************************************************************
  10. */
  11. static        void        TIM_PWM_Init (void)
  12. {        
  13.                 GPIO_InitTypeDef GPIO_InitStructure;
  14.                 TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  15.                 TIM_OCInitTypeDef  TIM_OCInitStructure;
  16.         
  17.                 /* PWM IO Init */
  18.                 /* GPIOC Configuration:TIM8 Channel 2, 3 as alternate function push-pull */
  19.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO,        ENABLE);
  20.                 GPIO_InitStructure.GPIO_Pin = BSP_GPIOC_PUMP1_PWM | BSP_GPIOC_PUMP2_PWM;
  21.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  22.                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  23.                 GPIO_Init(GPIOC, &GPIO_InitStructure);
  24.         
  25.                 /* TIM8 clock enable */
  26.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);
  27.                                 
  28.                 /* Time base configuration */
  29.                 TIM_TimeBaseStructure.TIM_Period = 3599;        // ʱÖÓÆÀÂÊÊÇ72000000£¬20KHz£¬Ê±ÖÓÎÞÐè·ÖƵ£¬ÉèÖÃΪ3600 - 1
  30.                 TIM_TimeBaseStructure.TIM_Prescaler = 0;
  31.                 TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  32.                 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;        
  33.                 TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);

  34.                 /* PWM2 Mode configuration: Channel2 */
  35.                 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  36.                 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  37.                 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;               
  38.                 TIM_OCInitStructure.TIM_Pulse = (3600 * 0.3);        // 30%
  39.                 TIM_OC2Init(TIM8, &TIM_OCInitStructure);
  40.                 TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable);
  41.                
  42.                 /* PWM2 Mode configuration: Channel3 */
  43.                 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  44.                 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  45.                 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;               
  46.                 TIM_OCInitStructure.TIM_Pulse = (3600 * 0.3);        // 30%
  47.                 TIM_OC3Init(TIM8, &TIM_OCInitStructure);
  48.                 TIM_OC3PreloadConfig(TIM8, TIM_OCPreload_Enable);               

  49.                 TIM_ARRPreloadConfig(TIM8, ENABLE);
  50.                
  51.                 /* TIM1 Main Output Enable */
  52.     TIM_CtrlPWMOutputs(TIM8,ENABLE);
  53.                
  54.                 /* TIM8 enable counter */
  55.                 TIM_Cmd(TIM8, ENABLE);
  56. }

这是正常的20khz pwm

这是正常的20khz pwm

这是扫描周期放慢后的波形,看上去也是30%

这是扫描周期放慢后的波形,看上去也是30%
 楼主| sky86530430 发表于 2020-10-30 11:43 | 显示全部楼层
请大神们帮帮忙!
cry1109 发表于 2020-10-30 13:39 | 显示全部楼层
PWM输出期间有没有调节占空比或频率的操作?
 楼主| sky86530430 发表于 2020-10-30 13:42 | 显示全部楼层
cry1109 发表于 2020-10-30 13:39
PWM输出期间有没有调节占空比或频率的操作?

没有的,启动后就while(1)在哪里了。
sonicll 发表于 2020-10-30 14:27 | 显示全部楼层
感觉像是示波器显示的问题,你第二张图波形周期虽然是2.36s,但是下面写的CH1频率仍然是20KHz。示波器的时间轴拉长,图像显示的时候好像会进行抽样吧,因为显示不下那么多数据。
参考这里https://zhidao.baidu.com/question/459241216.html
sky.sun.zz 发表于 2020-10-30 14:55 | 显示全部楼层
以下这句不应该使用浮点小数:
TIM_OCInitStructure.TIM_Pulse = (3600 * 0.3);

应该直接立即数:
TIM_OCInitStructure.TIM_Pulse =1200;
香水城 发表于 2020-10-30 16:17 | 显示全部楼层
如果中途没做任何调整,会不会是仪器问题啊。
 楼主| sky86530430 发表于 2020-10-30 16:23 | 显示全部楼层
sky.sun.zz 发表于 2020-10-30 14:55
以下这句不应该使用浮点小数:
TIM_OCInitStructure.TIM_Pulse = (3600 * 0.3);

这里应该不影响。
 楼主| sky86530430 发表于 2020-10-30 16:24 | 显示全部楼层
sonicll 发表于 2020-10-30 14:27
感觉像是示波器显示的问题,你第二张图波形周期虽然是2.36s,但是下面写的CH1频率仍然是20KHz。示波器的时 ...

感谢回复,您说的好像有这种可能性,我研究研究。
 楼主| sky86530430 发表于 2020-10-30 16:27 | 显示全部楼层
香水城 发表于 2020-10-30 16:17
如果中途没做任何调整,会不会是仪器问题啊。

感谢回复,我也正在研究看是不是仪器问题,代码我也检察好多遍了应该没问题。
我发现PWM频率只要上到Khz 级别示波器看就会出现方波。如果是几十或是几百HZ到还连续的。
香水城 发表于 2020-10-30 16:29 | 显示全部楼层
sky86530430 发表于 2020-10-30 16:27
感谢回复,我也正在研究看是不是仪器问题,代码我也检察好多遍了应该没问题。
我发现PWM频率只要上到Khz  ...

基于定时器的PWM输出,如果没有做中途参数调整,输出很稳定的,不会变来变去的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

6

帖子

0

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