[外设讨论] 我看有人对无刷电机感兴趣 正好最近在摸索 分享一下

bxrclipz-avatar

bxrclipz

2022-08-03T16:02:26+00:00



笔者纯理工男一枚, 从事行业其实和数字化、代码、算法之类没有什么关系. 后来因为一些机缘巧合接触了 python 和数据分析, 埋头猛学了一段时间之后, 算是在公司里站住了脚, 有了更多的时间来发展自己的一点兴趣爱好.

我自己在学完 py 后也做过一点树莓派的各种小车项目 (组装、驱动、巡线、简单 CV 之类的). 在这个过程中遇到的一个大问题就是“动力” : 树莓派本身最多只能输出 5V, 还有电流上的限制. 一旦要让马达、舵机这种 “大家伙” 动起来, 就需要各种接线、接驱动, 还需要买专门的驱动板等等不一而足. 但是当时还没有很透彻地了解这些驱动的含义, 只是知道 这么接线它就能动, 就能控制它——更多的时间还是放在了通信和网页界面交互上

前段时间看到了 B 站稚晖君的各种项目, 心生向往, 其中我最感兴趣的不是他的自行车和机械臂, 反而是稍早一些的的 “FOC驱动板“. 这个号称双路 100A 的家伙一开始着实吓了我一跳. 如果有那么一点编程基础, 稍微知识迁移一下就能感觉到这个驱动器才是虚拟和现实的桥梁, 是底层的关键.

所以不知不觉就开始对无刷电机产生了兴趣. 虽然现在还不能理解那些公式的推演过程, 也就无从从头开始编写自己的 FOC 算法, 但是网上一找, 也发现了不少现成的产品. 不如先 “拿来主义” 一番, 让电机先跑起来, 搞清楚了整体流程之后再转攻算法本身.

因此这里做一个在 FOC 驱动无刷电机方面的探索的记录, 希望能帮到和我一样完全摸不到门路的小白入门. 文章整体上会避免公式, 反正网上相关的资料一抓一大把. 更多的是侧重 “手艺活” 本身, 让大家能够把无刷电机 “转起来”.

整体流程

本来这里想先写 “术语和概念” 但是感觉这么写又枯燥还会吓跑一大批人, 所以还是先理一下整体的思路和流程, 让大家有一个全局的认识, 然后我们再各个击破.

既然是一个软硬结合的项目, 那么就需要准备相关的硬件、软件, 并且能有机得将它们连接起来. 那么我们就看看硬件、软件分别需要什么东西, 以及串联起来的流程大概是什么样的:

硬件

对这些概念比较熟悉或者觉得太长的也可以跳到小结部分查看脱水版.

无刷电机

既然是 FOC 驱动无刷电机, 那么当然首先要有一个无刷电机啦. 不过淘宝上随便一搜都是几千个条目, 要怎么选择呢?

答案是, 我们可以利用无刷电机的 `kv` 值来进行初步的选择. 虽然这个标准非常粗糙和不“正统”, 但是我们主要是先让电机转起来嘛. 建立一个初步的感性认识可以在初期少走很多弯路 (血泪教训).

另外, 需要注意我们会用 FOC 来驱动无刷电机, 因此要求电机的输入为 3相, 也就是三根线. 千万不要买只有两根线的电机, 它们需要其他的方式来驱动.


[quote]所谓的 `kv` 值, 并不是 千伏特, 不要被吓到, 而是说电机电压每升高 1v, 电机每分钟能多转多少圈. 比如一只 `kv100` 的电机, 那么我加上 `12v` 的电压, 则理论上其转速为 `1200 rpm` . 就是这么简单. 另外还有一个参数是电机的外型尺寸, 如 `2804`, `2212` 等, 前两位数为电机直径, 后两位数为电机转子高度. 这几个值越大, 一般对应的力气也就越大; 越小的虽然安全一些, 但是太小了操作起来不方便, 动起来之后也没有啥成就感.[/quote]对于初学者, 我建议选择小 `kv` (100, 两三百) , 小电流 ( 1.5 A以下 )的云台电机作为入门. 而大 `kv` (动辄大几百上千的), 大电流 (几十安) 的航模电机, 虽然转起来很爽很暴力, 但是一方面其价格高, 另一方面它们的电流很大 (发热), 力气也很大 (速度快), 刚入门控制不好还是有点危险的.

