IR2104驱动H桥 场效应管严重发热?
http://cache.amobbs.com/bbs_upload782111/files_32/ourdev_576721.JPG(原文件名:armok01165343.JPG)
如上图,我用ir2104驱动H桥场效应管,irf460,电机为250W电动三轮车电机额定电压24V,电池为24V,7.5A,不知为什么正反转没问题,就是场效应管全都发热,且下桥最热,已烧掉一个.(当然正反转时电流大也可能,场效应管功率不足也可能),请大大们指点!!!
驱动顺序如下:A2 A4先给高电平,A1 A3先给低电平,2ms 后A1给高电平, A3给低电平, 管子的Rds=0.22Ω,Vdss=500V,Vdgr=500V用在这不大合适,管子内阻大,电机的电流也不小。
下桥最热是因为给占空比低,主要是下桥在续流
换IRF3205之类的试试吧 可irf3205是to 220封装,不知引角受的了吗?
还有我的电容用的是0.2uf的是不是小了点
,电源用不用加个1000uf的电解电容,15V至地要不加个1uf电解电容. STP75n75怎么样内阻 0.013Ω,VD 75V,75A http://cache.amobbs.com/bbs_upload782111/files_32/ourdev_576766.jpg
(原文件名:20100821(003).jpg)
电源加1000uf电解电容,电机加40uf100V 起动电容,场效应管换成60N90(900V 60A),驱动电容换成2.2uf,结果同上,长时间运行发热严重,
只有一个半桥的上桥不热... 2104的死区时间内部已经确定400ns 这个没办法改了
你这个60N90好像挺贵不要这么大的吧最多就100V的管子就够了 75n07就走够了再在mos管ds做个吸收电路
还有你那个ir2104的自举电容太小了3脚关断脚吧 还有MOSFET的gs要加电阻一般10K左右吧 楼主看看这个图.估计你会知道原因了.
http://cache.amobbs.com/bbs_upload782111/files_32/ourdev_576774.jpg
(原文件名:QQ截图未命名.jpg) http://cache.amobbs.com/bbs_upload782111/files_32/ourdev_576786.JPG
(原文件名:armok01165343.JPG)
这样改行吗?请问IGBT管与场效应管驱动有什么驱别吗?
实验了一下,加上10k电阻效果不明显,好像将3角在不工作时关断有一点效果,关于吸收电路还未加(不知加二极管不还是阻容的好,如果加多大好) 你就那么点电压用的着igbt吗 你看rc不行了就做成rcd电路 谢谢,今天已学到很多拉,明天实验一下!! 应该先置A1和A3的电平,再把A2和A4置高电平。如果按原来的方式先把A2和A4置高电平,这时电机会进入制动状态,工作电流大,电机热,MOS管也热,你可以做个对比实验。 楼主,我用一款mos驱动器做200W BUCK同步斩波的时候,下管也是非常热,一直以为是电路问题,而且MOS驱动器是硬件主动检测MOS的GS电压,判断是否完全关断,再开通另一个mos的,一直对驱动器很放心。后来实在找不出其他问题啦,就去观察两个桥臂的GS波形,结果发现有直通现象,极度郁闷!建议你看看上下桥臂的GS波形,发出来大家看看。
我想说明的是,驱动器说是有死区时间,但是否能真实作用到MOS上,还是波形说了算话!
我是吃够了MOS驱动器的苦头啦。二十多块钱的LT驱动器,主动监测GS电压,不是固定的死区时间的,主动监测GS电压回落到安全值才会开启另一个MOS,还是有问题! 谢谢more指点的是,回去马上实验,
可能否讲一上原理,不是说下桥先要通以便充电吗??????
关下X_BIKE 所述与我同感,下午实验了下加DS加上1n4007,3角接12V反向稳压管后接15V电源(当低于12V自动关闭2104用 ),驱动器仍然发热,换小功率 70W电机好些,但还是发热。
郁闷现在我那有示波器呀!!! 看了看IR2104的规格书,
3脚是SD端子,功能是:Logic input for shutdown,即逻辑电平关闭。也就是低电平时上下两臂MOS关闭,高电平时正常工作。
2脚是信号输入端,接受逻辑电平,输入高电平且SD=1时,高端MOS导通,低端MOS截止;输入低电平且SD=1时,高端MOS截止,低端MOS导通;死区时间则是内定的520ns。
按MORE的指导,应该先给定IN端子电平,然后置SD=1。
从lz的描述及选材来看,我认为MOS选型错误是主要原因。电机我理解是直流电机(lz没说明,我也没见过电动车电机,不过从驱动方式上看,显然是直流电机,希望我没理解错) http://cache.amobbs.com/bbs_upload782111/files_32/ourdev_577023.jpg
(原文件名:T1A0VxXcBjXXaVBdjX_114552.jpg_310x310.jpg)
就是它,直流电机250W 24V的,通减速马力超强。
场效应管试过irf460,G60N90,SPW47N60 各做板一块通实验现像也一样,都是下管热的很,有一个上管不热,余三管都发热。 回复【12楼】dfood
谢谢more指点的是,回去马上实验,
可能否讲一上原理,不是说下桥先要通以便充电吗??????
关下x_bike 所述与我同感,下午实验了下加ds加上1n4007,3角接12v反向稳压管后接15v电源(当低于12v自动关闭2104用 ),驱动器仍然发热,换小功率 70w电机好些,但还是发热。
郁闷现在我那有示波器呀!!!
-----------------------------------------------------------------------
建议更换四个MOS为IRF3205,DS间加1N4007完全没用,建议采用MBR1050即可。其实肖特基作用也不是很大,因为IRF2104是有死区控制的,续流主要靠MOS完成。开关频率应该不高,桥臂主要是起到换向的作用,所以,BST电容1uF应该足够了。BST二极管耐压要足够,如果电机供电电压只有24V的话,那么1N5819应该也可以了。MOS管栅极到HO或者LO端子之间电阻为0即可。
lz可以发SCH文档上来,抽空帮你改改。 由于是新手,板子都是自己热转印的,所以只用CAD做了图,其它还未学。
望能指导!
电容用的2uf,蓝色竖格为场效应管所在位置,所有功率引线加粗。
http://cache.amobbs.com/bbs_upload782111/files_32/ourdev_577029.jpg
(原文件名:PCB2104全桥-Layout2.jpg) 呵呵,精神可嘉,但做法不赞同。如果是我,想要做某件事情,如果必须要学会某样东西,就一定花些时间学会,起码也要入门。
从PCB上看,没有明显错误,性能达不到,主要因素应该还是MOS选型上。还是建议更换为4个IRF3205,栅极电阻改成0(用导线直通就可以了)。 谢谢LDCH指导!! 当SD置0时,上下桥都关闭,这时电机可以靠惯性自由滑动。SD置高以后,如果两个下位管或两个上位管同时导通,那么就相当于短路了电机的两端,电机转动时产生的自感能量会迅速消耗在电机和MOS管上,产生制动的效果,电机热和MOS管热也就不奇怪了,在电动车上使用时应避免这种现象发生。你可以做个简单的实验,用手转动电机的轴,短路电机的两端和断开时的效果差别会很大的。 more说的对,这个情况必须考虑,所以按PCB图上的解法,就会出现这种情况。
另外,IR2104的SD端子的逻辑高电平是要大于3V,接稳压管实现欠压关闭效果不是很好,稳压管的转折特性不够硬。还是按more的要求,去掉稳压管,把SD也接出来通过MCU控制。为确保MCU输出浮空或者连线接触不良的时候不会出现异常情况,IN和SD(2脚和3脚)端子要分别对地接10K下拉电阻比较保险。
还需要注意2脚输入高电平时,应该不能一直高电平,需要一定的占空比来维持Vb电压始终高于Vs,满足上臂MOS导通的需要。 做这类测试时,用个有工作电流显示的电源就比较方便了。可以直观看出你的电路是否正常 more,说的有道理,我再试试,刚试过上管同时导通,当运行时一个下管开,结果下管不热了上管热. 两个sd同时接一个IO口以控制开关
实验结果,大小功率70W蜗杆电机能过,下管仍有微量温升但不烫手,
在大功率250W实验,下管极烫,上管烫手,总体比SD全开时要好些,其马运行上2-3分钟不会烧管。
频率加大到20KHZ左右
电机运行如同more所说,是没有止动拉。。。。
在停机后会转许久才停,。。。。。
总结:1、如LDCH所说是场效应管功率不足
2、如more所说,起动顺序为
SD开
停500us
开一侧上管,下管关
运行
SD关闭。
3、如果需制动sd开,同侧上桥或下桥开即可,这时场效应管很热。 如果只是调速的话PWM频率没必要太高,太高了只会增加MOS管的功耗,一般1K以下就可以了。要想让电机停止的快的话,可以人为地加入制动。驱动250W的电机本身电流就很大了,正常情况下也需要给MOS管加散热片了。 最终实验成功了,半年了不容易呀!!谢谢楼上LDCH和 more等各位大大们帮忙!!
最后是占空比和SD问题,
占空比要在10%以下,太高了场效应管会很热,具体频率可能和电容有关,电容升压电容大的如我的2uf占空比要大些10%,如果是0.2uf可能3%即可.频率不能太高,也不能低1K比较适合,在调试时我试的是充电时间和占空比一样,即10%时间sd开,10%时间上管开,80%时间SD关.结果实验大约十五分钟未见温升.(关于电源如LDCH所说加上滤波电路会很好,如果没有整个1000uf的大电容是必须),如需止动将sd开即可.
再次谢谢大大们! 收藏,收藏,一定收藏 mark mark MARK mark,慢慢学习 学习一下 回顾老贴感慨颇多,首先感谢ldch ,我现在的99se入门拉,下面是汇报成果.
至于实验多年的大功率驱动板,我觉的没有成功的原因有以下几方面:
1\是功率过大在双电机起动时电流过大.一般电池受不了.合计500W,以24V算约20A电流,所以一定要软件分时驱动.相差几百毫秒就行.
2\PWM给的不对,当时是用basicom软延时,几十毫秒一停,很没准,可能造成H桥上下桥短时导通.
3\给IR2104供电的15V电压取自同一电池,在起动时可能达不到15V造成ir2104过热.
现在采用ICC将程序列下,刚转ICC请ldch等大虾请教!!
/******************************************************
器件参数:ATMega8,内部8.0000Mhz
实现功能:ATMega8与电脑串行通讯
现象描述:采用VC上位机控制。
编译环境:ICC-AVR application builder
*******************************************************/
#include <iom8v.h>
#include <macros.h>
/***********宏定义*************/
#defineuchar unsigned char
#defineuint unsigned int
#define fosc 8000000//系统时钟频率
#define baud 9600//串口通讯波特率
uchar FLAG; //按键2标志
uchar PC_COMMAND; //PC发出的当前命令
uchar RX_BUFFER; //存放接收数据的数组
uchar RX_index; //存放接收数据的个数
uint S;
//宏定义
/******************************/
void Delayus(uint J)
{
uint K;
J=J*5/4;
for(K=0;K<J;K++);
//1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
}
/****************************/
void Delayms(uint ms)
{
unsigned int i,j;
for(i=0;i<ms;i++)
for(j=0;j<1141;j++);//1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
}
/*******************************************
函数名称: IO口初始化函数
功 能: 实现IO初始化
参 数: 无
返 回 值: 无
/********************************************/
void port_init(void)
{
PORTB = 0xFF;
DDRB= 0xFF;
PORTC = 0b00001111;
DDRC= 0b11111111;
DDRD =0X02; //RXD输入,TXD输出
PORTD=0XFF;
}
/***********************************************************************
函数名称: 串口初始化函数
功 能: 实现串口初始化
参 数: 无
返 回 值: 无
/*********************************************************************/
void USART_Init(void)
{
UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);//允许收发,打开接收中断
UBRRL=(fosc/16/(baud+1))%256;//设置波特率寄存器
UBRRH=(fosc/16/(baud+1))/256;
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP
UCSRB = 0x98;//允许接收和发送,使能接收中断
}
/*******************************************
函数名称: 串口发送一个字节函数
功 能: 实现串口发送一个字节
参 数: data--串口要发送的一个字节
返 回 值: 无
/********************************************/
void USART_Transmit(uchar data) //发送采用查询方式
{
while(!(UCSRA&(1<<UDRE)));//上次发送有没有完成
UDR=data; //发送数据
}
/*******************************************
函数名称: 串口发送数组函数
功 能: 实现串口发送一个数组
参 数: *ptr--串口要发送的数组的首地址
返 回 值: 无
/********************************************/
void USART_Transmit_string(uchar *ptr)
{
while (*ptr)
{
USART_Transmit(*ptr++);
}
USART_Transmit(0x0D);
USART_Transmit(0x0A);//结尾发送回车换行
}
/*******************************************
函数名称: 串口接收一个字节函数
功 能: 实现串口接收一个字节(数据接收,查询方式)
参 数: 无
返 回 值: 无
/********************************************/
/*uchar USART_Receive(void) //接收采用查询方式
{
while (!(UCSRA & (1<<RXC))); // 等待接收数据
return UDR; //获取并返回数据
}
*/
/*******************************************
函数名称: 串口接收中断函数
功 能: 实现串口接收一个字节(数据接收,中断方式)
参 数: 无
返 回 值: 无
/********************************************/
#pragma interrupt_handler uart0_rx_isr:19
void uart0_rx_isr(void)
{
//uart has received a character in UDR
PC_COMMAND=UDR;
switch(PC_COMMAND)
{
case 'A': //0x30 ASCII '0'
S=1;
break;
case 'B':
S=2;
break;
case 'C':
S=3;
break;
case 'D':
S=4;
break;
case 'Q':
S=5;
break;
}
/*
注意,使用put_s函数发送数据需要一定的时间,如果输入数据的速度过高将会导致数据丢失
所以,一般建议中断服务程序的处理时间尽量的短,只做采集数据和设标志位,命令的处理交由主程序来完成
这里只是示范简单的命令处理
*/
}
/*******************************************
函数名称: 串口接收命令显示函数
功 能: 实现将串口接收的之前的10个命令显示出来
参 数: 无
返 回 值: 无
/********************************************/
void pro_coammand(void) //多字节命令的处理程序
{
unsigned char i;
if (RX_index>=10)
{
UCSRB&= ~(1<<RXCIE); //关断USART接收中断
USART_Transmit(0x0D);
USART_Transmit(0x0A);//发送回车换行
USART_Transmit_string("Hello! 你之前输入的命令列表是:");
for (i=0;i<RX_index;i++) USART_Transmit(RX_BUFFER);
USART_Transmit(0x0D);
USART_Transmit(0x0A);
USART_Transmit(0x0D);
USART_Transmit(0x0A);//发送回车换行
RX_index=0; //清零
UCSRB|= (1<<RXCIE); //打开USART接收中断
}
}
void main(void)
{
port_init();
USART_Init();
S=5;
USART_Transmit_string("前W,后S,左A,右D,停Q");
SEI();//开中断
while(1)
{
switch(S)
{
case 1:
PORTC =0b00111111;
Delayus(1200);
PORTC =0b00011011;
Delayus(800);
break;
case 2:
PORTC =0b00111111;
Delayus(1200);
PORTC =0b00101101;
Delayus(800);
break;
case 3:
PORTC =0b00111111;
Delayus(1200);
PORTC =0b00011101;
Delayus(800);
break;
case 4:
PORTC =0b00111111;
Delayus(1200);
PORTC =0b00101011;
Delayus(800);
break;
case 5:
PORTC =0x00;
break;
}
}
} http://cache.amobbs.com/bbs_upload782111/files_50/ourdev_712026G6CSBM.JPG
电机驱动控制ISP下载板(485通信) (原文件名:1.JPG)
http://cache.amobbs.com/bbs_upload782111/files_50/ourdev_712027E6VRZ5.JPG
16路舵机控制ISP下载板(485通信) (原文件名:2.JPG) 自定义一个PWM格式,有点像 basicom的PLUSE 函数
//ICC-AVR application builder : 2009-3-11 14:28:07
// Target : M8
// Crystal: 8.0000Mhz
#include <iom8v.h>
#include <macros.h>
#defineDK2
#defineCK3
#defineBK1
int temp;
int P;
void port_init(void)
{
PORTB = 0x00;
DDRB= 0x00;
PORTC = 0x00; //m103 output only
DDRC= 0x00;
PORTD = 0x00;
DDRD= 0x00;
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
MCUCR = 0x00;
GICR= 0x00;
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
/************************************
Name :小延时程序
Target :atmega8
Crystal(晶振):4M
************************************/
/*void delay_us(int time)
{ //微秒延时
do
{
time--;
}
while (time>1);
}
*/
void delay_1us(void)
{
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
void delay_us(unsigned int n)
{ //4 M时 微秒延时
unsigned int i=0;
for(i=0;i<n;i++)
delay_1us();
}
/*
void delay_us(int J)
{
int K;
J=J*5/4;
for(K=0;K<J;K++);
//1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
}*/
/**********
void delay()
{
unsigned int i;//最大值65536
for (i=0;i<40000;i++)
{;}
}
***********/
/***********************************************************
用 途:串口发送接收程序
Taget :mega8
crystal :8M
介 绍:
**********************************************************/
//晶振和波特率
#define fosc 4000000
#define baud 2400
//UART初始化函数
void init_uart()
{
UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);//允许收发,打开接收中断
//UBRRL=(fosc/16/(baud+1))%256;//设置波特率寄存器
//UBRRH=(fosc/16/(baud+1))/256;
UBRR=103;//*4M 2400 值
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP
}
//字符输出
void uart_putchar(unsigned char c)
{
while(!(UCSRA&(1<<UDRE)));//上次发送有没有完成
UDR=c;
}
//字符输入
unsigned char uart_getchar()
{
while(!(UCSRA&(1<<RXC))){;}//有没有接收到数据
return UDR;
}
//带回车的字符串输出
int uart_print(char *s)
{
while(*s)
{
uart_putchar(*s);
s++;
}
uart_putchar(0x0a);//回车换行
uart_putchar(0x0d);
return 1;
}
//不带回车换行的字符串输出
void uart_prints(char *s)
{
while(*s)
{
uart_putchar(*s);
s++;
}
}
////PWM 自定义
//pwm()
//?
/* if(i=='B')
{
DDRB|=(1<<a);
PORTB|=(1<<a);
delay_us(b);
DDRB^=(1<<a);
PORTB^=(1<<a);
delay_us(d-b);
};*/
//void dfood_pwm(unsigned int i,int a,unsigned int b,unsigned int d)
void dfood_pwm(unsigned int i,int a,unsigned int b)
{
switch(i)
{
case 1: //0x30 ASCII '0'
DDRB|=(1<<a);
PORTB|=(1<<a);
delay_us(b);
//DDRB^=(1<<a);
PORTB^=(1<<a);
//delay_us(d-b);
break;
case 2:
DDRD|=(1<<a);
PORTD|=(1<<a);
delay_us(b);
//DDRD^=(1<<a);
PORTD^=(1<<a);
//delay_us(d-b);
break;
case 3:
DDRC|=(1<<a);
PORTC|=(1<<a);
delay_us(b);
//DDRC^=(1<<a);
PORTC^=(1<<a);
//delay_us(d-b);
break;
}
}
//}
//接收中断
#pragma interrupt_handler uart_rec_int:iv_USART_RX
void uart_rec_int()
{
unsigned char i;
i=UDR;
switch(i)
{
case 'A': //0x30 ASCII '0'
temp=1;
break;
case 'W':
temp=2;
break;
case 'S':
temp=3;
break;
case 'D':
temp=4;
break;
case 'Q':
temp=5;
break;
case 'K':
if(P!=100)P-=100;
break;
case 'M':
if(P!=2000)P+=100;
break;
}
/* uart_putchar(i);
uart_putchar(0x0a);//回车换行
uart_putchar(0x0d);*/
}
//**************************************************************************
void main()
{
port_init();
init_devices();
init_uart();
P=300;
PORTD=(1<<2);//开串口
uart_print("前W,后S,左A,右B,刹车Q,快K,慢M");
while(1)
{ DDRD=0xff;//设为输出
PORTD=(0<<2);//开串口
switch(temp)
{
case 1:
DDRC=0xff;//设为输出
PORTC=0b00111111;
dfood_pwm(CK,1,P);//c口4,1角输出PWM波
dfood_pwm(CK,4,P);
delay_us(2000-P);//延时时间
break;
case 2:
DDRC=0xff;//设为输出
PORTC=0b00111111;
dfood_pwm(CK,2,P);//c口2,5角输出PWM波
dfood_pwm(CK,5,P);
delay_us(2000-P);
break;
case 3:
DDRC=0xff;//设为输出
PORTC=0b00111111;
dfood_pwm(CK,2,P);//c口4,2角输出PWM波
dfood_pwm(CK,4,P);
delay_us(2000-P);
break;
case 4:
DDRC=0xff;//设为输出
PORTC=0b00111111;
dfood_pwm(CK,1,P);//c口5,1角输出PWM波
dfood_pwm(CK,5,P);
delay_us(2000-P);
break;
case 5:
DDRC=0xff;//设为输出
PORTC=0b00001001;
break;
}
}
} 楼主,我是菜鸟,想用2104做一个MOSFEET的驱动,驱动一个大电机(RS-540SH)标称电压7.2V, 工作电压6-9V
直径35MM, 长50MM, 轴径3.17MM.
重约160克.
空载电压对应转速及电流
3V 子8400转 电流1.30A
4.5V 12400转 电流1.47A
6V 16500转 电流1.60A
7.5V 20800转 电流1.70A
9V 33100转 电流2.50A
我们用的是7.2V的电压,请问应该怎样做啊?麻烦指教一下,最好给个电路图。万分感谢!! mark{:handshake:} mark 标记一下!! 学习了。。。。 有没有加死区? 学习一下 mark mark!!!!!! 这两天在学习H桥,看了楼主的帖子收益良多 ir2104的弊端就是 一个周期内要进行充电操作,如果不利用好SD信号的话,电机会不停的工作在启动,制动情况,直接导致 电机发热. 现在也碰到了类似的问题了 mark,有空学习一下 驱动的问题吧 可以学习学习!!! 学习了! MARK{:smile:}
页:
[1]