ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU

[STM32F1] 如何使PWM输出与中断同步

[复制链接]
124|10
 楼主 | 2019-11-29 17:32 | 显示全部楼层 |阅读模式
PWM在周期的开始输出高电平的时同时产生中断,如下图所示

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

使用特权

评论回复
| 2019-11-29 21:19 | 显示全部楼层
不是十分懂楼主说的这个同步概念。

使用特权

评论回复
 楼主 | 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寄存器的预装功能。

使用特权

评论回复
 楼主 | 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;
                                }                   
                        }

使用特权

评论回复
 楼主 | 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 );
中断函数为
  1. void TIM4_IRQHandler(void)   //TIM4中断
  2. {       
  3.     static u8 TIM4_CH1_Flag=0,TIM4_CH2_Flag=0,TIM4_CH3_Flag=0;
  4.                         if(TIM_GetITStatus(TIM4, TIM_IT_CC1) != RESET)
  5.                         {
  6.                                 TIM_ClearITPendingBit(TIM4,TIM_IT_CC1);
  7.                                 if(TIM4_CH1_Flag==0)
  8.                                 {
  9.                                         TIM4->CCR1=500;//终点数  高电平时间为:终点数-起始数
  10.                                         TIM4_CH1_Flag=1;
  11.                                 }       
  12.                                 else
  13.                                 {
  14.                                         TIM4->CCR1=0;//起始数 120°=0   
  15.                                         TIM4_CH1_Flag=0;
  16.                                 }
  17.                         }
  18.                         if(TIM_GetITStatus(TIM4, TIM_IT_CC2) != RESET)
  19.                         {
  20.                                 TIM_ClearITPendingBit(TIM4,TIM_IT_CC2);
  21.                                 if(TIM4_CH2_Flag==0)
  22.                                 {
  23.                                         TIM4->CCR2=1700;//终点数   
  24.                                         TIM4_CH2_Flag=1;
  25.                                 }       
  26.                                 else
  27.                                 {
  28.                                         TIM4->CCR2=1200;//起始数 120°=1200   
  29.                                         TIM4_CH2_Flag=0;
  30.                                 }             
  31.                         }
  32.                         (TIM_GetITStatus(TIM4, TIM_IT_CC3) != RESET)
  33.                         {
  34.                                 TIM_ClearITPendingBit(TIM4,TIM_IT_CC3);
  35.                                 if(TIM4_CH3_Flag==0)
  36.                                 {
  37.                                         TIM4->CCR3=2900;//终点数
  38.                                         TIM4_CH3_Flag=1;
  39.                                 }       
  40.                                 else
  41.                                 {
  42.                                         TIM4->CCR3=2400;//起始数 120°=2400   
  43.                                         TIM4_CH3_Flag=0;
  44.                                 }                   
  45.                         }
  46. }
复制代码

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

使用特权

评论回复
| 2019-12-4 11:12 | 显示全部楼层
wape271 发表于 2019-12-4 08:45
谢谢你了
现在将定时器配置为
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;

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

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

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

使用特权

评论回复
| 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,现在用定时器的翻转已经可以实现此功能了。 
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

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