简单来说, 我推荐的电机参数为: 150kv 及以下, 12V, 1.5A或以下, 尺寸 2804、2808、4008、4010 的云台电机, 照着这个搜就可以了. 比如:

[img]https://img.nga.178.com/attachments/mon_202208/12/c4Q2q-9739K1yT3cSq0-ec.jpg[/img]


[img]https://img.nga.178.com/attachments/mon_202208/12/c4Q2q-gmsjK2fT3cSp9-du.jpg[/img]

这种也是可以的.


驱动板

看完了无刷电机, 会发现这些大家伙都需要一定的电压和较大的电流才能驱动 (一般空载电流很小, 稍微加点负载电流就上来了). 所以需要一个既能保持大电流输出, 又能接受控制信号调整电流的东西, 这个东西就是驱动板或者驱动电路了. 具体的原理我们可以先跑起来再去深入研究.

既然是 FOC驱动, 那么就要找对应的 FOC 驱动板. 网上很多教程都尝试写明白背后的基本原理, 再进行电路上的设计. 不过我们是小白分享, 原理这一块晚一点搞, 先看看怎么选择驱动板.

FOC 的驱动板, 目前看到比较有名的开源项目主要是 `simplefoc` 和 `odrive` 这两家. 开源, 就意味着谁都可以做, 充分竞争的市场也会让价格降下来. 我们在这两款里面选一款就可以了

[quote]这里需要注意的是, 驱动板是驱动板, 开发板是开发板, 这两个很有可能是两样东西. 驱动板只负责接受信号并通过实际物理量 (如电流、电压) 控制电机. 而开发板一般指单片机, 通过不同的程序能做不同的事情, 只是这里为驱动无刷电机专门开发了一套程序烧录在这些单片机上而已. 如果仔细看稚晖君的视频, 就会发现, 他设计过层叠式的主板, 上层为单片机, 下层为驱动层, 就是这个道理.[/quote]我们选择的 `simplefoc` 或者 `odrive` 开发板, 其实是项目开发者和商家, 为了大家使用方便, 而将驱动电路和控制芯片, 集成到一张 pcb 板上的结果. 所以大家也可以理解为这两个开源项目和对应的硬件就是一个封装好的“轮子”, 可以直接拿来使用, 省去了很多硬件开发方面的工作, 对小白也友好一些.

某宝上的 `simplefoc` 和 `odrive` 开发板也是非常多的. 一般来说 `simplefoc` 价格便宜, 但是能驱动的电流也小, `odrive` 价格高不少, 但是散热好的情况下就可以做到双路 100A 的大电流! 大家按自己情况选择就可以了

下图是灯哥开源双路 simplefoc 的板子, 可以看到这就是双层设计, 上层为 ESP32 芯片开发板并且可以拆下来 (当然烧录了对应的程序), 下层就是纯的驱动电路了
[img]https://img.nga.178.com/attachments/mon_202208/12/lhQ2q-85m5K26T1kShs-dv.jpg.thumb.jpg[/img]

而这个 simplefoc 的板子, 也用的是 ESP32 芯片, 但是就只能焊在板子上取不下来了.
[img]https://img.nga.178.com/attachments/mon_202208/12/lhQ2q-4yqzZbT1kSgf-f8.jpg.thumb.jpg[/img]

odrive 原版是长这样的, 比较细长, 上面留出了很多必要的 io 口用来和传感器通信. 使用 stm32 的芯片来编写功能

[img]https://img.nga.178.com/attachments/mon_202208/12/lhQ2q-dvboZx.jpg[/img]


这张图则是 灯哥的另一个 odrive 作品, 对原版的 odrive 接口进行了大幅改良, 就变成了很小巧的样子, 而且长得就很像稚晖君的驱动了. 当然有一些接口是省掉了和有变化, 这种就比较适合知道自己想要什么的用户了

[img]https://img.nga.178.com/attachments/mon_202208/12/lhQ2q-bakwZdT3cSi3-g1.jpg.thumb.jpg[/img]

对于驱动板的选择, 我个人的推荐是选一款体积稍大一些的 simplefoc 板来入门就可以了. 因为首先 simplefoc 的价格要低很多, 另外因为不需要做高度集成, 体积大一些的板子反而要便宜 (类似 ATX主板和 ITX 主板), 同时大体积意味着接口会更丰富不会捉襟见肘, 对初学者接线走线也更清晰. 便宜的一百不到应该能搞定.


