TA的每日心情 | 开心 2019-11-4 13:48 |
---|
签到天数: 14 天 连续签到: 1 天 [LV.3]偶尔看看II
|
H桥(全桥)驱动器在驱动有刷直流电机等负载方面非常流行,并且已广泛用于机器人技术和工业中。使用H桥驱动器的主要优点是:高效率,旋转方向变化和制动电动机。在本文/视频中,我介绍了使用四个IR3205功率MOSFET和两个IR2104 MOSFET驱动器的完整的H桥DC电动机驱动器。从理论上讲,上述MOSFET可以处理高达80A的电流,但是,实际上,如果使用大型散热片或风扇将MOSFET的温度保持在尽可能低的水平,我们可以期望获得高达40A的电流。
电路分析图1显示了H桥直流电动机驱动器的示意图。显而易见,电路的核心是两个IR2104 MOSFET驱动器芯片。
图1 H桥直流电机驱动器示意图
我选择了4个IR3205 [1]进行切换。该MOSFET具有良好的特性,这是该应用必不可少的,RDSon电阻非常低,并且具有高电流处理能力。根据IRF3205数据表:“高级HEXFET?International RectIFier的功率MOSFET利用先进的处理技术来实现每硅面积的极低导通电阻。这项优势与HEXFET功率MOSFET众所周知的快速开关速度和坚固耐用的器件设计相结合,为设计人员提供了一种非常有效和可靠的器件,可广泛用于各种应用中。TO-220封装普遍适用于所有功耗约为50瓦的商业工业应用。 我选择了两个IR2104 [2]驱动MOSFET。根据IR2104的数据表:“ IR2104(S)是高压,高速功率MOSFET和igbt驱动器,具有相关的高端和低端参考输出通道。专有的HVIC和锁存免疫CMOS技术可实现坚固的单片结构。逻辑输入与低至3.3V逻辑的标准CMOS或LSTTL输出兼容。输出驱动器具有高脉冲电流缓冲级,旨在最小化驱动器交叉导通。浮动通道可用于驱动工作在10至600伏特高压侧的N通道功率MOSFET或IGBT。” 关于IR2104的好消息是该芯片既兼容3.3V逻辑电平又兼容5V逻辑电平。图2显示了该芯片的基本接线图。显然,芯片和负载(电动机)的电源不必相同,但是,两个电源共用一个公共地。
图2 IR2104 MOSFET驱动器芯片的接线图
C1,C3,C4,C5,C6,C7和C9已用于降低噪声。R1和D2,R2和D3,R3和D8,R4和D9已被用于抑制在MOSFET的ON / OFF时电感器和电容器可能引入的振铃和寄生效应。别忘了MOSFET在其栅极引脚上引入了电容。1N4148二极管使栅极电容器放电。 D4,D5,D6和D7 [3]用于抑制直流电动机的反向电流尖峰。内部反向Shotkey二极管已嵌入MOSFET中,但是,使用这些外部Shotkey二极管也可以减小内部二极管上的应力。根据数据表和应用要求选择C2,C8,D1和D10。 P1是5针XH连接器,用于将芯片的电源和控制信号施加到板上。K1是KF45电源连接器,用于将电动机和电动机的电源线连接到板上。
[B] PCB布局图3显示了H桥直流电动机驱动器的PCB布局。它是2层PCB板,所有组件封装均为通孔。
图3 H桥直流电机驱动器的PCB布局
图4从顶部和底部显示了PCB板的3D视图。
图4电路板顶部和底部的3D视图
我没有IR2104 [4]和IRF3205 [5](组件库)的原理图符号和PCB示意图。因此,我使用了SamacSys组件库,并使用SamacSys altium Designer插件安装了缺少的库(图5)。SamacSys为几乎所有著名的电子设计软件提供了插件(图6)。有趣的是,所有服务都是免费的,图书馆遵循IPC标准。只是您需要下载并使用自己喜欢的CAD插件[6]。另一个选择是从componentsearchengine.com下载库并导入它们。
图5 SamacSys Altium插件中的选定组件
图6 SamacSys插件支持的电子设计CAD软件
阻焊剂并未完全覆盖高电流的走线。这使您可以通过焊接或使用一些粗铜线来加强轨道。图7显示了这些部分暴露的轨道。
图7部分暴露的高电流PCB走线
[C]组装与测试图8显示了组装好的单元,图9显示了测试环境。我已将Arduino Uno编程为控制电机驱动器板。另外,我在原型板上构建了一个简单的键盘,以便能够更改速度(使用PWM)和电动机的旋转方向。
图8组装好的H桥直流电动机驱动器
图9直流电动机驱动器板,Arduino Uno和测试台!
所有按钮均为低电平有效,并使用Arduino的内部上拉电阻。您可以考虑以下Arduino代码: - #include <JC_Button.h>
- int PWM_Value;
- byte Enable_Pin = 13;
- byte PWM1_Pin = 11;
- byte PWM2_Pin = 10;
- byte PWM_Pin = 11;
- Button UP(9, 25, true, true);
- Button Down(8, 25, true, true);
- Button Left(7, 25, true, true);
- Button Right(6, 25, true, true);
- void setup() {
- pinMode(Enable_Pin, OUTPUT);
- pinMode(PWM1_Pin, OUTPUT);
- pinMode(PWM2_Pin, OUTPUT);
- UP.begin();
- Down.begin();
- Left.begin();
- Right.begin();
- digitalWrite(Enable_Pin, LOW);
- PWM_Value = 0;
- analogWrite(PWM1_Pin, PWM_Value);
- analogWrite(PWM2_Pin, PWM_Value);
- }
- void loop()
- {
- digitalWrite(Enable_Pin, HIGH);
- UP.read();
- Down.read();
- Left.read();
- Right.read();
- if (UP.wasReleased() && PWM_Value < 250)
- {
- PWM_Value +=5;
- }
- if (Down.wasReleased() && PWM_Value > 5)
- {
- PWM_Value -=5;
- }
- if (Left.wasReleased())
- {
- PWM_Pin = PWM1_Pin;
- analogWrite(PWM2_Pin, 0);
- }
- if (Right.wasReleased())
- {
- PWM_Pin = PWM2_Pin;
- analogWrite(PWM1_Pin, 0);
- }
- analogWrite(PWM_Pin, PWM_Value);
- }
[color=rgb(51, 102, 153) !important]复制代码
原理图
代码
- #include <JC_Button.h>
- int PWM_Value;
- byte Enable_Pin = 13;
- byte PWM1_Pin = 11;
- byte PWM2_Pin = 10;
- byte PWM_Pin = 11;
- Button UP(9, 25, true, true);
- Button Down(8, 25, true, true);
- Button Left(7, 25, true, true);
- Button Right(6, 25, true, true);
- void setup() {
- pinMode(Enable_Pin, OUTPUT);
- pinMode(PWM1_Pin, OUTPUT);
- pinMode(PWM2_Pin, OUTPUT);
- UP.begin();
- Down.begin();
- Left.begin();
- Right.begin();
- digitalWrite(Enable_Pin, LOW);
- PWM_Value = 0;
- analogWrite(PWM1_Pin, PWM_Value);
- analogWrite(PWM2_Pin, PWM_Value);
- }
- void loop()
- {
- digitalWrite(Enable_Pin, HIGH);
- UP.read();
- Down.read();
- Left.read();
- Right.read();
- if (UP.wasReleased() && PWM_Value < 250)
- {
- PWM_Value +=5;
- }
- if (Down.wasReleased() && PWM_Value > 5)
- {
- PWM_Value -=5;
- }
- if (Left.wasReleased())
- {
- PWM_Pin = PWM1_Pin;
- analogWrite(PWM2_Pin, 0);
- }
- if (Right.wasReleased())
- {
- PWM_Pin = PWM2_Pin;
- analogWrite(PWM1_Pin, 0);
- }
- analogWrite(PWM_Pin, PWM_Value);
- }
[color=rgb(51, 102, 153) !important]复制代码
|
|