资源描述
L298N驱动步进电机发热的问题探讨
L298N是ST公司生产的一种高电压、大电流电机驱动芯片。主要特点是:工作电压高,最高工作电压可达46V;输出电流大,瞬间峰值电流可达3A,持续工作电流为2A;额定功率25W。内含两个H桥的高电压大电流全桥式驱动器,可以用来驱动直流电动机和步进电动机、继电器线圈等感性负载,是很多爱好者喜欢使用的一个驱动电路。
但是,L298N在实际使用中很多人反映发热现象严重,经常烧管子。通过分析原因并多次试验,初步得出了L298N发热原因,并给出解决方案。
一、L298N发热原因
首先,L298N瞬间峰值电流可达3A,持续工作电流为2A,压降可达1V,本身消耗的功率就很大,其散热片普遍比较小,易造成发热现象。驱动小电机或者电流较小的步进电机,尚不明显;而满电流驱动就会造成发热。
其次,一些步进电机直流内阻很低,甚至可以低到零点几欧姆,好多L298N板子没有恒流控制,易造成超负载现象。我直接用来驱动23KM-K383-G2V步进电机,即便5V供电,十几秒钟就感觉L298N很热了,一直很苦恼。
二、解决办法
必要的办法当然是增加降温风扇了,这个不多叙。无意之中看到步进电机斩波恒流驱动原理,考虑用Arduino的PWM输出模拟斩波恒流,通过适当参数调整,即便不是闭环控制,也能把电流控制在一定程度上,确保不超过2A电流也许能解决这个问题。于是开发了一个小程序,通过数字3口输出10khz的波形,通过赋值OCR2B改变占空比,数字3口接L298N的使能端,见图。
程序参考有关同学作品,多谢,具体如下。另说明一下:PWM频率、占空比的参数需要自行调整,以适应步进电机的转速和力矩,占空比小电机力矩小,带不动设备;占空比太大电流控制不住,L298n继续发烧。这个参数与电压、驱动电流、电机内阻等都有关系,此方法仅供参考。
int Pin0 = 8;
int Pin1 = 9;
int Pin2 = 10;
int Pin3 = 12;
int _step =0 ;
boolean dir = false;//正反转
int stepperSpeed = 5;//电机转速,5ms一步
void setup()
{
pinMode(Pin0, OUTPUT);
pinMode(Pin1, OUTPUT);
pinMode(Pin2, OUTPUT);
pinMode(Pin3, OUTPUT);
pinMode(11, OUTPUT);
pinMode(3, OUTPUT);
TCCR2A = _BV(COM2A0) | _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
TCCR2B = _BV(WGM22) | _BV(CS22) | _BV(CS20);
OCR2A = 22;//about 5khz
OCR2B = 14;
}
void loop()
{
switch(_step){
case 0:
// stepperSpeed++;
digitalWrite(Pin0, LOW);
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, HIGH);//32A
break;
case 1:
digitalWrite(Pin0, LOW);
digitalWrite(Pin1, HIGH);//10B
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, HIGH);
break;
case 2:
digitalWrite(Pin0, LOW);
digitalWrite(Pin1, HIGH);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, LOW);
break;
case 3:
digitalWrite(Pin0, LOW);
digitalWrite(Pin1, HIGH);
digitalWrite(Pin2, HIGH);
digitalWrite(Pin3, LOW);
break;
case 4:
digitalWrite(Pin0, LOW);
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, HIGH);
digitalWrite(Pin3, LOW);
break;
case 5:
digitalWrite(Pin0, HIGH);
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, HIGH);
digitalWrite(Pin3, LOW);
break;
case 6:
digitalWrite(Pin0, HIGH);
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, LOW);
break;
case 7:
digitalWrite(Pin0, HIGH);
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, HIGH);
break;
default:
digitalWrite(Pin0, LOW);
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, LOW);
break;
}
if(dir){
_step++;
}else{
_step--;
}
if(_step>7){
_step=0;
}
if(_step<0){
_step=7;
}
delay(stepperSpeed);
}
展开阅读全文