开发板

在上面的驱动板环节, 我们已经提到了开发板. 而且知道只要买了 `simplefoc` 或者 `odrive` , 它们的开发板和驱动板是放在一起的, 所以这一节就不谈怎么选开发板, 而是简单介绍一下两者的区别.

现在国内最流行的单片机开发环境就是 `stm32` 和 `esp32` 两种吧 (还有 `stm8` 和 `esp8266` , 可以视为一种简化、低级版本, 当然还有更便宜的 51 或者 Atmega 系列等等), 而 `simplefoc` 和 `odrive` 恰好两家都用到了, 所以选任意一条路走通了都是不亏的. 而 `stm32` 的相关库比较复杂, 初学者我还是推荐 `esp32` 系列作为开发首选.

注意 `esp32` 开发板的原生开发环境为官方的 `esp-ipf` 这个用起来可一点都不比 `stm32` 的 `HAL` 简单…… 不过就跟 PC 可以装 Windows, 也可以装 Linux 一样, `esp32` 还支持 `Arduino` 的环境开发, 这个就厉害了, 因为 `Arduino` 基于 `wiring` 这个框架, 很多语法都做了比较好的封装, 初学者要上手就非常简单了. 另一方面, `esp32` 默认自带 Wi-Fi 和蓝牙通信模块, 稍微设置一下就可以不用和主机连线也能远程控制了, 也是吸引大家的重要因素.

下图从左至右分别展示了 `esp32-cam`, `esp32`, `stm32 robomaster` 这几种开发板. 它们的核心都是 esp32 或者 stm32 芯片, 但是因为引脚引出的方式不同、连接的外围设备不同, 也就变成了不同版本的开发板. 如果还想做深入的相关学习的, 就要去找对应的开发教程啦, 这里就不赘述了.

[img]https://img.nga.178.com/attachments/mon_202208/12/lhQ2q-7e4zZbT3cSj3-e7.jpg.thumb.jpg[/img]

磁编码器

虽然我们有了电机和驱动器, 但是要实现闭环控制还少了一个反馈机构. 这部分的任务一般会交由磁编码器来实现.

[quote]所谓闭环控制, 就是将 控制 - 反馈 组成一个封闭的循环. 反馈机构不断将环境和状态信息回传给电脑, 而电脑接收到这个反馈后, 会根据与目标的误差做出响应, 然后将这种响应计算后转换为控制机构需要执行的操作. 常见的闭环控制比如 PID 算法[/quote]磁编码器听起来有点神秘, 不过原理还是比较简单的. 简单说就是一种能感应磁场变化的芯片, 我们一般会在电机底部粘一个径向磁铁 (买磁编码器的时候顺带买了). 电机转动的时候, 底部的磁铁方向不断变化, 就能让磁编码器记录这种变化, 进而得到例如: 电机位置、电机角速度、电机角加速度等等信息. 拿到这些信息后, 如果和我们的预期有误差, 就可以通过程序来驱动电机达到我们想要的目标了.

对于 `simplefoc` 和 `odrive` 并不是所有类型的磁编码器都可以. 国外的型号可能有点冷僻, 不过国内我看到的案例, 多半都是使用 `AS5600` 和 `AS5047` 这两种编码器.

下图是 AS5600 磁编码器
[img]https://img.nga.178.com/attachments/mon_202208/12/lhQ2q-e6oyK1yT3cSna-le.jpg[/img]

需要注意的是, AS5600 编码器, 并不支持 ABI、SPI 传输方式, 因此它是不能在 `odrive` 上运行的
而 AS5047p 分辨率要高一些, 设置上也简单一些, `odrive` 和 `simplefoc` 是都可以用的, 如下图
[img]https://img.nga.178.com/attachments/mon_202208/12/lhQ2q-55c0K1rT3cSn4-lg.jpg[/img]

我们需要将磁传感器通过对应的接口连接到单片机上. 同时, 我们还要用特定的程序去读取传感器传来的数据, 不过接线方式和读取数据的操作, 我们可以晚一些看. 这里就是介绍需要买这么个东西.

外围设备

核心的部分讲完了, 但是我还是给外围设备单开了一小节. 因为我发现网上很多教程都是默认你懂这些, 就和你部署网站一样, 教程都默认你懂 Linux 的各种命令, 上来直接上手…… 可是臣妾是真的不懂啊…… 因为不懂, 所以在电路连接的时候踩了不少坑, 交了不少学费, 这里还是单独拿出来说一下.

