• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖
  • 论坛首页
  • 逆变/光伏/并网
  • 最近用PIC16F716产生SPWM波,但一开机总是烧H桥。貌似是程序有错,麻烦各位大侠帮帮忙,看下什么地方有

最近用PIC16F716产生SPWM波,但一开机总是烧H桥。貌似是程序有错,麻烦各位大侠帮帮忙,看下什么地方有

最近用PIC16F716产生SPWM波,但一开机总是烧H桥。貌似是程序有错,麻烦各位大侠帮帮忙,看下什么地方有

问题。

PIC16F716的PWM模块工作在半桥模式,H桥一个桥臂是互为相反的SPWM波(该桥臂一直在做高频切换),另一桥

臂是互为相反的50HZ方波。timer2的后分频比是1:5,表格里有40个脉冲宽度,SPWM的周期是50US。主程序的

while循环里是做过压和欠压保护以及过流和短路保护的。50HZ的方波里也加入1ms死区时间(烧H桥与这个时间

太长有关吗)。下面是程序,帮忙看看,谢谢啊~~


#include
#define LED_CTRL_PORT   RA2 ////////////////
#define SD_OUT_PORT    RB6 ////////////////

#define SD_IN_PORT    RB0
#define LEFT_UP_CTRL_PORT  RB1
#define LEFT_DOWN_CTRL_PORT  RB2
#define RIGHT_UP_CTRL_PORT  RB3
#define RIGHT_DOWN_CTRL_PORT RB5
#define HZ50_PORT_MASK   0x06 //RB1,RB2
#define SPWM_PORT_MASK   0x28  // RB5 ,RB3
#define SD_IN_PORT_MASK   0x01  // RB0
#define LED_PORT_MASK   0x04  // RA2
#define SD_OUT_PORT_MASK  0x40 //RB6 ////////////////
#define VOL_PROTECT_NUM   1000
#define CUR_PROTECT_NUM   500


#define FM_CTRL_PORT   RB4
  
__CONFIG(0xFF72);

unsigned char  LeftUpCtrlNum=0,LeftDownCtrlNum=1;
unsigned char  VoltageProtect=0,CurrentProtect=0;
unsigned int PortectNum=0;
volatile unsigned char SinNum=0;

static unsigned char SinTab[]={8,24,39,54,68,83,96,110,122,134,145,
        

155,164,172,179,185,189,193,195,197,
        

197,195,193,189,185,179,172,164,155,
        

145,134,122,110,96,83,68,54,39,24,8};

void interrupt timer1() 

 if(TMR1IF==1)
 {
  TMR1IF=0;
  TMR1H=0xEC;
  TMR1L=0x77;
  //50HZ 死区时间  start
  LeftUpCtrlNum++;
  if(LeftUpCtrlNum==9)
  {
   LEFT_UP_CTRL_PORT=0;
  }
  else if(LeftUpCtrlNum==20)
  {
   LeftUpCtrlNum=0;
   LEFT_UP_CTRL_PORT=1;
  }

  LeftDownCtrlNum++;
  if(LeftDownCtrlNum==11)
  {
   LEFT_DOWN_CTRL_PORT=1;
  }
  else if(LeftDownCtrlNum==20)
  {
   LeftDownCtrlNum=0;
   LEFT_DOWN_CTRL_PORT=0;
  }
  //50HZ 死区时间  end
  //过流或短路保护  start
  PortectNum++;
  if(CurrentProtect)
  {
   if(PortectNum==CUR_PROTECT_NUM)
   {
    PortectNum=0;
    LED_CTRL_PORT=~LED_CTRL_PORT;
    FM_CTRL_PORT=~FM_CTRL_PORT;
   }
  }
  if(VoltageProtect)
  {
   if(PortectNum==VOL_PROTECT_NUM)
   {
    PortectNum=0;
    LED_CTRL_PORT=~LED_CTRL_PORT;
    FM_CTRL_PORT=~FM_CTRL_PORT;
   }
  }
  //过流或短路保护  end

 }
 //占空比调整
 if(TMR2IF==1)
 {
  TMR2IF=0;
  SinNum++;
  if(SinNum>=40)
  {
   SinNum=0;
  }
     CCPR1L=SinTab[SinNum];
  T2CON=0x24;
 }

}
main(void)
{
 unsigned int i;
 unsigned char ADCResult;
 INTCON=0;
 TRISA=0xff;
// TRISB=0xff;

 ADCON1=0x04;
 ADCON0=0x81;

 TRISA&=~(LED_PORT_MASK);
 TRISB=SPWM_PORT_MASK | SD_IN_PORT_MASK ;

 T1CON=0x00;
 TMR1H=0xEC;
 TMR1L=0x77;
 TMR1IF=0;
 T1CON=0x01;

 PR2=0xf9;
    CCP1CON=0x8C;          //10001100;
    CCPR1L=SinTab[0];
 PWM1CON=0x19;
 TMR2IF=0; //Timer2 中断标志位清零
 T2CON=0x24; //0010 0100预分频1,后分频5,使能timer2


 PIE1=0x03;
 INTCON=0xC0;
 TRISB&=~SPWM_PORT_MASK;

 FM_CTRL_PORT=0;
 LED_CTRL_PORT=1;
 SD_OUT_PORT=0;

 LEFT_UP_CTRL_PORT=1;
 LEFT_DOWN_CTRL_PORT=0;


while(1)
{
 if(!VoltageProtect)
 {
  i=50;
 
  while(i>0)
   i--;
  ADCON0|=0x04;
  while(ADCON0&0x04);
  ADCResult=ADRES;
  //电池电压检测
  if(ADCResult<0x28 || ADCResult >0x42)
  {
   PortectNum=0; 
   VoltageProtect=1;
   FM_CTRL_PORT=1;
   LED_CTRL_PORT=0;
   SD_OUT_PORT=1;
   TRISB |=(SPWM_PORT_MASK|HZ50_PORT_MASK);
  }
 }
 //过流或短路保护信号检测
 if(!VoltageProtect && !SD_IN_PORT)/////////////////////
 { 
  PortectNum=0; 
  CurrentProtect=1;

  FM_CTRL_PORT=1;
  LED_CTRL_PORT=0;
  SD_OUT_PORT=1;
  TRISB |=(SPWM_PORT_MASK|HZ50_PORT_MASK);
 }
};
}

