Link

支持的单片机

Arduino SimpleFOClibrary支持:

通常现成且能用Arduino IDE的设备,少许小修改就能够完成库的移植…😃

选择单片机

尽管 SimpleFOC库 支持许多单片机,并且所有这些都将与大多数无刷直流电机+无刷直流驱动器+传感器组合工作,但它们的性能不一样。我们在这里列出了比较表,助你快速选型你需要的单片机。

这是不同种类单片机PWM特性实现的比较:

MCU2路PWM模式4路PWM模式3路PWM模式6路PWM模式pwm频率配置
Arduino (8-bit)✔️✔️✔️✔️❌ (32kHz)
Arduino DUE✔️✔️✔️✔️
stm32✔️✔️✔️✔️✔️
esp32✔️✔️✔️✔️✔️
esp8266✔️✔️✔️✔️
samd21/51✔️✔️✔️✔️✔️
teensy✔️✔️✔️✔️
Raspberry Pi Pico✔️✔️✔️✔️✔️
Portenta H7✔️✔️✔️✔️
nRF52✔️✔️✔️✔️✔️

从这个表格中你可以看到,如果你的应用程序需要6路PWM模式,你应该避免使用Teensy和Arduino DUE板。

尽管库支持上表中的所有MCU(甚至更多),并且所有这些mcu都将与大多数无刷直流电机+无刷直流驱动器+传感器组合一起工作,但它们的性能其实不尽相同。因此,这里是一个快速指南,告诉你如何快速选择使用哪个MCU。

板子系列loopFOC() + move() - 编码器loopFOC() + move() - 磁传感器 SPIloopFOC() + move() - 磁传感器I2C
HMBGC V2.2Arduino 8-bit800us (ipr = 0), ~10ms (ipr > 10000)(doesn’t support SPI)1100us
Arduino UNOArduino 8-bit800us (ipr = 0), ~10ms (ipr > 20000)1200us~1000us
BluepillSTM32200us (ipr = 0), ~1ms (ipr > 50000)300us~1000us
Nucleo-64STM32100us (ipr = 0), ~500us (ipr > 50000)200us~1000us
Arduino DUEArduino SAM200us (ipr = 0), ~800us (ipr > 50000)300us~1000us
ESP32 D1 R32ESP32100us (ipr = 0), ~500us (ipr > 50000)200us~1000us
Teensy3.1Teensy200us (ipr = 0), ~800us (ipr > 50000)300us~1000us
Nano 33SAMD21200us (ipr = 0), ~800us (ipr > 50000)300us~1000us

*Ipr =每秒中断回调

在上表中,你可以比较不同MCU的FOC循环的执行时间。当你决定使用哪个MCU与你的项目,请确保你的循环执行时间 loopFOC() + move(),在最坏的情况下,不能大于3-4ms。为了获得最佳性能,循环时间应该小于2ms。如果你需要通过一个控制板控制多个电机,还需要考虑多个电机的情况。

各型MCU架构对电流检测的支持如下表所示:

MCU在线电流检测低压侧电流检测高压侧电流检测
Arduino (8-bit)✔️
Arduino DUE✔️
stm32 (in general)✔️
stm32f1 系列✔️✔️(单电机)
stm32f4 系列✔️✔️(单电机)
stm32g4 系列✔️✔️(单电机)
stm32 B_G431B_ESC1✔️✔️
esp32✔️✔️
esp8266
samd21✔️✔️(单电机)
samd51✔️
teensy✔️
Raspberry Pi Pico✔️
Portenta H7✔️
nRF52✔️

多数开发板将会支持在线电流检测模式,esp32, samd21和 stm32 B_G431B_ESC1开发板初步支持低端电流检测模式。

现成的云台控制器

