硬汉嵌入式论坛

 找回密码
 立即注册
查看: 850|回复: 6
收起左侧

[TIMER] TIM17 PWM输出异常

[复制链接]

9

主题

32

回帖

59

积分

初级会员

积分
59
发表于 2022-6-8 09:33:37 | 显示全部楼层 |阅读模式
求教大佬,我的TIM16和TIM17配置一样,采用PWM1模式,高有效,两者使用 HAL_TIM_PWM_Start_IT(&TIM17_Handler,TIM_CHANNEL_1) 开启了PWM比较中断,输出一个脉冲后在中断回调函数中使用 HAL_TIM_PWM_Stop_IT 关闭,此时发现TIM16 CH1电平变低了,但是TIM17的电平仍维持在高电平,有大佬遇到过这种情况吗,试过改CNT和CCER,均无效
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
发表于 2022-6-8 10:27:45 | 显示全部楼层
方便的话,完整配置看下。
回复

使用道具 举报

9

主题

32

回帖

59

积分

初级会员

积分
59
 楼主| 发表于 2022-6-8 14:01:31 | 显示全部楼层
eric2013 发表于 2022-6-8 10:27
方便的话,完整配置看下。

TIM17_CH1Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1,CNT<CCR为有效
if(mode == 0)
{
        if(digital_output_channel_set[0].output_state == 0x00)
                TIM17_CH1Handler.Pulse=0;                  
        else
                TIM17_CH1Handler.Pulse=10142;              
}
else                       
        TIM17_CH1Handler.Pulse=(u16)(101.41f*digital_output_channel_set[0].output_state);              
                                                                                                                                                               
TIM17_CH1Handler.OCPolarity=TIM_OCPOLARITY_HIGH;
TIM17_CH1Handler.OCNPolarity = TIM_OCNPOLARITY_HIGH;               
TIM17_CH1Handler.OCFastMode = TIM_OCFAST_DISABLE;
TIM17_CH1Handler.OCIdleState = TIM_OCIDLESTATE_RESET;
TIM17_CH1Handler.OCNIdleState = TIM_OCNIDLESTATE_RESET;
               
HAL_TIM_PWM_ConfigChannel(&TIM17_Handler,&TIM17_CH1Handler,TIM_CHANNEL_1);
if(mode == 2)
{
        HAL_TIM_PWM_Stop(&TIM17_Handler,TIM_CHANNEL_1);
        HAL_TIM_PWM_Start_IT(&TIM17_Handler,TIM_CHANNEL_1);//开启PWM通道1
}
else
{
        HAL_TIM_PWM_Stop_IT(&TIM17_Handler,TIM_CHANNEL_1);
        HAL_TIM_PWM_Start(&TIM17_Handler,TIM_CHANNEL_1);//开启PWM通道1
}
可能在单个脉冲输出和PWN输出之间来回切换,目前定位问题在相应IO口配置,将IO口设置为无上下拉正常了,但TIM16的IO口上拉没问题。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
发表于 2022-6-8 17:04:16 | 显示全部楼层
zhangzhang 发表于 2022-6-8 14:01
TIM17_CH1Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1,CNT
把这几个函数的返回值都加上判断下是否HAL_OK。

另外感觉这种玩法没什么使用价值,麻烦又臃肿,还没有定时器中断控制IO方便。
回复

使用道具 举报

9

主题

32

回帖

59

积分

初级会员

积分
59
 楼主| 发表于 2022-6-8 17:11:27 | 显示全部楼层
eric2013 发表于 2022-6-8 17:04
把这几个函数的返回值都加上判断下是否HAL_OK。

另外感觉这种玩法没什么使用价值,麻烦又臃肿,还没有定 ...

主要是持续时间要变,输出时间精度要求又高,频繁进中断感觉有点麻烦
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
发表于 2022-6-9 08:33:19 | 显示全部楼层
zhangzhang 发表于 2022-6-8 17:11
主要是持续时间要变,输出时间精度要求又高,频繁进中断感觉有点麻烦

明白你的意思了,你当前这种玩法确实容易管PWM不及时,或者关闭异常的问题。比如其它高优先级中断抢占或者你的程序有其它开关中断操作就容易出问题。
回复

使用道具 举报

9

主题

32

回帖

59

积分

初级会员

积分
59
 楼主| 发表于 2022-6-9 09:53:49 | 显示全部楼层
eric2013 发表于 2022-6-9 08:33
明白你的意思了,你当前这种玩法确实容易管PWM不及时,或者关闭异常的问题。比如其它高优先级中断抢占或 ...

希望到时候选定了一种输出方式,别来回切换就好
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-3 09:25 , Processed in 0.251389 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表