全部回复(21)
正序查看
倒序查看
wells89
LV.1
2
2012-06-10 08:52
我把高频桥臂的驱动信号也改为50HZ的方波,就不会烧管子了。那是不是可以说明之前的SPWM波不对,导致直通发生,烧了管子?
0
回复
2012-06-12 08:30
@wells89
我把高频桥臂的驱动信号也改为50HZ的方波,就不会烧管子了。那是不是可以说明之前的SPWM波不对,导致直通发生,烧了管子?
脉冲周期的长度在哪里表示,烧上管还是下管,什么调制方式。
0
回复
2012-06-12 09:30

最好先不开机,把驱动波形调好,看一下驱动波形之间的时序是否对,如果对,再开机如果还烧毁只能说上了强电有问题。现在不知道驱动波形错误烧毁的,还是加强电之后干扰所至啊

0
回复
wells89
LV.1
5
2012-06-12 20:22
@westkinger
脉冲周期的长度在哪里表示,烧上管还是下管,什么调制方式。

PR2=0xf9就表示脉冲周期是20us。我的驱动信号是类似下面的。 

烧的是AB管

0
回复
2012-06-12 20:27

真好.会程式

0
回复
wells89
LV.1
7
2012-06-12 20:28
@afei_hefei
最好先不开机,把驱动波形调好,看一下驱动波形之间的时序是否对,如果对,再开机如果还烧毁只能说上了强电有问题。现在不知道驱动波形错误烧毁的,还是加强电之后干扰所至啊

A是左上方的管子,B是左下方的管子,C是右上,D是右下。开机之前,我测了AB,CD的波形是互补的,并都有死区时间的。怎么确定A和D之间的时序是否对啊,我用示波器的一个通道测A,一个通道测D,A是低频的嘛,波形可以保持不动,但D的波形一直在动,怎么固定啊(呵呵 这个问题好低级哦) 

0
回复
wells89
LV.1
8
2012-06-12 20:30
@廊桥星辰
真好.会程式

就是寄存器的读写,只会些简单的,复杂的就出问题了,哎

0
回复
2012-06-12 22:06
@wells89
PR2=0xf9就表示脉冲周期是20us。我的驱动信号是类似下面的。[图片] 烧的是AB管

A、B管是双极性调制,C、D管却是工频调制,好像搞乱了。

双极性调制应该是是没有工频的。

 

如果是单极性调制方式,就是死区的问题了,无他。

 

还有一个可能是电感不够大,导致电容里面的电回流到下管。

0
回复
afei_hefei
LV.5
10
2012-06-13 09:55
@wells89
A是左上方的管子,B是左下方的管子,C是右上,D是右下。开机之前,我测了AB,CD的波形是互补的,并都有死区时间的。怎么确定A和D之间的时序是否对啊,我用示波器的一个通道测A,一个通道测D,A是低频的嘛,波形可以保持不动,但D的波形一直在动,怎么固定啊(呵呵这个问题好低级哦) 