**电池**

电机要转当然需要电, 根据手册要求最好还是 12V 直流电 (DC), 那我们就要能提供 12V DC. 而开发板一般需要接入 5V DC, 根据需要有些时候还要转 3.3V DC. 幸好我们选择的 simplefoc 和 odrive 开发板, 12V ~ 24V 转 5V、3.3V 的工作别人已经做好了 (是的, 输入电压甚至是一个范围) , 但是这个 12V DC 要从哪里来呢?

这里我们可以选择 4S (一种规格) 的航模电池, 或者专门的 DC 电源.

之所以你不能找几个 18650 的锂电池电芯直接串起来, 是因为首先我们涉及到的电流还是比较大的 (即使是云台电机), 锂电池没有电源管理的情况下是比较危险的 (电解质放电过快容易晶体析出刺破隔膜造成短路, 危险!). 航模电池有电池管理芯片并且多采用锂聚合物电池 (LiPo), 能降低很多风险.

4S 的航模电池, 满电情况下电压一般为 16.8V 会比12V 高一些, 不过不要紧, 一般电机本身能够承受这个电压 (而且电路上有压降的) , 而驱动电路很多都是 12-24 V 自适应的, 也会帮你处理好供电的事情.

当然了, 既然选择了电池, 就涉及到充电的问题. 所以你还需要给这些电池一个充电装置. 一般卖电池的地方就会卖充电器, 留意不要漏买就行.

另外, 还有一个可选项需要注意的是. 由于涉及到的元器件电流比较大, 配置不好容易出现抖动、过热的情况. 因此还建议给电池配个开关, 或者电路上装个开关. 一旦有紧急情况, 直接关掉开关就行, 也不会手忙脚乱了.

**电源**

电源的选择会多很多.

有服务器拆机电源或者就是服务器电源, 输出 12 V 上百 A 都是小意思, 价格还便宜. 缺点就是只能输出固定的几个档位的电压

[img]https://img.nga.178.com/attachments/mon_202208/12/lhQ2q-jfnlKwToS5n-98.jpg[/img]

也可以选择专门的大电流稳压电源, 几个旋钮调整一下, 0-36V 电压任君选择, 电流也可以做到大几十安上百安. 价格当然会贵一些, 而且体积和重量也都是有一些的

[img]https://img.nga.178.com/attachments/mon_202208/12/lhQ2q-9u4pKvToS6l-8n.jpg[/img]

如果有闲钱, 当然还可以上数字电源, 比如网红产品 `MDP-M01` + `MDP-P906` 数字电源套装. 其特点是小巧便携, 输出的电压、电流稳定, 分辨率高, 响应也非常快, **而且能直接用 type-c 充电器供电**! 数字电源价格高低往往和最大输出功率强相关, 当然这些数字电源往往还有些花活, 比如串联加电压, 并联加电流, 电源模块无线连接设置等

电源因为可以设置输出电流大小, 等于在输出端限定了最大的电流, 相对要安全得多. 另外很多电源还有防短路、防反接等功能, 安全性会更高一些.

**接线、接口**

这个对于初学者还是可以留意一下的, 否则经常会出现大件都买好了, 然后发现线接不起来, 然后又要回头去买线. 折腾半天邮费花得比线还多就有点不值得了. 所以这里对无刷电机用到的各种线也简单介绍一下

接在电机上的线可以看作是负载线路, 主要要求一定的截面积以保证承载足够的电流. 这个一般电机厂商会帮我们做好, 这里按下不表. 下图右侧的电机可以承受 40 A 的电流, 和左侧的 10A 铝芯比较一下

[img]https://img.nga.178.com/attachments/mon_202208/12/lhQ2q-5rknZgT1kSej-fu.jpg[/img]

之后复杂一些的则是各种信号接口. 对于初学者, 也不用把什么端口、端子、信号想得那么神秘, 说白了都是在这截导线上快速做电路开关动作, 哪怕你是 100 kHz, 1 MHz 甚至更高, 原理上都是快速开断电路而已. 信号线路需要的电流非常小, 一般都以毫安计. 所以线粗一点细一点都不要紧, 由于线材会产生压降, 因此长距离线路、抗干扰差的线路, 就尽量用铜线就可以了. 一般的距离, 铜线、铝线都没啥大碍, 实在不行铁线也行, 但是可能就会发热了, 还更容易受到磁场干扰.

