【单片机】DIY无刷电机驱动器 1

【单片机】DIY无刷电机驱动器 1参考文章 机械自动化 BLDC 驱动器 ESC 控制直流无刷电机和控制直流有刷电机的最大区别有两点 1 有刷直流电机使用用两个驱动桥臂 无刷直流电机需要使用三个驱动桥臂 2 有刷直流电机使用碳刷换相 无刷直流电机需要外部控制换相 这里为了简化 没有使用霍尔传感器以及参考文章中介绍的反电势法 BEMF 原理进行换相检测 这里使用的方法是 猜 猜 法很简单 就是我觉得该换相了 就

参考文章:《【机械自动化】BLDC驱动器ESC》。

控制直流无刷电机和控制直流有刷电机的最大区别有两点:

1、有刷直流电机使用用两个驱动桥臂,无刷直流电机需要使用三个驱动桥臂。

2、有刷直流电机使用碳刷换相,无刷直流电机需要外部控制换相。

这里为了简化,没有使用霍尔传感器以及参考文章中介绍的反电势法(BEMF)原理进行换相检测,这里使用的方法是“”,“”法很简单,就是我觉得该换相了,就换相,如果换相快了,转子跟不上就会抖动,如果换相慢了,转子会跟着转得慢而已,那么就控制换相速度稍微慢点就行了。

核心电路图如下:【单片机】DIY无刷电机驱动器 1

上图中使用的是PMOS加NMOS组成单个桥臂,PMOS的缺点是内阻较NMOS大,所以可能会发热较严重,但是控制方便,使用一个小的NMOS或者NPN三极管就可以驱动,但是如果上桥臂的MOS管使用NMOS的话,正常工作的时候NMOS的漏极电压会很高,导致栅极需要更高的电压才能导通NMOS,这时候需要比较复杂的控制电路或者半桥栅极驱动器IC(如IR2104STRPBF)完成这个功能。我的实验电机不需要很高的电流,这里还是选择了控制简单的PMOS作为上桥臂。但是注意电路中的R12、R13、R14在实际焊接的时候使用1K或者0欧,这样会让Vgs的绝对值较大,这时候MOS管的内阻Rds会较小,驱动电流大,MOS管自身发热量小,但是如果电机的工作电压很大的话(12V、24V),需要适当调整R12、R13、R14的大小,防止Vgs的值过大烧坏MOS管,具体值参考MOS管的数据手册,这里我使用的是集成PMOS+NMOS管的AO4606或者AO4616芯片:

【单片机】DIY无刷电机驱动器 1

PCB打样回来了:

【单片机】DIY无刷电机驱动器 1

焊接完3相桥臂和IO接口:

【单片机】DIY无刷电机驱动器 1

与3D模型对比:

【单片机】DIY无刷电机驱动器 1

电路板上面的是MCU部分,没有使用,直接把IO_A1、IO_A2、IO_B1、IO_B2、IO_C1、IO_C2使用排针引出来,直接使用开发板测试就行了,懒得焊接。

IO_A1、IO_A2、IO_B1、IO_B2、IO_C1、IO_C2是分别控制三个桥臂的信号,注意IO_X1和IO_X2信号不可以同时为高,否则会导致桥臂短路,容易烧坏MOS管,同时在程序中最好先将为0的信号先设置为0,然后再设置不为0的信号,这样可以避免短路。同时为了可以精确控制,所有IO_X1和IO_X2信号都是使用PWM驱动,因为我想实现类似步进电机的功能,可以精确控制无刷电机的转动角度。

无刷电机的换相顺序如下图,一周期总共需要6次换相,分为6个状态,分别为导通顺序分别为AB、AC、BC、BA、CA、CB,按道理软件上只要这样的换相顺序就能让电机转动。

【单片机】DIY无刷电机驱动器 1

PWM通道设置以及测试代码:

volatile unsigned int *A1 = &TIM1 ->CCR3; volatile unsigned int *A2 = &TIM1 ->CCR2; volatile unsigned int *B1 = &TIM3 ->CCR4; volatile unsigned int *B2 = &TIM3 ->CCR2; volatile unsigned int *C1 = &TIM3 ->CCR1; volatile unsigned int *C2 = &TIM14->CCR1; 
 //设置所有桥臂为无输出。注意IO_X1和IO_X2信号不可以同时为高, //否则会导致桥臂短路,容易烧坏MOS管,同时在程序中最好先将为0的 //信号先设置为0,然后再设置不为0的信号,这样可以避免短路。 *A1 = 0; *A2 = 0; *B1 = 0; *B2 = 0; *C1 = 0; *C2 = 0; #define INTERVAL 5 //换相间隔时间 #define PWM1 255 //上桥臂PWM占空比,为了防止产生“共振”现象,设置一端的PWM //占空比为100%或者0%,调整另一端的PWM占空比大小。 #define PWM2 100 //下桥臂PWM占空比 //处于t0状态,并维持一段时间,保证可靠处于t0状态 printf("Ready\r\n"); { //t0:AB *C1 = 0; *C2 = 0; *A2 = 0; *A1 = PWM1; *B1 = 0; *B2 = PWM2; } delay_ms(1000); //进入换相主循环 printf("Start\r\n"); while(1) { { //t0:AB printf("t0:AB\r\n"); *C1 = 0; *C2 = 0; *A1 = PWM1; *A2 = 0; *B1 = 0; *B2 = PWM2; } delay_ms(INTERVAL); { //t1:AC printf("t1:AC\r\n"); *B1 = 0; *B2 = 0; *A1 = PWM1; *A2 = 0; *C1 = 0; *C2 = PWM2; } delay_ms(INTERVAL); { //t2:BC printf("t2:BC\r\n"); *A1 = 0; *A2 = 0; *B1 = PWM1; *B2 = 0; *C1 = 0; *C2 = PWM2; } delay_ms(INTERVAL); { //t3:BA printf("t3:BA\r\n"); *C1 = 0; *C2 = 0; *B1 = PWM1; *B2 = 0; *A1 = 0; *A2 = PWM2; } delay_ms(INTERVAL); { //t4:CA printf("t4:CA\r\n"); *B1 = 0; *B2 = 0; *C1 = PWM1; *C2 = 0; *A1 = 0; *A2 = PWM2; } delay_ms(INTERVAL); { //t5:CB printf("t5:CB\r\n"); *A1 = 0; *A2 = 0; *C1 = PWM1; *C2 = 0; *B1 = 0; *B2 = PWM2; } delay_ms(INTERVAL); } 

