你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

TIM1的pwm配置H桥电路等宽脉冲

[复制链接]
凡桂2008 提问时间:2019-12-21 15:14 /
我有个H桥电路,打算用Tim1的两路互补信号驱动H桥,H桥上都是igbt,我把图贴出来(原理图.jpg、理想信号.jpg、实际信号.jpg)我的负载是电源输出,单根线,我想用tim1的互补输出得到理想信号.jpg的波形,但是我始终配置不出来想要得到的波形,理想波形是两路等脉宽的波形,但是实际信号却是不等宽的,
那如果我想得到理想信号的波形,我该如何实际我的电路跟程序呢?
我把程序贴出来:
void Init_Pwm(void)
{

        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        TIM_OCInitTypeDef TIM_OCInitStructure;
        TIM_BDTRInitTypeDef TIM_BDTRInitStructure;


                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_TIM1|RCC_APB2Periph_AFIO,ENABLE);
                GPIO_PinRemapConfig(GPIO_FullRemap_TIM1, ENABLE);
                TIM_DeInit(TIM1);
                TIM_InternalClockConfig(TIM1);

        
                GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_12|GPIO_Pin_13;
                GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
                GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
                GPIO_Init(GPIOE,&GPIO_InitStructure);
               
                TIM_TimeBaseStructure.TIM_Period=100-1;        
                TIM_TimeBaseStructure.TIM_Prescaler=9-1;
                TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;        
                TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//TIM_CounterMode_CenterAligned1;
                TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
                TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

                TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//
                TIM_OCInitStructure.TIM_Pulse=0;
                TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
                TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
                TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Set;

                TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_Low;        
                TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Enable;
                TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCNIdleState_Set;
                TIM_OC1Init(TIM1,&TIM_OCInitStructure);
               
                TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
                TIM_OCInitStructure.TIM_Pulse=0;
                TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//TIM_OCPolarity_Low;
                TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
                TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Reset;

                TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_High;        //TIM_OCNPolarity_Low;
                TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Enable;
                TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCNIdleState_Reset;               
                TIM_OC3Init(TIM1,&TIM_OCInitStructure);
               
                TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Disable;
                TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Disable;
                TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
                TIM_BDTRInitStructure.TIM_DeadTime =224;//138;
                TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
                TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;        
                TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
                TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);

                TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
                TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);
                TIM_ARRPreloadConfig(TIM1, ENABLE);

//                TIM_OC1NPolarityConfig(TIM1,TIM_OCNPolarity_Low);
//                TIM_OC3NPolarityConfig(TIM1,TIM_OCNPolarity_Low);
               
                //TIM_SelectOutputTrigger(TIM1,TIM_TRGOSource_Update);
                TIM_ITConfig(TIM1,TIM_FLAG_Update,ENABLE);               
                TIM_Cmd(TIM1,ENABLE);
                TIM_CtrlPWMOutputs(TIM1, ENABLE);


}

我如何使用这个tim的pwm能配置出等宽脉冲,然后占空比可调?
理想波形.png
实际波形.png
原理图.png
收藏 评论14 发布时间:2019-12-21 15:14

举报

14个回答
子曰好人 回答时间:2019-12-21 17:17:17
看你的理想波形有点像死区插入的很大的互补PWM,你的实际波形如果分别是上下桥臂的驱动信号,是会造成桥臂直通的。计数模式选错了,应该选择中心对齐模式
aiherong 回答时间:2019-12-21 22:07:07
除了考虑死区,若用同一型号IGBT,H桥的四路驱动信号都要先隔离再接入
凡桂2008 回答时间:2019-12-23 09:04:27
aiherong 发表于 2019-12-21 22:07
除了考虑死区,若用同一型号IGBT,H桥的四路驱动信号都要先隔离再接入

都是隔离了的,但是逻辑还是一样的,就是说,我如何做到Q3跟Q4同时导通,Q2跟Q1同时导通,就像我的理想波形那样,那两路pwm如何分配?程序如何设置?
凡桂2008 回答时间:2019-12-23 09:14:23
子曰好人 发表于 2019-12-21 17:17
看你的理想波形有点像死区插入的很大的互补PWM,你的实际波形如果分别是上下桥臂的驱动信号,是会造成桥臂 ...

