安装完整的 SimpleFOClibrary 通过Arduino Library Manager安装最简单的方式是直接通过 Arduino IDE 中的 Arduino Library Manager 获取库。 
打开Arduino IDE, 点击 Tools > Manage Libraries... ,启动 Arduino Library Manager。 搜索 “Simple FOC” 库并安装 最新版本 . 重新打开Arduino IDE,就能在 File > Examples > Simple FOC 中看到库例程。
通过Github安装如果你更倾向于从github仓库直接下载库,请看以下指引。 压缩包下载进入 main 。 首先点击 Clone or Download > Download ZIP 解压下载的压缩包到Arduino Libraries 文件夹( 文件夹路径 Windows: Documents > Arduino > libraries 重新打开Arduino IDE,就能在 File > Examples > Simple FOC 中看到库例程。
电脑终端克隆安装好 SimpleFOClibrary ,准备好所有必须的 硬件 后, 我们就要开始了解驱动电机的Arduino代码。以下是编写程序时的所有重要步骤。 第0步 include库在开始前,先include库中的头文件: 编写程序的第一步是初始化和配置位置传感器。 该库支持以下位置传感器: 编码器: 支持光学、电容式、磁编码器 (ABI方式) 磁性传感器: 支持SPI, I2C, PWM以及Analog (模拟输出) 霍尔传感器: 3x霍尔探头, 磁性传感器 (UVW 接口)
选择恰当的位置传感器运行以下例程: 磁性传感器 编码器 #include <SimpleFOC.h>// SPI 例程// MagneticSensorSPI(int cs芯片选择引脚, float bit_resolution传感器分辨率, int angle_register角度读取寄存器)MagneticSensorSPI sensor = MagneticSensorSPI(10, 14, 0x3FFF);void setup() {
// 初始化磁传感器硬件
sensor.init();}void loop() {} 在例程中,我们使用了14 位磁性传感器进行设置,比如: AS5047u, 并将其与引脚 10 连接。 磁性传感器使用SPI方式通讯,在类 MagneticSensorSPI 中的实现与定义如下: 执行 sensor.init() ,初始化传感器硬件引脚 完整的设置和参数配置文件,请访问 位置传感器 docs 。 配置好位置传感器后,我们开始初始化和配置驱动器。该库支持由类BLDCDriver3PWM 和 BLDCDriver6PWM 控制的无刷直流电机驱动器以及由类StepperDriver4PWM 控制的步进电机驱动器。 类BLDCDriver3PWM 的实例化需要以下参数 : A , B 和 C 相对应的引脚编号
enable 的引脚编号 (可选)
例如: #include <SimpleFOC.h>// BLDCDriver3PWM( pin_pwmA, pin_pwmB, pin_pwmC, enable使能引脚(可选的))BLDCDriver3PWM driver = BLDCDriver3PWM(9, 5, 6, 8);// 实例化传感器void setup() {
// 初始化传感器
// 电源电压
driver.voltage_power_supply = 12;
// 初始化驱动器
driver.init();}void loop() {} 完整的设置和参数配置文件,请访问 驱动器 docs 。 配置好位置传感器及驱动器后,如果驱动器支持电流检测的话,就要初始化和配置电流检测。如果不支持的话,可以跳过这一步。 该库暂时仅支持在线电流检测 InlineCurrentSense 这一种电流检测方式。 类InlineCurrentSense 的实例化需要以下参数: 采样电阻的阻值 shunt_resistance 放大增益 gain A, B (以及可选C)相对应的引脚编号
例如: #include <SimpleFOC.h>// 实例化驱动器// 实例化传感器// InlineCurrentSense(shunt_resistance分流电阻, gain增益, adc_a, adc_b)InlineCurrentSense current_sense = InlineCurrentSense(0.01, 50, A0, A2);void setup() {
// 初始化传感器
// 初始化驱动器
// 初始化电流检测
current_sense.init();}void loop() {} 完整的设置和参数配置文件,请访问 电流检测 docs 。 配置好位置传感器及驱动器后,我们开始初始化和配置电机。 该库支持由 BLDCMotor 类控制的无刷直流电机以及由 StepperMotor 类控制的步进电机。仅需填入电机极对数就能实现这两个类的控制。 // StepperMotor(int pole_pairs极对数)StepperMotor motor = StepperMotor(50); // BLDCMotor(int pole_pairs极对数)BLDCMotor motor = BLDCMotor(11); 在这一例程,我们使用了无刷直流电机: #include <SimpleFOC.h>// BLDCMotor( int pole_pairs极对数 )BLDCMotor motor = BLDCMotor( 11);
// 实例化驱动器// 实例化传感器 // 实例化电流检测 void setup() {
// 初始化传感器
// 连接电机和传感器
motor.linkSensor(&sensor);
// 初始化驱动器
// 连接电机和驱动器
motor.linkDriver(&driver);
// 初始化电流检测
// 连接其至电机
motor.linkCurrentSense(¤t_sese);
// 设置控制环类型
motor.controller = MotionControlType::velocity;
// 初始化电机
motor.init();}void loop() {} 在 创建motor 实例后,我们需要用motor.linkSensor() 连接传感器,用 motor.linkDriver() 连接驱动器。 下一步是配置电机。在这个配置例子中,我们仅用到了运动控制: // 设置控制环类型motor.controller = MotionControlType::velocity; 最后,我们执行 motor.init() 函数,完成电机 motor 的设置。 完整的设置和参数配置文件,请访问 电机 docs . 在初始化位置传感器、驱动器和电机之后,在运行FOC算法之前,我们需要校准电机和传感器。这个过程被称为 motor.initFOC() . 在这一步之后,我们将拥有一个能够正常工作的位置传感器以及配置好的电机,我们的FOC算法就可以基于位置传感器的测量设定合适的电压。 在FOC算法的实时运行时,我们需要在Arduino loop() 中添加函数 motor.loopFOC() 和 motor.move(target) 。 下面是其在代码中的呈现: #include <SimpleFOC.h>// 实例化电机// 实例化驱动器// 实例化传感器// 实例化电流检测void setup() {
// 初始化传感器
// 连接电机和传感器
// 初始化驱动器
// 连接电机和驱动器
// 初始化电流检测
// 连接电机和电流检测
// 配置电机
// 初始化电机
// 校准编码器,启用FOC
motor.initFOC();}void loop() {
// FOC算法函数
motor.loopFOC();
// 速度控制环函数
// 设置目标速度或2rad/s
motor.move(2);} 无刷直流电机完整的设置和参数配置文件,请访问 无刷直流电机 docs , 步进电机的完整文件,请访问 步进电机 docs 。 类 BLDCMotor 和 StepperMotor 提供监测函数。为了实现检测,你需要确保motor.useMonitoring() 调用了你想要输出的串口实例 Serial 在 motor.init() 和 motor.initFOC() 的运行过程中,类 Serial 将输出电机初始化状态。 如果你希望实时输出电机状态变量(这样会影响它的性能——串口输出的速度会很慢!),你可以在 Arduinoloop() 中添加函数motor.monitor() #include <SimpleFOC.h>// 实例化电机// 实例化驱动器// 实例化传感器void setup() {
// 初始化传感器
// 连接电机和传感器
// 初始化驱动器
// 连接电机和驱动器
// 初始化电流检测
// 连接电机和电流检测
// 监视无刷直流电机
Serial.begin(115200);
// 监视点
motor.useMonitoring(Serial);
// 配置电机
// 初始化电机
// 校准编码器,启用FOC}void loop() {
// 执行FOC
// 运动控制环
// 监视函数向串行终端输出电机变量的监控
motor.monitor();} 完整的设置和参数配置文件,请访问 监测 docs。 最后,为了配置控制算法,设定目标值,以用户友好的方式获得状态变量(不只是像使用motor.monitor() 那样的转储)。Arduino SimpleFOC库 为你提供像通信接口一样的 G 代码,组成类 Commander 。 以下代码是用户使用接口进行通信的基础实现: #include <SimpleFOC.h>// 实例化电机// 实例化传感器// commander实例化Commander commander = Commander(Serial);void doMotor(char* cmd){commander.motor(&motor, cmd);}void setup() {
// 初始化传感器
// 连接电机和传感器
// 初始化驱动器
// 连接电机和驱动器
// 初始化电流检测
// 连接电机和电流检测
// 启用监视器
// 订阅电机至commands
commander.add('M',doMotor,"motor");
// 初始化电机
// 校准编码器,启用FOC}void loop() {
// 执行FOC
// 运动控制环
// 电机变量
// 读取用户命令
commander.run();} 完整的设置和参数配置文件,请访问 通信 docs。 现在你应该已经熟悉SimpleFOClibrary的代码框架并且能够开始编写自己的应用程序了。为了使这一过程更加简单易懂,我们为你提供了详细的分步使用教程以确保你能够在初次接触这个库时一步一步的顺利进行。 🎨 完整的Arduino代码例程现在你已经学习完Arduino项目的所有部分了,这是一些额外配置的完整代码例程,请浏览这些代码以便更好地将先前介绍的所有部分内容融会贯通。这就是该库的代码例程: motor_full_control_serial_examples/magnetic_sensor/full_control_serial.ino 。 #include <SimpleFOC.h>// 磁传感器实例 - SPIMagneticSensorSPI sensor = MagneticSensorSPI(AS5147_SPI, 10);// 无刷直流电机及驱动器实例BLDCMotor motor = BLDCMotor(11);BLDCDriver3PWM driver = BLDCDriver3PWM(9, 5, 6, 8);// commander接口Commander command = Commander(Serial);void onMotor(char* cmd){ command.motor(&motor, cmd); }void setup() {
// 初始化磁传感器硬件
sensor.init();
// 连接电机和传感器
motor.linkSensor(&sensor);
// 配置驱动器
// 电源电压 [V]
driver.voltage_power_supply = 12;
driver.init();
// 连接驱动器
motor.linkDriver(&driver);
// 设置控制环类型
motor.controller = MotionControlType::torque;
// 基于控制环类型配置控制器
motor.PID_velocity.P = 0.2;
motor.PID_velocity.I = 20;
motor.PID_velocity.D = 0;
// 默认为电源电压
motor.voltage_limit = 12;
// 速度低通滤波时间常数
motor.LPF_velocity.Tf = 0.01;
// 角度环控制器
motor.P_angle.P = 20;
// 角度环速度限制
motor.velocity_limit = 50;
// 使用串口监视电机初始化
// 监视点
Serial.begin(115200);
// 如果不需要,可以注释掉此行
motor.useMonitoring(Serial);
// 初始化电机
motor.init();
// 校准编码器,启用FOC
motor.initFOC();
// 设置初始目标值
motor.target = 2;
// 定义电机 id
command.add('A', onMotor, "motor");
// 运行用户命令配置电机(完整命令列表见docs.)
Serial.println(F("Motor commands sketch | Initial motion control > torque/voltage : target 2V."));
_delay(1000);}void loop() {
// 迭代设置FOC相电压
motor.loopFOC();
// 设置外部环目标的迭代函数
// 速度,位置或电压
// 如果在参数中未设置目标,则使用电机目标变量
motor.move();
// 用户通信
command.run();} 开源代码库对扩展和调整SimpleFOClibrary源代码有兴趣的朋友,可以在 SimpleFOClibrary 源代码 docs 中找到完整文档。
|