发 帖  
原厂入驻New
[资料]

【开源设计】H桥PWM直流电动机驱动器(原理图、代码)

2020-9-15 14:55:42  784 PWM 直流电动机 驱动器
分享
H桥(全桥)驱动器在驱动有刷直流电机等负载方面非常流行,并且已广泛用于机器人技术和工业中。使用H桥驱动器的主要优点是:高效率,旋转方向变化和制动电动机。在本文/视频中,我介绍了使用四个IR3205功率MOSFET和两个IR2104 MOSFET驱动器的完整的H桥DC电动机驱动器。从理论上讲,上述MOSFET可以处理高达80A的电流,但是,实际上,如果使用大型散热片或风扇将MOSFET的温度保持在尽可能低的水平,我们可以期望获得高达40A的电流。
电路分析
图1显示了H桥直流电动机驱动器的示意图。显而易见,电路的核心是两个IR2104 MOSFET驱动器芯片
1(1).jpg

图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代码:
  1. #include <JC_Button.h>

  2. int PWM_Value;
  3. byte Enable_Pin = 13;
  4. byte PWM1_Pin = 11;
  5. byte PWM2_Pin = 10;
  6. byte PWM_Pin = 11;
  7. Button UP(9, 25, true, true);
  8. Button Down(8, 25, true, true);
  9. Button Left(7, 25, true, true);
  10. Button Right(6, 25, true, true);
  11. void setup() {
  12. pinMode(Enable_Pin, OUTPUT);
  13. pinMode(PWM1_Pin, OUTPUT);
  14. pinMode(PWM2_Pin, OUTPUT);
  15. UP.begin();
  16. Down.begin();
  17. Left.begin();
  18. Right.begin();
  19. digitalWrite(Enable_Pin, LOW);
  20. PWM_Value = 0;
  21. analogWrite(PWM1_Pin, PWM_Value);
  22. analogWrite(PWM2_Pin, PWM_Value);
  23. }
  24. void loop()
  25. {
  26. digitalWrite(Enable_Pin, HIGH);
  27. UP.read();
  28. Down.read();
  29. Left.read();
  30. Right.read();
  31. if (UP.wasReleased() && PWM_Value < 250)
  32. {
  33. PWM_Value +=5;
  34. }
  35. if (Down.wasReleased() && PWM_Value > 5)
  36. {
  37. PWM_Value -=5;  
  38. }
  39. if (Left.wasReleased())
  40. {
  41. PWM_Pin = PWM1_Pin;
  42. analogWrite(PWM2_Pin, 0);
  43. }
  44. if (Right.wasReleased())
  45. {
  46. PWM_Pin = PWM2_Pin;
  47. analogWrite(PWM1_Pin, 0);
  48. }
  49. analogWrite(PWM_Pin, PWM_Value);
  50. }
复制代码
原理图
代码



  1. #include <JC_Button.h>

  2. int PWM_Value;
  3. byte Enable_Pin = 13;
  4. byte PWM1_Pin = 11;
  5. byte PWM2_Pin = 10;
  6. byte PWM_Pin = 11;
  7. Button UP(9, 25, true, true);
  8. Button Down(8, 25, true, true);
  9. Button Left(7, 25, true, true);
  10. Button Right(6, 25, true, true);
  11. void setup() {
  12. pinMode(Enable_Pin, OUTPUT);
  13. pinMode(PWM1_Pin, OUTPUT);
  14. pinMode(PWM2_Pin, OUTPUT);
  15. UP.begin();
  16. Down.begin();
  17. Left.begin();
  18. Right.begin();
  19. digitalWrite(Enable_Pin, LOW);
  20. PWM_Value = 0;
  21. analogWrite(PWM1_Pin, PWM_Value);
  22. analogWrite(PWM2_Pin, PWM_Value);
  23. }
  24. void loop()
  25. {
  26. digitalWrite(Enable_Pin, HIGH);
  27. UP.read();
  28. Down.read();
  29. Left.read();
  30. Right.read();
  31. if (UP.wasReleased() && PWM_Value < 250)
  32. {
  33. PWM_Value +=5;
  34. }
  35. if (Down.wasReleased() && PWM_Value > 5)
  36. {
  37. PWM_Value -=5;  
  38. }
  39. if (Left.wasReleased())
  40. {
  41. PWM_Pin = PWM1_Pin;
  42. analogWrite(PWM2_Pin, 0);
  43. }
  44. if (Right.wasReleased())
  45. {
  46. PWM_Pin = PWM2_Pin;
  47. analogWrite(PWM1_Pin, 0);
  48. }
  49. analogWrite(PWM_Pin, PWM_Value);
  50. }
复制代码


16
分享淘帖 显示全部楼层
· 2020-9-15 21:41:46
程序能打包上传一下吗
· 2020-9-17 08:25:04
不错不错厉害
· 2020-9-17 14:20:07
感谢楼主无私分享,谢谢

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发资料
关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表