如果你没有高的动力要求,现成的云台控制器是运行FOC算法与你的云台电机最简单便宜的方案。它们能完美支持位置/速度控制。但是也有缺点,主要就是它们使用了所有外部中断引脚以生成PWM信号,因此导致引脚不足,你通常没有多余的引脚做外部控制。这意味着,即使你只需要一个电机(3路PWMs),你仍然不能使用ABI编码器。如果你想要将编码器使用在这些板,你只能用到软件中断。软件中断虽然也能让这些编码器跑起来,但是会降低其响应能力。所以,IIC和SPI编码器相对于ABI编码器有时更适合用在这些电机上面。

所以,买之前最好确保你的云台控制器有你需要的通信接口引脚。

Arduino MCUs

Arduino设备,如UNO,MEGA,NANO,可能是最常见的单片机。因此用这些单片机去跑SFOC库估计比其他单片机的步骤要少很多,也简洁很多。但是有一点需要注意,如果你想使用Arduino设备运行这个库,我肯定会建议你考虑使用磁传感器而不是编码器。编码器是非常低效的传感器(至少在Arduino UNO和MEGA里面是这样),由于需要不断计算编码器的中断信号,这必然会导致影响FOC算法的运行效率。

Arduino UNO/MEGA在编码器CPR上的经验法则

对于Arduino UNO,最大脉冲数每秒不超过20,000。在这个值之后,它开始有执行问题。 请在选择编码器时考虑到这一点,特别是如果一个主控带多个电机时。

例如

如果你的CPR值是10000,因为着测得准的最大转速为120转 - 即2转/秒

此外,Arduino UNO只有两个编码器中断引脚,如果你在Arduino UNO上运行两个带有编码器的电机,你将必须使用软件中断回调,这将增加额外的执行时间。Arduino MEGA有6个中断,你应该不会有这个问题。

这个库将使你使用Arduino UNO/MEGA作为你的FOC大脑,你仍然可以用甚至带有两个电机的它做很多很酷的东西。如果你在使用编码器,请注意经验法则。

STM32 设备

Stm32设备可能是实现FOC的单片机里的最佳选择。它们非常强大,有许多外部中断引脚。它们不会因为计数而失去太多的性能,而且循环时间间隔短,这使得FOC算法可以跑得很流畅。Stm32 Bluepill可以运行4个无刷直流电机而Nucleo-64甚至可以运行6+个。

开源社区里用STM32问题是32的编程比较复杂。但由于现在32也是可以用Arduino的,所以这应该也不算是一个问题了。Arduino SimpleFOClibrary的代码和STM32的代码实际上是完全一致的,只是有些接口不一样,因此,如果你想用32实现SFOC不失也为一个上乘主义。😃

Arduino SimpleFOCShield从1.3.1版本的开源板起,板子硬件上完全兼容STM32 Nucleo-64设备,你甚至能堆叠2个电机开源板在Nucleo板上。

ESP32 设备

对于运行这个库,ESP32设备是非常有趣的选择。它们有极好的通信接口,并且能提升用户和电机的交互。理论上讲,ESP32设备能够同时运行4个无刷直流电机。而且它们的性能会比传统Arduino设备好得多。特别是它们没有外部中断限制的问题。

在使用ESP32板进行实时电机控制时,存在两个主要问题。

  • ESP32板最初不是为精确的实时控制任务而设计的,它们有特殊的通信能力,因此有时你会因为这个事实而遇到一些奇怪的问题。但在99%的情况下,这个板子会表现得非常好,只有当你想将其发挥到极限时,奇怪的事情才可能发生。
  • 这个板的另一个问题是引脚限制。如果你是ESP32的新手,请务必观看这个YouTube视频。在启动时,为了使ESP32正常启动,一些GPIOs必须处于特定的上拉/0位状态。但一旦你习惯了,这并不是一个大问题!

这个板有很多优势,相信未来我们会看到更多它在实时电机控制领域的应用。

SimpleFOC社区

如果你已经将库移植到另一个设备上,或者你正在寻找移植到某些特定的设备上的帮助,不要犹豫,在社区论坛发布消息。

参与讨论对于开发是很有帮助的,你可能会发现很多问题已有答案!