打印
[STM32F1]

如何使PWM输出与中断同步

[复制链接]
801|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wape271|  楼主 | 2019-11-29 17:32 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
PWM在周期的开始输出高电平的时同时产生中断,如下图所示

现在用TIM4产生PWM,再利用TIM4产生TIM_IT_Update中断,
发现不同步,PWM已经是高电平了,中断才发生,不知有什么办法让他们同步没,谢谢了
程序见另一个帖子
https://bbs.21ic.com/icview-2882678-1-1.html
确实如版主@香水城 所说,显示的是两个周期的波形,其原因就是中断与PWM不同步造成的

3.jpg (142.11 KB )

3.jpg

使用特权

评论回复
沙发
xinpian101| | 2019-11-29 21:19 | 只看该作者
不是十分懂楼主说的这个同步概念。

使用特权

评论回复
板凳
wape271|  楼主 | 2019-11-30 11:19 | 只看该作者
xinpian101 发表于 2019-11-29 21:19
不是十分懂楼主说的这个同步概念。

现在是PWM的高电平已经持续大概4us了,定时中断才发生
想让PWM上升沿出现的时候,就发生定时中断

使用特权

评论回复
地板
香水城| | 2019-12-2 17:28 | 只看该作者
wape271 发表于 2019-11-30 11:19
现在是PWM的高电平已经持续大概4us了,定时中断才发生
想让PWM上升沿出现的时候,就发生定时中断 ...

你这样的话可能不太好操作,你可以将PWM输出模式调整位PWM2模式,

在比较中断里修改后续ccr的值来间接调整PWM输出,同时记得

开启CCR寄存器的预装功能。

使用特权

评论回复
5
wape271|  楼主 | 2019-12-4 08:44 | 只看该作者
香水城 发表于 2019-12-2 17:28
你这样的话可能不太好操作,你可以将PWM输出模式调整位PWM2模式,

在比较中断里修改后续ccr的值来间接调 ...

