OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6127|回复: 6

采用TIM1产生3对互补PWM,使能中断后,就输出不了波形

[复制链接]

10

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
346
金钱
346
注册时间
2013-12-20
在线时间
94 小时
发表于 2014-5-30 12:53:34 | 显示全部楼层 |阅读模式
5金钱
用TIM1产生3对PWM控制BLDC , 需要对占空比进行调节,设置了定时器的溢出中断和COM中断

TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); //使能刷新中断
TIM_ITConfig(TIM1, TIM_IT_COM, ENABLE); //使能比较

注释掉这两条就能正常生成波形

开启后就输出不了,使能中断还配合什么设置吗

最佳答案

查看完整内容[请看2#楼]

回复【2楼】crossok: --------------------------------- 你是没有中断服务函数吧。。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-30 12:53:35 | 显示全部楼层
回复【2楼】crossok:
---------------------------------
你是没有中断服务函数吧。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

10

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
346
金钱
346
注册时间
2013-12-20
在线时间
94 小时
 楼主| 发表于 2014-5-30 12:53:35 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
嗯,是中断函数的问题
void TIM1_TRG_COM_IRQHandler()
{
TIM_ClearITPendingBit(TIM1, TIM_IT_COM);
        ..................
}


//********************************************************************************  

void TIM1_UP_IRQHandler()
{
TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
        ................
}


加上这两条就OK了,谢谢,我是不是可以这么理解,没清中断标志导致一直进中断造成的啊????????
回复

使用道具 举报

10

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
346
金钱
346
注册时间
2013-12-20
在线时间
94 小时
 楼主| 发表于 2014-5-30 12:58:01 | 显示全部楼层
有知道的指导下我吧

void timer_initPWM(void)
{
TIM_TimeBaseInitTypeDef TIM_BaseStructure;
TIM_OCInitTypeDef       TIM_OcStructure;
TIM_BDTRInitTypeDef     TIM_BdtrStructure;
NVIC_InitTypeDef NVICInitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

//Kommutierungsinterrupt im NVIC eintragen
NVICInitStructure.NVIC_IRQChannel                   = TIM1_TRG_COM_IRQn;
NVICInitStructure.NVIC_IRQChannelPreemptionPriority = TIM1_PRE_EMPTION_PRIORITY;
NVICInitStructure.NVIC_IRQChannelSubPriority        = TIM1_SUB_PRIORITY;
NVICInitStructure.NVIC_IRQChannelCmd                = ENABLE;
NVIC_Init(&NVICInitStructure);

//TMR1 刷新中断
NVICInitStructure.NVIC_IRQChannel                   = TIM1_UP_IRQn;
NVICInitStructure.NVIC_IRQChannelPreemptionPriority = TIM1_PRE_EMPTION_PRIORITY;
NVICInitStructure.NVIC_IRQChannelSubPriority        = TIM1_SUB_PRIORITY;
NVICInitStructure.NVIC_IRQChannelCmd                = ENABLE;
NVIC_Init(&NVICInitStructure);

//Deinitializes the TIM1 peripheral registers to their default reset values
TIM_DeInit(TIM1);

//(TIM1CLK = SYSCLK = 72MHz) => MAX_PWM_VALUE=3600 => f_PWM=20kHz (unsymmetrische PWM)(50us)
TIM_BaseStructure.TIM_Period            = MAX_PWM_VALUE; //自动装载值,累计次数
TIM_BaseStructure.TIM_Prescaler         = 0;
TIM_BaseStructure.TIM_ClockDivision     = TIM_CKD_DIV1;
TIM_BaseStructure.TIM_CounterMode       = TIM_CounterMode_CenterAligned2; //TIM1中央对齐模式2
TIM_BaseStructure.TIM_RepetitionCounter = 1;
TIM_TimeBaseInit(TIM1, &TIM_BaseStructure);

//Einstellungen f黵 Kanal 1, 2 und 3 (alle gleich)
TIM_OcStructure.TIM_OCMode       = TIM_OCMode_Timing; //TMR1 输出比较时间模式
TIM_OcStructure.TIM_OutputState  = TIM_OutputState_Enable; //使能输出比较状态
TIM_OcStructure.TIM_OutputNState = TIM_OutputNState_Enable; //使能输出比较N状态
TIM_OcStructure.TIM_Pulse        = 1000; //待装入捕获比较寄存器的脉冲值
TIM_OcStructure.TIM_OCPolarity   = TIM_OCPolarity_High; //TMR1输出比较极性高
TIM_OcStructure.TIM_OCNPolarity  = TIM_OCNPolarity_High; //TMR1输出比较N极性高
TIM_OcStructure.TIM_OCIdleState  = TIM_OCIdleState_Set; //当MOE=0设置TIM1输出比较空闲状态
TIM_OcStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set; //当MOE=0设置TIM1输出比较N空闲状态
TIM_OC1Init(TIM1, &TIM_OcStructure);
TIM_OC2Init(TIM1, &TIM_OcStructure);
TIM_OC3Init(TIM1, &TIM_OcStructure);

//Einstellungen f黵 Totzeit und automatische Ausgabe der PWMs
TIM_BdtrStructure.TIM_OSSRState       = TIM_OSSRState_Enable; //使能TIM1 OSSR状态
TIM_BdtrStructure.TIM_OSSIState       = TIM_OSSIState_Enable; //使能TIM1 OSSI状态
TIM_BdtrStructure.TIM_LOCKLevel       = TIM_LOCKLevel_OFF; //不锁任何位
TIM_BdtrStructure.TIM_DeadTime        = 1; //输出打开和关闭状态之间的延时,死区时间
TIM_BdtrStructure.TIM_Break           = TIM_Break_Disable; //失能TIM1刹车输入
TIM_BdtrStructure.TIM_BreakPolarity   = TIM_BreakPolarity_High; //TIM1刹车输入管脚极性高
TIM_BdtrStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable; //自动输出功能使能
TIM_BDTRConfig(TIM1, &TIM_BdtrStructure);

TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); //使能刷新中断
TIM_ITConfig(TIM1, TIM_IT_COM, ENABLE); //使能比较

TIM_CCPreloadControl(TIM1, ENABLE); //使能TMR1捕获比较控制位

//TIM1 aktivieren
TIM_Cmd(TIM1, ENABLE); //使能TMR1

//PWM-Ausg鋘ge aktivieren
TIM_CtrlPWMOutputs(TIM1, ENABLE); //使能TIM1的主输出
}
回复

使用道具 举报

5

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2013-10-8
在线时间
3 小时
发表于 2014-5-30 18:16:28 | 显示全部楼层
回复【2楼】crossok:
---------------------------------
你好,你的问题解决了吗?我也遇到和您一样的问题,想请教您,麻烦留个qq
回复

使用道具 举报

10

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
346
金钱
346
注册时间
2013-12-20
在线时间
94 小时
 楼主| 发表于 2014-5-31 15:37:17 | 显示全部楼层
回复【3楼】愤怒的小猪:
---------------------------------
我还是第一次用STM32做项目,菜的很呢 。1304256523
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-31 21:37:14 | 显示全部楼层
回复【5楼】crossok:
---------------------------------
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-7 13:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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