OpenEdv-开源电子网

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

基于SPWM的单相全桥逆变器,输出波形出现问题,请大神帮忙看看

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2014-11-10
在线时间
0 小时
发表于 2014-11-10 15:38:03 | 显示全部楼层 |阅读模式
5金钱
本人现在做的是基于SPWM的单相全桥逆变器,通过STM32F107的高级定时器1的两个通道和它们互补的通道形成4路SPWM波形,对驱动板IGBT进行开关控制,实现DC—>AC逆变

高级定时器1设置如下:
[mw_shl_code=c,true]void time_init(u16 arr,u16 psc,u16 pul_ch1,u16 pul_ch2) { GPIO_InitTypeDef GPIO_InitStructure2; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; TIM_BDTRInitTypeDef TIM_BDTRInitStructure; //第一步:配置时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_TIM1,ENABLE); //第二步,配置gpio口 /********TIM1_CH1 引脚配置*********/ GPIO_InitStructure2.GPIO_Pin=GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10; // | GPIO_Pin_10 | GPIO_Pin_11 GPIO_InitStructure2.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure2.GPIO_Mode=GPIO_Mode_AF_PP; //设置为复用浮空输出 GPIO_Init(GPIOA,&GPIO_InitStructure2); /*********TIM1_CH1N 引脚配置********/ GPIO_InitStructure2.GPIO_Pin=GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStructure2.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure2.GPIO_Mode=GPIO_Mode_AF_PP; //设置为复用浮空输出 GPIO_Init(GPIOB,&GPIO_InitStructure2); //第三步,定时器基本配置 TIM_TimeBaseStructure.TIM_Period=arr; // 自动重装载寄存器的值 TIM_TimeBaseStructure.TIM_Prescaler=psc; // 时钟预分频数 TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; // 采样分频 TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数 TIM_TimeBaseStructure.TIM_RepetitionCounter=0;//重复寄存器,用于自动更新pwm占空比 TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //第四步pwm输出配置 TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2; //设置为pwm1输出模式 TIM_OCInitStructure.TIM_Pulse=pul_ch1; //设置占空比时间 TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High; //设置输出极性 TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; //使能该通道输出 //下面几个参数是高级定时器才会用到,通用定时器不用配置 TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_High; //设置互补端输出极性 TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Enable; //使能互补端输出 TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Reset; //死区后输出状态 TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCNIdleState_Reset; //死区后互补端输出状态 TIM_OC1Init(TIM1,&TIM_OCInitStructure); //按照指定参数初始化 TIM_OCInitStructure.TIM_Pulse=pul_ch2; //设置占空比时间 TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High; //设置输出极性 TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_High; //设置互补端输出极性 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 = 0xe4; //死区时间设置 4us TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable; //刹车功能使能 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); //使能TIMx在CCR1上的预装载寄存器 TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能TIMx在CCR2上的预装载寄存器 TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器 TIM_Cmd(TIM1,ENABLE); //打开TIM1 //下面这句是高级定时器才有的,输出pwm必须打开 TIM_CtrlPWMOutputs(TIM1, ENABLE); //pwm输出使能,一定要记得打开 } [/mw_shl_code]
通过定时器3控制输出占空比,定时器3以及中断设置设置如下:
[mw_shl_code=c,true]void TIM3_Int_Init(u16 arr,u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能 //定时器TIM3初始化 TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位 TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断 //中断优先级NVIC设置 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能 NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器 TIM_Cmd(TIM3, ENABLE); //使能TIMx } //定时器3中断服务程序 void TIM3_IRQHandler(void) //TIM3中断 { static u8 sign = 0; static u8 i = 0; LED1 = sign; if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否 { TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除TIMx更新中断标志 if(sign == 0) { TIM1->CCR1 = sinTab; TIM1->CCR3 = 0; i++; if(i == 200) { i = 0; sign = 1; } } else { TIM1->CCR1 = 0; TIM1->CCR3 = sinTab; i++; if(i == 200) { i = 0; sign = 0; } } } }[/mw_shl_code]
现在驱动板输出端出现波形:


输入DC:24V    
输出AC:峰峰值21.6V
但波形出现截止现象,不知是程序问题还是驱动板滤波电路设计有误,请大神帮忙看看

最佳答案

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

回复【2楼】kassandra: --------------------------------- 波形出来了,我以前是吧占空比写成0~100%了,所以有截止。谢谢啊
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2014-11-10
在线时间
0 小时
 楼主| 发表于 2014-11-10 15:38:04 | 显示全部楼层
回复【2楼】kassandra:
---------------------------------
波形出来了,我以前是吧占空比写成0~100%了,所以有截止。谢谢啊
回复

使用道具 举报

17

主题

293

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
388
金钱
388
注册时间
2012-12-26
在线时间
1 小时
发表于 2014-11-10 18:51:13 | 显示全部楼层
GOOD,俺曾经用103整过SVPWM,带死区控制的6路互补PWM,你可以先测下CPU输出的4路PWM波形对不对,以判定是程序的问题还是IBGT驱动有问题
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-10 19:40:46 | 显示全部楼层
帮顶.....
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2015-3-9
在线时间
2 小时
发表于 2015-3-9 12:30:19 | 显示全部楼层
回复【2楼】kassandra:
---------------------------------
朋友 能否共享一下您弄的SVPWM程序  只是一部分也可以 最近自己弄的焦头烂额的了
回复

使用道具 举报

50

主题

385

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1126
金钱
1126
注册时间
2014-8-24
在线时间
146 小时
发表于 2015-5-9 16:59:49 | 显示全部楼层
楼主的TIM3_IRQHandler里面为什么ccr1和ccr3要分开赋值呢?
PWM1更新完一个周期,PWM3再更新么?
找一份喜欢的工作,这样每天工作的8个小时是快乐的。 找一个喜欢的人,这样每天工作之外的16个小时也是快乐的。
回复

使用道具 举报

50

主题

385

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1126
金钱
1126
注册时间
2014-8-24
在线时间
146 小时
发表于 2015-5-9 17:00:06 | 显示全部楼层
回复【4楼】zhujiaqqq:
---------------------------------
占空比不能写成0~100%么?
找一份喜欢的工作,这样每天工作的8个小时是快乐的。 找一个喜欢的人,这样每天工作之外的16个小时也是快乐的。
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-7-2 17:08:39 | 显示全部楼层
帖子已经比较久远,正在开发功能借鉴楼主一些思路,感谢分享
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

25

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2015-5-6
在线时间
19 小时
发表于 2015-7-11 08:33:44 | 显示全部楼层
回复【6楼】tao475824827:
---------------------------------
做的事全桥逆变啊,一路赋值,一路必须要关断
回复

使用道具 举报

2

主题

8

帖子

1

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2015-4-5
在线时间
0 小时
发表于 2015-7-23 11:10:01 | 显示全部楼层
这个输入是单极性的吗
回复

使用道具 举报

0

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2015-12-9
在线时间
34 小时
发表于 2016-2-2 09:59:16 | 显示全部楼层
您好,我想问下,您不是使用了定时器1的两个通道和他们的互补通道,看你程序通道1和通道3分别对应全桥的两个桥路中控制信号,但是就是不明白这个通道1和通道3的互补信号怎么在全桥逆变中使用。我现在自己也做,我的理解是这样:我在一个正弦波的半个周期让全桥的一个桥臂的两个管子按照正弦波的变化赋予PWM占空比,另一个桥臂的两个管子占空比给0,下一个半波周期相反,不知道这样理解对不??
回复

使用道具 举报

0

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2015-12-9
在线时间
34 小时
发表于 2016-2-25 15:19:03 | 显示全部楼层
占空比为什么不能给0~100%呢?我也出现了楼主所给的波形情况,请问怎么改占空比??难道不是滤波的问题吗??
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 22:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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