测试结果电机可以正常转动,且扭矩还不错(和电流大小有关,一开始R12、R13、R14焊接的是10K导致电流不足,转动不流畅),通过调整PWM1PWM2可以调整相电流大小,为了防止产生“共振”现象,就是由于使用PWM控制时,当A桥臂的上桥臂为1时,B桥臂的下桥臂正好为0,这时候是没有电流的,这种重叠的时间最大可以是整个周期都是重叠的,这时候虽然两边的PWM占空比都大于零,但是产生了谐振降低了驱动电流,解决办法为设置一端的PWM占空比为100%或者0%,调整另一端的PWM占空比大小,例如这里我将PWM1设置成255,调整PWM2来调整驱动电流大小即可。通过调整INTERVAL的值改变转动速度,但是INTERVAL太小的话电机抖动,这时候就是没有使用霍尔传感器或者反电势法(BEMF)的最大缺点了。暂时不会做gif图:

【单片机】DIY无刷电机驱动器 1

这套电路可以很方便地改成启动那个带霍尔传感器的无刷电机,直接将霍尔传感器的三个信号接到单片机的IO口,根据霍尔信号进行换相,而不是使用延时进行换相即可,一般带霍尔无刷电机接线如下图:

【单片机】DIY无刷电机驱动器 1

但是这里还没有用到PWM的真正功能,就是平缓换相过程,也是角度控制功能。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/177848.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午6:37
下一篇 2026年3月26日 下午6:37


相关推荐

  • candump命令_生成dump文件命令

    candump命令_生成dump文件命令hexdump以ASCII、十进制、十六进制或八进制显示文件内容。

    2026年2月8日
    5
  • axios 跨域问题_为什么会出现跨域问题

    axios 跨域问题_为什么会出现跨域问题什么是跨域首先需要了解到浏览器的同源策略,同源策略是最核心也是最基本的安全功能,缺少同源策略浏览器的正常功能可能会受到影响。同源策略会阻止一个域的javascript脚本和另外一个域的能容进行交互。同源(即指在同一个域)就是两个页面具有相同的协议(protocol)、主机(host)和端口号(port)。当一个请求url的协议、域名、端口三个之间任意一个与当前页面url不同即为跨域。Vue中用Axios解决跨域问题配置代理可解决使用Axios不能直接进行跨域…

    2025年10月31日
    4
  • OpenAI 发布 AI 智能体 Operator,能像人类一样自主操控浏览器,有哪些技术亮点?

    OpenAI 发布 AI 智能体 Operator,能像人类一样自主操控浏览器,有哪些技术亮点?

    2026年3月13日
    4
  • verilog调用vhdl模块_verilog和vhdl哪个更好

    verilog调用vhdl模块_verilog和vhdl哪个更好初学FPGA,记录一些个人的探索历程和心得。本文的初衷是为了验证VHDL和Verilog文件互相调用功能。以一个简单的二选一选择器为例,分别用两种方法实现功能。一、用Verilog文件调用VHDL以Verilog文件为顶层文件,调用VHDL模块,testbench为Verilog文件。1、新建project2、编写.vhd文件,FPGA_VHDL.vhd,文件名与模块名称一致;3、编写FPGA_Verilog.v文件,文件名与模块名称一致,且设为top文件。4、编写testbench文件

    2026年2月8日
    6
  • java生成二维码,自定义宽高和边框大小

    java生成二维码,自定义宽高和边框大小下面封装的两个方法 url 地址是 http 开头的要不然浏览器没办法直接跳转宽高都是一个数 wh 边框 margin0 是没有边框 1 是最小边框返回值 BufferedImag 类型的数据 调用第二个方法 respImageBuf 下载到浏览器 paramurl 链接内容 paramwh 宽高 parammargin 边框大小 return publicBuffer

    2026年3月18日
    2
  • 电脑表格制作教程入门_教你入门新手了解电脑配置知识教程

    电脑表格制作教程入门_教你入门新手了解电脑配置知识教程在选购电脑的时候 如果自己啥都不懂 也不会看电脑配置 那就只能听导购员的说辞 这种情况下很容易被坑 那么作为新手如何了解电脑配置知识呢 下面小编就分享下新手了解电脑配置知识教程 型号怎么看 CPU 是一台电脑的核心 而目前笔记本市场基本被 Intel 英特尔 的 CPU 垄断 而 Intel 的 CPU 型号命名还算比较有规律 以 i7 6920HQ 为例 四位数的头一个数字是 6 指的是代际 也就是是英特尔第六代处理器

    2026年3月26日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号