完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
所有 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 电机。 |
|
|
|
只有小组成员才能发言,加入小组>>
3126 浏览 9 评论
2823 浏览 16 评论
3337 浏览 1 评论
8706 浏览 16 评论
3927 浏览 18 评论
9544浏览 3评论
877浏览 3评论
447浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
451浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2174浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-16 22:04 , Processed in 1.024923 second(s), Total 78, Slave 59 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号