1、L298N驱动步进电机发热的问题探讨 L298N是ST公司生产的一种高电压、大电流电机驱动芯片。主要特点是:工作电压高,最高工作电压可达46V;输出电流大,瞬间峰值电流可达3A,持续工作电流为2A;额定功率25W。内含两个H桥的高电压大电流全桥式驱动器,可以用来驱动直流电动机和步进电动机、继电器线圈等感性负载,是很多爱好者喜欢使用的一个驱动电路。 但是,L298N在实际使用中很多人反映发热现象严重,经常烧管子。通过分析原因并多次试验,初步得出了L298N发热原因,并给出解决方案。 一、L298N发热原因 首先,L298N瞬间峰值电流可达3A,持续工作电流为2A,压降可达1V,本身消
2、耗的功率就很大,其散热片普遍比较小,易造成发热现象。驱动小电机或者电流较小的步进电机,尚不明显;而满电流驱动就会造成发热。 其次,一些步进电机直流内阻很低,甚至可以低到零点几欧姆,好多L298N板子没有恒流控制,易造成超负载现象。我直接用来驱动23KM-K383-G2V步进电机,即便5V供电,十几秒钟就感觉L298N很热了,一直很苦恼。 二、解决办法 必要的办法当然是增加降温风扇了,这个不多叙。无意之中看到步进电机斩波恒流驱动原理,考虑用Arduino的PWM输出模拟斩波恒流,通过适当参数调整,即便不是闭环控制,也能把电流控制在一定程度上,确保不超过2A电流也许能解决这个问题。于是开发了
3、一个小程序,通过数字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 st
4、epperSpeed = 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);
5、 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,
6、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: digit
7、alWrite(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:
8、 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;
9、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); }