结合你以上给的图,时序基本正确,注意的是:D管开通时,是A做的SPWM,B是取反做续流的。AB之间的死区有多少?你的桥管用的什么器件,是IGBT还是MOS。输入的高压有多少?

0
回复
wells89
LV.1
11
2012-06-13 19:28
@afei_hefei
结合你以上给的图,时序基本正确,注意的是:D管开通时,是A做的SPWM,B是取反做续流的。AB之间的死区有多少?你的桥管用的什么器件,是IGBT还是MOS。输入的高压有多少?
AB死区时间是5us;用的是IRFP460,是MOSFET。高压是375V左右。我又检查了下电路,发现有个元件焊错了~~。我再试下,我只有晚上有时间,结果得好几天后出来,谢谢你的持续关注啊~~。
0
回复
afei_hefei
LV.5
12
2012-06-14 09:30
@wells89
AB死区时间是5us;用的是IRFP460,是MOSFET。高压是375V左右。我又检查了下电路,发现有个元件焊错了~~。我再试下,我只有晚上有时间,结果得好几天后出来,谢谢你的持续关注啊~~。

死区时间是够了,检查一下电路如果没有错误,可能和米勒电容有关系了。特别是烧高频侧管

0
回复
pads2005pcb
LV.7
13
2012-12-07 15:00
@wells89
就是寄存器的读写,只会些简单的,复杂的就出问题了,哎

楼主,你好,我正在整SPWM程序,想跟你讨论下,麻烦您加下我QQ,谢谢

QQ:2591307978

在线等您

0
回复
teckey_zuo
LV.1
14
2013-01-17 15:35

 别那么麻烦啦,有更好用的MCU,开发工具便宜,不需要烧入器都可以下载程序到Flash里边

英飞凌 XC822 XC836  ,带硬件乘法器和除法器,看附件的波形。

有需要支持的发站内消息哟。

0
回复
yinxiangtuo
LV.5
15
2013-01-17 16:05
求SPWM函数……
0
回复
1179300092
LV.8
16
2013-01-20 09:29
@yinxiangtuo
求SPWM函数……
0
回复
jql393
LV.3
17
2013-02-13 23:29
@1179300092
[图片]

我看了下楼主的程序 你的50HZ怎么控制SPWM高频波形的?那里可以突出

你看看我这里的图1 图2  图3

图1——就是你说的那样,可是程序里面没看到怎么写的,你就单单实现了SPWM波和50HZ如何做到同步控制的?我不明白。

图2——就是单极性调制很成熟了,在这个程序思路上国内很多同行都在不断更新。

图3——就是你现在的波形的大概,实现了SPWM波形,和50HZ,还差一步就是做到,在你50HZ一个周期里面翻转SPWM型,那样你就实现了。   

0
回复
793238981
LV.1
18
2013-02-26 21:56
@jql393
我看了下楼主的程序你的50HZ怎么控制SPWM高频波形的?那里可以突出你看看我这里的图1图2 图3图1——就是你说的那样,可是程序里面没看到怎么写的,你就单单实现了SPWM波和50HZ如何做到同步控制的?我不明白。图2——就是单极性调制很成熟了,在这个程序思路上国内很多同行都在不断更新。图3——就是你现在的波形的大概,实现了SPWM波形,和50HZ,还差一步就是做到,在你50HZ一个周期里面翻转SPWM型,那样你就实现了。[图片] [图片] [图片] 
 我做的单极性的 为什么波形会变成这样 好奇怪 在零点 几乎是一条直线 求高手指导一下
0
回复
旅行车
LV.4
19
2013-04-09 14:21
芯片正在输出SPWM波,这时,中断来了,SPWM压栈,执行中断子程序,中断执行完毕,SPWM出栈继续执行,于是H桥炸了。
0
回复
jiangyan_91
LV.1
20
2013-04-13 12:27

你的成功了没有,我也弄了一个软件产生的SPWM。用的是STC单片机,单片机路SPWM是正常的,但是我驱动不了H桥。驱动用的是IR2101, 

0
回复
2013-04-20 22:29

调试的时候先断开上BUS+的电啊 直接看上上下管的GS波形  不断的开关电源多次,看有没有直通。

0
回复
lilaben
LV.2
22
2013-04-22 16:59
@jiangyan_91
你的成功了没有,我也弄了一个软件产生的SPWM。用的是STC单片机,单片机路SPWM是正常的,但是我驱动不了H桥。驱动用的是IR2101, 
我也想用stc做一个,不知道你用stc是哪个型号的?c语言还是汇编?
0
回复