谢谢你了
现在将定时器配置为
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
中断配置为
TIM_ITConfig(TIM4,TIM_IT_CC1|TIM_IT_CC2|TIM_IT_CC3,ENABLE );
中断函数为
void TIM4_IRQHandler(void)   //TIM4中断
{       
static u8 TIM4_CH1_Flag=0,TIM4_CH2_Flag=0,TIM4_CH3_Flag=0;
                        if(TIM_GetITStatus(TIM4, TIM_IT_CC1) != RESET)
                        {
                                TIM_ClearITPendingBit(TIM4,TIM_IT_CC1);
                                if(TIM4_CH1_Flag==0)
                                {
                                        TIM4->CCR1=500;//终点数  高电平时间为:终点数-起始数
                                        TIM4_CH1_Flag=1;
                                }       
                                else
                                {
                                        TIM4->CCR1=0;//起始数 120°=0   
                                        TIM4_CH1_Flag=0;
                                }
                        }
                        if(TIM_GetITStatus(TIM4, TIM_IT_CC2) != RESET)
                        {
                                TIM_ClearITPendingBit(TIM4,TIM_IT_CC2);
                                if(TIM4_CH2_Flag==0)
                                {
                                        TIM4->CCR2=1700;//终点数   
                                        TIM4_CH2_Flag=1;
                                }       
                                else
                                {
                                        TIM4->CCR2=1200;//起始数 120°=1200   
                                        TIM4_CH2_Flag=0;
                                }             
                        }
                        (TIM_GetITStatus(TIM4, TIM_IT_CC3) != RESET)
                        {
                                TIM_ClearITPendingBit(TIM4,TIM_IT_CC3);
                                if(TIM4_CH3_Flag==0)
                                {
                                        TIM4->CCR3=2900;//终点数
                                        TIM4_CH3_Flag=1;
                                }       
                                else
                                {
                                        TIM4->CCR3=2400;//起始数 120°=2400   
                                        TIM4_CH3_Flag=0;
                                }                   
                        }

使用特权

评论回复
6
wape271|  楼主 | 2019-12-4 08:45 | 只看该作者
香水城 发表于 2019-12-2 17:28
你这样的话可能不太好操作,你可以将PWM输出模式调整位PWM2模式,

在比较中断里修改后续ccr的值来间接调 ...

谢谢你了
现在将定时器配置为
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
中断配置为
TIM_ITConfig(TIM4,TIM_IT_CC1|TIM_IT_CC2|TIM_IT_CC3,ENABLE );
中断函数为
void TIM4_IRQHandler(void)   //TIM4中断
{       
    static u8 TIM4_CH1_Flag=0,TIM4_CH2_Flag=0,TIM4_CH3_Flag=0;
                        if(TIM_GetITStatus(TIM4, TIM_IT_CC1) != RESET)
                        {
                                TIM_ClearITPendingBit(TIM4,TIM_IT_CC1);
                                if(TIM4_CH1_Flag==0)
                                {
                                        TIM4->CCR1=500;//终点数  高电平时间为:终点数-起始数
                                        TIM4_CH1_Flag=1;
                                }       
                                else
                                {
                                        TIM4->CCR1=0;//起始数 120°=0   
                                        TIM4_CH1_Flag=0;
                                }
                        }
                        if(TIM_GetITStatus(TIM4, TIM_IT_CC2) != RESET)
                        {
                                TIM_ClearITPendingBit(TIM4,TIM_IT_CC2);
                                if(TIM4_CH2_Flag==0)
                                {
                                        TIM4->CCR2=1700;//终点数   
                                        TIM4_CH2_Flag=1;
                                }       
                                else
                                {
                                        TIM4->CCR2=1200;//起始数 120°=1200   
                                        TIM4_CH2_Flag=0;
                                }             
                        }
                        (TIM_GetITStatus(TIM4, TIM_IT_CC3) != RESET)
                        {
                                TIM_ClearITPendingBit(TIM4,TIM_IT_CC3);
                                if(TIM4_CH3_Flag==0)
                                {
                                        TIM4->CCR3=2900;//终点数
                                        TIM4_CH3_Flag=1;
                                }       
                                else
                                {
                                        TIM4->CCR3=2400;//起始数 120°=2400   
                                        TIM4_CH3_Flag=0;
                                }                   
                        }
}

已经可以实现任意相位任意占空比了

使用特权

评论回复
7
香水城| | 2019-12-4 11:12 | 只看该作者
wape271 发表于 2019-12-4 08:45
谢谢你了
现在将定时器配置为
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;

STM32定时器中的Toggle输出模式非常值得研究。
可以很方便的实现些东西。

这里有个应用介绍,可以参考下。

一个定时器实现3路时差和占空比可调的波形

使用特权

评论回复
8
東南博士| | 2019-12-4 11:24 | 只看该作者
你这是要做PWM个数判断吗?

使用特权

评论回复
评论
wape271 2019-12-5 09:15 回复TA
@東南博士 :没做那么复杂,DSP还没用过 是给电容充电的,目的是减小母线的峰值电流,将单个充电IGBT的电流降下来 
東南博士 2019-12-4 15:40 回复TA
@wape271 :三相的逆变或者斩波吗?如果是这个应用,不是在这里踢馆,你应该选择究竟市场验证的TIDSP28xx系列的电力老大啊! 
wape271 2019-12-4 12:29 回复TA
不是,是想输出三相PWM。 之前的想法是利用定时中断来打开和关闭相应PWM输出脚, 比如整个三相的周期是60uS(PWM周期实际为20uS),在0~20uS打开PWM1,在20uS~40uS打开PWM2,在40uS~60uS打开PWM3,发现总是不能及时关断对应PWM,现在用定时器的翻转已经可以实现此功能了。 
9
八层楼| | 2019-12-11 14:14 | 只看该作者
感觉很难真正的同步

使用特权

评论回复
10
renzheshengui| | 2019-12-12 12:06 | 只看该作者
非常感谢各位的分享啊

使用特权

评论回复
11
wakayi| | 2019-12-12 12:07 | 只看该作者
非常好的帖子啊

使用特权

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

本版积分规则

15

主题

166

帖子

5

粉丝