打印
[STM32F1]

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

[复制链接]
579|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 sky86530430 于 2020-10-30 11:42 编辑

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

这是源代码:
/*
******************************************************************************
* Function Name  : TIM_PWM_Init
* Description    :
*                        
* Input          : None
* Output         : None
* Return         :
******************************************************************************
*/
static        void        TIM_PWM_Init (void)
{        
                GPIO_InitTypeDef GPIO_InitStructure;
                TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
                TIM_OCInitTypeDef  TIM_OCInitStructure;
        
                /* PWM IO Init */
                /* GPIOC Configuration:TIM8 Channel 2, 3 as alternate function push-pull */
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO,        ENABLE);
                GPIO_InitStructure.GPIO_Pin = BSP_GPIOC_PUMP1_PWM | BSP_GPIOC_PUMP2_PWM;
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                GPIO_Init(GPIOC, &GPIO_InitStructure);
        
                /* TIM8 clock enable */
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);
                                
                /* Time base configuration */
                TIM_TimeBaseStructure.TIM_Period = 3599;        // ʱÖÓÆÀÂÊÊÇ72000000£¬20KHz£¬Ê±ÖÓÎÞÐè·ÖƵ£¬ÉèÖÃΪ3600 - 1
                TIM_TimeBaseStructure.TIM_Prescaler = 0;
                TIM_TimeBaseStructure.TIM_ClockDivision = 0;
                TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;        
                TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);

                /* PWM2 Mode configuration: Channel2 */
                TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
                TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
                TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;               
                TIM_OCInitStructure.TIM_Pulse = (3600 * 0.3);        // 30%
                TIM_OC2Init(TIM8, &TIM_OCInitStructure);
                TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable);
               
                /* PWM2 Mode configuration: Channel3 */
                TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
                TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
                TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;               
                TIM_OCInitStructure.TIM_Pulse = (3600 * 0.3);        // 30%
                TIM_OC3Init(TIM8, &TIM_OCInitStructure);
                TIM_OC3PreloadConfig(TIM8, TIM_OCPreload_Enable);               

                TIM_ARRPreloadConfig(TIM8, ENABLE);
               
                /* TIM1 Main Output Enable */
    TIM_CtrlPWMOutputs(TIM8,ENABLE);
               
                /* TIM8 enable counter */
                TIM_Cmd(TIM8, ENABLE);
}

small.jpg (443.97 KB )

这是正常的20khz pwm

这是正常的20khz pwm

big.jpg (351.14 KB )

这是扫描周期放慢后的波形,看上去也是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)在哪里了。

使用特权

评论回复
5
sonicll| | 2020-10-30 14:27 | 只看该作者
感觉像是示波器显示的问题,你第二张图波形周期虽然是2.36s,但是下面写的CH1频率仍然是20KHz。示波器的时间轴拉长,图像显示的时候好像会进行抽样吧,因为显示不下那么多数据。
参考这里https://zhidao.baidu.com/question/459241216.html

使用特权

评论回复
6
sky.sun.zz| | 2020-10-30 14:55 | 只看该作者
以下这句不应该使用浮点小数:
TIM_OCInitStructure.TIM_Pulse = (3600 * 0.3);

应该直接立即数:
TIM_OCInitStructure.TIM_Pulse =1200;

使用特权

评论回复
7
香水城| | 2020-10-30 16:17 | 只看该作者
如果中途没做任何调整,会不会是仪器问题啊。

使用特权

评论回复
8
sky86530430|  楼主 | 2020-10-30 16:23 | 只看该作者
sky.sun.zz 发表于 2020-10-30 14:55
以下这句不应该使用浮点小数:
TIM_OCInitStructure.TIM_Pulse = (3600 * 0.3);

这里应该不影响。

使用特权

评论回复
9
sky86530430|  楼主 | 2020-10-30 16:24 | 只看该作者
sonicll 发表于 2020-10-30 14:27
感觉像是示波器显示的问题,你第二张图波形周期虽然是2.36s,但是下面写的CH1频率仍然是20KHz。示波器的时 ...

感谢回复,您说的好像有这种可能性,我研究研究。

使用特权

评论回复
10
sky86530430|  楼主 | 2020-10-30 16:27 | 只看该作者
香水城 发表于 2020-10-30 16:17
如果中途没做任何调整,会不会是仪器问题啊。

感谢回复,我也正在研究看是不是仪器问题,代码我也检察好多遍了应该没问题。
我发现PWM频率只要上到Khz 级别示波器看就会出现方波。如果是几十或是几百HZ到还连续的。

使用特权

评论回复
11
香水城| | 2020-10-30 16:29 | 只看该作者
sky86530430 发表于 2020-10-30 16:27
感谢回复,我也正在研究看是不是仪器问题,代码我也检察好多遍了应该没问题。
我发现PWM频率只要上到Khz  ...

基于定时器的PWM输出,如果没有做中途参数调整,输出很稳定的,不会变来变去的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

6

帖子

0

粉丝