Arduino SimpleFOC库-004-BLDC 电机配置
所有 BLDC 电机都在BLDCMotor
类中处理。这个类实现:
- BLDC FOC 算法
- 运动控制回路
- 监控
- 用户通讯接口
1. 创建 BLDC 电机的实例
要实例化 BLDC 电机,我们需要创建BLDCMotor
该类的实例并为其提供电机的极对数.
// BLDCMotor(int pp, (optional R))
// - pp - pole pair number
// - R - phase resistance value - optional
BLDCMotor motor = BLDCMotor(11 , 10.5);
极对数
如果您不确定您的pole_paris
号码是多少。该库提供了一个示例代码来估计您pole_paris
在示例中的数量find_pole_pairs_number.ino
。
相位电阻
如果您事先知道您电机的相电阻值R
,我们建议您将其提供给图书馆。然后库将在内部计算电压值,用户将只处理电流。但这是一个可选功能。
2. 连接传感器
一旦定义了电机并初始化了传感器,您需要通过执行以下命令来链接motor
和sensor
:
// link the sensor to the motor
motor.linkSensor(&sensor);
该库中linkSensor方法
能够实现连接电机到任何传感器。sensor
将被用于确定电机的FOC算法的电位置以及用于速度和位置的运动控制环。有关更多信息,请参阅位置传感器文档!
使用开环运动控制时不需要链接。
3. 链接驱动程序
一旦定义电机并初始化了驱动程序,您需要通过执行以下命令来链接motor
和driver
:
// link the driver to the motor
motor.linkDriver(&driver);
该BLDCMotor类
期望得到一个BLDCDriver
类的实例,在默认情况下类实现BLDCDriver3PWM
和BLDCDriver6PWM
。驱动程序处理与特定微控制器架构和驱动程序硬件相关的所有硬件特定操作。有关更多信息,请参阅bldc 驱动程序文档!
4. 连接电流感应
如果您有电流传感器,您可以将current_sense
链接到motor
使用:
// link the current sensor to the motor
motor.linkCurrentSense(¤t_sense);
仅当您具有此库支持的电流感应时,才需要此链接步骤。
5. 配置参数
如果您选择不设置某些配置参数,它们将采用defaults.h
文件中定义的值。
5.1 PWM 调制类型
BLDC 电机有四种类型的磁场定向控制调制类型:
- 正弦 PWM 调制
- 空间矢量PWM调制
- 块换向 -有益于电流控制应用
- 梯形120
- 梯形 150
您可以通过更改motor.foc_modulation
变量来设置它们:
// choose FOC modulation
// FOCModulationType::SinePWM; (default)
// FOCModulationType::SpaceVectorPWM;
// FOCModulationType::Trapezoid_120;
// FOCModulationType::Trapezoid_150;
motor.foc_modulation = FOCModulationType::SpaceVectorPWM;
正弦 PWM 和空间矢量换向模式将产生平稳运行正弦电流,但块换向执行速度更快,因此更适合更高的速度。建议使用带有霍尔传感器的 Trapesoidal 120 换向。其他换向模式也可以使用,但这种换向模式的性能最佳。
FOC 电流扭矩控制要求
FOC 扭矩控制需要正弦电流,因此请使用正弦 PWM 或空间矢量 PWM
5.2 传感器和电机对中参数
用于电机和传感器对齐的电压设置变量motor.voltage_sensor_align
:
// aligning voltage [V]
motor.voltage_sensor_align = 3; // default 3V
如果你的传感器是一个编码器并且它有一个索引引脚,你可以通过设置变量来设置索引搜索速度值motor.velocity_index_search
:
// incremental encoder index search velocity [rad/s]
motor.velocity_index_search = 3; // default 1 rad/s
5.3 位置传感器偏移
对于某些应用,指定传感器绝对零偏移很方便,您可以通过更改参数来定义它motor.sensor_offset
:
// sensor offset [rad]
motor.sensor_offset = 0; // default 0 rad
该参数可以实时更改。
5.3 电机相电阻
电机相电阻是一个可选参数,对于基于电流的扭矩模式不是很重要,但如果使用电压模式并且如果用户指定motor.phase_resistance
(在构造函数或setup()
函数中),库将允许用户使用当前值和自动计算必要的电压。在设置功能中,您可以通过设置更改此参数:
// motor phase resistance [Ohms]
motor.phase_resistance = 2.54; // Ohms - default not set
使用电流而不是电压在许多方面更好,因为 BLDC 电机的扭矩与电流成正比而不是电压,特别是因为相同的电压值会为不同的电机产生非常不同的电流(由于不同的相电阻) . 一旦提供了相电阻,用户将能够为其 BLDC 电机设置电流限制,而不是更容易理解的电压限制。
重要的是,一旦您指定了相电阻值,您很可能必须重新调整速度运动控制和角度运动控制参数,这是由于电压和电流值处于不同数量级的原因。经验法则是将所有P
,I
和D
收益除以该motor.phase_resistance
值。这将是一个很好的起点。
最后,如果要在基于电压(电压模式)和基于电流(直流电流和FOC 电流)转矩控制策略之间实时切换,建议使用此参数。由于以这种方式所有转矩控制回路都将电流作为输入(目标值),因此用户不必更改运动控制参数(PID 值)。
如果需要,可以实时更改相电阻。
5.4 转矩控制模式
Arduino Simple FOC库中实现了 3 种不同的扭矩控制模式:
- 电压模式
- 直流电流
- FOC电流
DC 电流和FOC 电流需要电流感应,并控制电流并限制电机消耗的实际电流,而电压模式近似电机电流,不使用任何电流感应。在扭矩控制文档中内容。
可以通过更改电机属性来设置扭矩模式torque_controller
。
// set torque mode to be used
// TorqueControlType::voltage ( default )
// TorqueControlType::dc_current
// TorqueControlType::foc_current
motor.torque_controller = TorqueControlType::foc_current;
5.5 运动控制参数
Arduino Simple FOC库中实现了 3 种不同的闭环控制策略:
- 扭矩控制回路
- 速度运动控制
- 位置/角度运动控制
此外,Simple FOC库还实现了两种开环控制策略:
- 速度开环控制
- 位置开环控制
您可以通过更改motor.controller
变量来设置它。
// set motion control loop to be used
// MotionControlType::torque - torque control
// MotionControlType::velocity - velocity motion control
// MotionControlType::angle - position/angle motion control
// MotionControlType::velocity_openloop - velocity open-loop control
// MotionControlType::angle_openloop - position open-loop control
motor.controller = MotionControlType::angle;
注意:
此参数没有默认值,必须在执行开始之前实时设置。
每个运动控制策略都有自己的参数,您可以在运动控制文档中找到更多关于它们的信息。
以下是所有运动控制配置参数的列表:
// set control loop type to be used
motor.controller = MotionControlType::angle;// controller configuration based on the control type
motor.PID_velocity.P = 0.2;
motor.PID_velocity.I = 20;
motor.PID_velocity.D = 0.001;
// jerk control it is in Volts/s or Amps/s
// for most of applications no change is needed
motor.PID_velocity.output_ramp = 1e6;// velocity low pass filtering time constant
motor.LPF_velocity.Tf = 0.01;// angle loop controller
motor.P_angle.P = 20;
motor.P_angle.I = 0; // usually set to 0 - P controller is enough
motor.P_angle.D = 0; // usually set to 0 - P controller is enough
// acceleration limit
motor.P_angle.output_ramp = 1e6;// motion control limits
// angle loop velocity limit
motor.velocity_limit = 50;
// either voltage limit
motor.voltage_limit = 12; // Volts - default driver.voltage_limit
// or current limit - if phase_resistance set
motor.current_limit = 12; // Amps - default 0.5 Amps
5.6 配置完成 - motor.init()
最后,配置生效通过运行init()
函数,该函数配置电机组件的所有硬件和软件值。
// initialize motor
motor.init();
6. 对齐电机和所有传感器 - Field Oriented Control init
在配置位置传感器、电流检测、驱动器和电机之后,在开始运动控制之前,我们需要对齐所有硬件组件以初始化 FOC 算法。这是在功能范围内完成的motor.initFOC()
// align sensor and start FOC
motor.initFOC();
开环控制可以跳过!
如果没有附加传感器,这个函数将不会真正做任何事情,但如果需要或更方便,您仍然可以调用它。
这个函数做了几件事:
- 根据电机方向检查/修改位置传感器方向
- 如有必要,搜索编码器索引
- 查找相对于位置传感器的电机电气偏移
- 检查/修改电流检测引脚排列并获得符号(如果有的话)以确保它与驱动器对齐
此功能是最终检查功能,它将禁用您的电机并向您显示错误信息。(使用监控时)。如果一切都配置好了,在调用这个函数FOC之后就准备好了,我们的设置就完成了!
对齐过程将不得不多次移动您的电机,这可能不是理想的行为,因此对于大多数位置传感器(编码除外)和电流感应,可以按照步骤 6.1 和 6.2 跳过此对齐过程。
6.1 跳过对齐 - 位置传感器
如果您使用的是绝对传感器,例如磁传感器或霍尔传感器,一旦您完成了校准程序并且一旦您确定了电机的零电气偏移传感器方向,您就不再需要完整的校准序列。因此,motor.initFOC()
您可以提供传感器偏移zero_electric_offset
和传感器方向sensor_direction
以避免对齐过程:
// align sensor and start FOC
//motor.initFOC(zero_electric_offset, sensor_direction);
motor.initFOC(2.15, Direction::CW);
同样可以通过使用电机参数来完成:
// align sensor and start FOC
motor.zero_electric_offset = 2.15; // rad
motor.sensor_direction = Direction::CW; // CW or CCW
motor.initFOC();
您可以通过运行find_sensor_offset_and_direction.ino
示例找到这些值。
更一般地说,如果您知道这两个值中的任何一个,请确保提供并且iniFOC
将跳过校准的那部分。例如,对于编码器传感器,零电气偏移一直在变化,但传感器方向将保持不变,因此您可以提供它并跳过大部分校准序列。
6.2 跳过对齐 - 电流检测
对于电流传感器,也可以避免校准过程,这是通过指定称为 的电流感应标志来完成的skip_align
:
current_sense.skip_align = true; // default false
但请确保所有增益都设置良好,并且所有 ADC 引脚都与驱动器/电机相位对齐。有关对齐的更多信息,请访问current sense docs。
步骤 7. 实时运动控制
Arduino Simple FOC库的实时运动控制通过两个函数实现:
motor.loopFOC()
- 低级扭矩控制motor.move(float target)
- 高级运动控制
功能loopFOC()
行为直接取决于扭矩控制模式usd。如果在电压模式下使用,它会从传感器获取当前电机角度,将其转换为电角度并将 q 轴U q电压命令motor.voltage_q
转换为适当的相电压u a、u b和u c,然后设置为电机。而如果它用于 FOC 电流模式的 DC,它会额外读取电流传感器并运行闭环电流控制。
// Function running the low level torque control loop
// it calculates the gets motor angle and sets the appropriate voltages
// to the phase pwm signals
// - the faster you can run it the better Arduino UNO ~1ms, Bluepill ~ 100us
motor.loopFOC();
开环控制可以跳过!
如果电机开环运行,此功能将不起作用!
此功能的执行时间在电压模式和电流控制模式中都很关键。因此,motor.loopFOC()
尽可能快地执行函数非常重要。
最后,一旦我们有办法使用 FOC 算法为电机设置扭矩命令(电流i q或电压u q),我们就可以进行运动控制。这是通过motor.move()
功能完成的。
// Function executing the motion control loops configured by the motor.controller parameter of the motor.
// - This function doesn't need to be run upon each loop execution - depends of the use case
//
// target Either torque, angle or velocity based on the motor.controller
// If it is not set the motor will use the target set in its variable motor.target
motor.move(target);
该move()
方法循环执行运动控制算法。如果由motor.controller
变量控制。它执行纯转矩环、速度环或角度环。
它接收一个参数float target
,即当前用户定义的目标值。
- 如果用户运行速度环或速度开环,
move
函数将target解释
为目标速度。 - 如果用户运行angle loop或angle open-loop,
move
会将target
参数解释为目标角度。 - 如果用户运行转矩环,
move
函数会将target
参数解释为电压u q或电流i q(如果提供相电阻)。
该target
参数是可选的,如果未设置,则目标值将由公共电机变量设置motor.target
。等效的代码是:
motor.target = 2;
motor.move();
7.1 运动控制下采样
对于许多运动控制应用,为每个运动控制回路运行多个扭矩控制回路是有意义的。这可以对平滑度产生很大影响,并且可以提供更好的高速性能。因此,该库为move()
使用参数设置的函数启用了一个非常简单的下采样策略motor.motion_downsample
:
// downsampling value
motor.motion_downsample = 5; // - times (default 0 - disabled)
下采样策略以非常简单的方式工作,即使motor.move()
在每个 arduino 中调用loop
它也只会在每次motor.motion_downsample
调用时执行。该参数 si 可选,可实时配置。
注意:运动控制影响
下采样的不同值可能需要对运动参数进行一些调整。
就是这样,您拥有完整的磁场定向运动控制 BLDC 电机。
Arduino SimpleFOC库-004-BLDC 电机配置相关推荐
- Arduino SimpleFOC库-007-电流感应
Arduino Simple FOC库的目标是通过(至少)三种最标准的电流感应类型来支持 FOC 实现: 在线电流检测 低侧电流检测-尚不支持 高端电流检测-尚不支持 到目前为止(检查发布),Ardu ...
- stm32捕获占空比_【电机控制】六步法驱动BLDC电机,使用硬件COM事件,STM32+CUBEMX(HAL库)配置...
现在我也只能说是电机入门,但是想要把电机作为终身事业,从有霍尔到无霍尔,从方波到正弦波,现在把其中的一些知识点分享出来,因为电机控制其实的资料比较难找的,前人栽树,后人乘凉,如果我有什么错误,在知乎上 ...
- 【电机控制】六步法驱动BLDC电机,使用硬件COM事件,STM32+CUBEMX(HAL库)配置
已经做了半年的BLDC驱动器了,目前是做到了电流转速双闭环,期间遇到了很多很多问题,一个是资料难找,再加上公司要求使用CUBEMX,本身HAL库的资料也难找,难上加难啊,可能是用CUBEMX做出来的大 ...
- Mind+上传模式的第三方Arduino用户库实现 -DHT11温湿度模块
Mind+上传模式的第三方Arduino用户库实现--DHT11模块读取温湿度 前言 Mind+是一款拥有自主知识产权的国产青少年编程软件,支持Arduino.micro:bit.掌控板等各种开源硬件 ...
- absolute 必须 relative_想搞BLDC电机控制,就必须要懂的角度传感器
在终端市场上,利用无刷直流电机(或简称为BLDC)技术取代交流电机或高效率的机械泵已经取得了重大进展. 相对于交流电机,使用BLDC的优点包括:更高的功效和热效率.体积较小.性能更可靠.此外,由于BL ...
- STM32 HAL库PID控制电机 第二章 TB6612FNG芯片驱动GB37-520电机
STM32 HAL库PID控制电机 第二章 TB6612FNG芯片驱动GB37-520电机(HAL库) 1 电路图 2 TB6612简介 TB6612是双驱动,可同时驱动两个电机 STBY:接单片机的 ...
- STM32 电机教程 14 - BLDC 电机速度闭环控制
前言 无刷直流 (Brushless Direct Current, BLDC)电机是一种正快速普及的电机类型,它可在家用电器.汽车.航空航天.消费品.医疗.工业自动化设备和仪器等行业中使用.正如名称 ...
- arduino常用库收集
按字母排序,由于上传文件限制,我就分享到百度云里了,有更新会在百度云里更新的 a开头的基本都是屏幕的,还有网页的,操作系统的 b开头的这个MP3还是很有用的 说起这个d开头的,有点羞涩,这个是我 ...
- STM32 电机教程 9 - BLDC电机基础
本节内容整理自<无刷直流( BLDC)电机基础>( MicroChip 公司,编号 AN885)和<直流无刷电机的原理及其控制>( infineon 公司) 前言 无刷直流 ( ...
最新文章
- 【Leetcode】EASY题解....ing python
- 734. [网络流24题] 方格取数问题 二分图点权最大独立集/最小割/最大流
- android 头像球_Android一行代码实现圆形头像
- android eclipse更改项目程序桌面图标以及出现的问题?
- 思科称可能是宇宙射线触发了路由器bug
- 第 7 章 Neutron - 082 - 将 instance 连接到 first_local_net
- java zk_zk框架:zul文件,纯Java或混合更好的性能
- matlab用插值法plot,Matlab插值法
- 怦然心动(Flipped)-3
- 京东11万蓝领和1万白领,折射的是整个中国互联网
- Python简洁出入库系统(批量出入库)
- HTML css实现翻页效果,一个纯CSS3实现的酷炫翻书效果
- 抖音 Android 包体积优化探索:资源二进制格式的极致精简
- 手机vnc远程桌面,手机vnc远程桌面教程,配置详解
- Collections的用法
- 经营者思维—赢在战略人力资源管理
- 归一化处理的目的和意义
- jeet air缺点_与Jeet合作:替代响应框架
- 口红送什么色号,这是一个难题,爬取口红数据,希望对你有所帮助
- 【洛谷1106明明的随机数】