一样的,我先把代码贴出来
                TIM_TimeBaseStructure.TIM_Period=100-1;       
                TIM_TimeBaseStructure.TIM_Prescaler=9-1;
                TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;       
                TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_CenterAligned1;//TIM_CounterMode_Up;
                TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
                TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

                TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//
                TIM_OCInitStructure.TIM_Pulse=0;
                TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
                TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
                TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Set;

                TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_Low;       
                TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Enable;
                TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCNIdleState_Set;
                TIM_OC1Init(TIM1,&TIM_OCInitStructure);

我使用了TIM_CounterMode_CenterAligned1模式,然后频率改为50KHz,实际得到的频率是25kHz,说明这个配置起作用了,但是还是达不到我想要的结果,不知道别人在用stm32做开关电源类控制的时候是怎么设置的。
中间对齐模式.png
子曰好人 回答时间:2019-12-23 09:31:48
凡桂2008 发表于 2019-12-23 09:14
一样的,我先把代码贴出来
                TIM_TimeBaseStructure.TIM_Period=100-1;       
                TIM_TimeBaseStructure.TIM_Pr ...

上管和下管的MOS不一样吗?我看你
  1. TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_Low;
复制代码

这两句设置的极性不一样,之前没注意看。如果上管下管的极性是一样的,那么就该设置成相同的极性
凡桂2008 回答时间:2019-12-23 09:58:35
子曰好人 发表于 2019-12-23 09:31
上管和下管的MOS不一样吗?我看你

这两句设置的极性不一样,之前没注意看。如果上管下管的极性是一样的 ...

设置一样的,不就是互补信号了?那么当我OC的占空比是20%的时候,那么NOC不就是80%的占空比了?这样我用两对pwm信号控制H桥的话也不能同时打开,同时关闭啊?
凡桂2008 回答时间:2019-12-23 10:09:24
凡桂2008 发表于 2019-12-23 09:58
设置一样的,不就是互补信号了?那么当我OC的占空比是20%的时候,那么NOC不就是80%的占空比了?这样我用 ...

这就是极性设置一样的结果
dso_45.png
凡桂2008 回答时间:2019-12-23 10:16:52
凡桂2008 发表于 2019-12-23 10:09
这就是极性设置一样的结果

如何设置能把箭头部分搞成低电平就行了,但是不知道怎么设置,尝试了很多种办法都不行。
想要的波形.jpg
凡桂2008 回答时间:2019-12-23 10:19:14
TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Set;
这个Idlestate到底是做什么用的?好像怎么设置都没什么效果。
子曰好人 回答时间:2019-12-23 10:36:36
凡桂2008 发表于 2019-12-23 09:58
设置一样的,不就是互补信号了?那么当我OC的占空比是20%的时候,那么NOC不就是80%的占空比了?这样我用 ...

你不是想要互补信号?同时开同时关,你上下管子就直通了,不明白你这么做的意义。还是说你这个不是同一桥臂上下管的驱动信号?
子曰好人 回答时间:2019-12-23 10:38:44
凡桂2008 发表于 2019-12-23 10:19
TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Set;
这个Idlestate到底是做什么用的?好像怎么设 ...

idlestate的意思就是空闲状态的电平,通常是MOS的无效电平。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

aiherong 回答时间:2019-12-24 05:03:28
我都用寄存器编程,你不妨也看一下手册,好像有控制寄存器中有一位设置PWM1或PWM2两种工作方式
直接用寄存器编程的语句注意放在对应init函数之后即可……
刚注意到你列出的代码
如果软件确实没问题,建议: 先将四个驱动信号引脚断开(保留光耦),用电阻代替电机,单独检测4个桥臂的静态工作点的一致性
手动给予驱动电压,再看桥的对称性

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

aiherong 回答时间:2019-12-24 05:58:59
若想实现你图示的理想波形的跃变时的尖峰,可在驱动电阻上
并一pF级电容,比如:10pF,尽量小不能大
凡桂2008 回答时间:2019-12-24 16:44:05
子曰好人 发表于 2019-12-23 10:36
你不是想要互补信号?同时开同时关,你上下管子就直通了,不明白你这么做的意义。还是说你这个不是同一桥 ...

问题解决了,我是需要同时关断跟同时导通的,我用中心对齐方式,把其中一路pwm的oc跟noc放在H桥的左上臂跟右下臂,另外一路pwm放在右上臂跟左下臂,就可以了

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版