常见的接口则是有以下这么几种, 买的时候一定要看仔细, 多问, 同时别忘了连接线是有两头的, 两头的情况都要问, 也要看自己手头的零件是不是能对应起来. 别买回来只能接上一头的线, 也是非常的尴尬.

下图的是电调连接器, 常见的可以对应 XT60 接口

[img]https://img.nga.178.com/attachments/mon_202208/12/lhQ2q-13klKiT1kSa2-7q.jpg.thumb.jpg[/img]

下图的这种接头是 XT插头, 一般用于航模上. 我们的场景下, 一般用 XT60、XT30的粗细就可以了. 注意公母搭配
[img]https://img.nga.178.com/attachments/mon_202208/12/lhQ2q-cabjKpToS7n-6a.jpg[/img]

当然, 我们的电机是三相输入的, 所以如果想省事快速插拔, 或者开发板上的也是三孔的, 那就是 MR30 接头了. 对应的电机的线就要焊到这个接头上.
[img]https://img.nga.178.com/attachments/mon_202208/12/lhQ2q-2bkyK19T1kSe5-ae.jpg.thumb.jpg[/img]

然后是杜邦线, 这个太有名了, 网上搜搜就知道是啥了. 而且很多电路板上的排针, 也是按照这个宽度排列开的, 还有面包板上的插孔都是按照这个粗细排布, 就不用担心排错位. 需要注意的是, 杜邦线也是分公母头的, 也要按需选择
[img]https://img.nga.178.com/attachments/mon_202208/12/lhQ2q-e88cKmToS5u-8b.jpg[/img]

然后是 XH 接头, 看起来会大一点, 我们的项目里面用的少

[img]https://img.nga.178.com/attachments/mon_202208/12/lhQ2q-goqkK2kT1kSha-g3.jpg[/img]

项目里用得多的还有这种 GH1.25 接头, 要注意这种接头带锁紧扣, 不容易掉. 当然公母要成对
[img]https://img.nga.178.com/attachments/mon_202208/12/lhQ2q-govdK1sT1kSf2-dj.jpg[/img]

还有一种不带锁紧扣的, 要看仔细了. 否则两边高度不一样, 是不能兼容的
[img]https://img.nga.178.com/attachments/mon_202208/12/lhQ2q-3j1oK1kT1kSds-ct.jpg[/img]

最后的最后, 考虑到有些线、设备拿回来的时候, 这些接头可能并不是恰好成对的, 那么还要考虑是否买一把电烙铁 + 焊锡 + 吸锡带 来焊接一些线材.

小结

说了这么多, 硬件部分终于可以告一段落, 这里简单总结一下. 最后会提供一个思维导图方便快速整理思路:
  • 无刷电机. 选择 kv 小, 电流小的云台电机. 2204、2208、4008 这几种外观尺寸都可以
  • 驱动板 + 开发板, `simplefoc` 或者 `odrive` 任选一款. `simplefoc` 对应 `ardunio` 平台, `odrive` 对应 `stm32` 平台, `simplefoc` 一般是小电流 (也有大电流的, 比较贵), `odrive` 可以做到双路100A. 一般买回来是驱动板和开发板一体的.
  • 12V 或者 24V DC 电池/电源, 取决于你的电机规格.
  • 各种接线, 电机的、信号的; 各种接头, 香蕉头、XT30、MR30、GH1.25 等不一而足, 一定要看清楚、多问, 同时别忘了线材两端的接头都要匹配上
  • 辅助设备, 包括但不限于 电烙铁、焊锡、吸锡带. 这个名单可以很长: 热风枪、加热台、示波器、台钳、锡膏…… 甚至小型 3D 打印机和 CNC雕刻机. 这里也是看大家个人的选择就可以了.

前面硬件部分讲了许多, 但是总结起来其实就这么几条. 只是不得不多介绍一点防止大家踩坑.

(软件、组装部分编辑中)
GoobeyGoobs-avatar

GoobeyGoobs

“无刷电机”这个讲得有点大了 除了一些廉价儿童玩具外 能见到的电机几乎都是无刷的
可以再研究一下伺服电机步进电机之类 可玩性应该更高一些
babymole-avatar

babymole

挺好的,支持分享