热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ArduinoSimpleFOC库004BLDC电机配置

所有BLDC电机都在BLDCMotor类中处理。这个类实现:BLDCFOC算法运动控制回路监控用户通讯接口1.创建BLDC电机的实例要实例化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. 连接传感器

一旦定义了电机并初始化了传感器,您需要通过执行以下命令来链接motorsensor

// link the sensor to the motor
motor.linkSensor(&sensor);

该库中linkSensor方法能够实现连接电机到任何传感器。sensor将被用于确定电机的FOC算法的电位置以及用于速度和位置的运动控制环。有关更多信息,请参阅位置传感器文档!


使用开环运动控制时不需要链接。

 3. 链接驱动程序

一旦定义电机并初始化了驱动程序,您需要通过执行以下命令来链接motordriver

// link the driver to the motor
motor.linkDriver(&driver);

BLDCMotor类期望得到一个BLDCDriver类的实例,在默认情况下类实现BLDCDriver3PWMBLDCDriver6PWM。驱动程序处理与特定微控制器架构和驱动程序硬件相关的所有硬件特定操作。有关更多信息,请参阅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,ID收益除以该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 au bu 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 电机。


推荐阅读
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 众筹商城与传统商城的区别及php众筹网站的程序源码
    本文介绍了众筹商城与传统商城的区别,包括所售产品和玩法不同以及运营方式不同。同时还提到了php众筹网站的程序源码和方维众筹的安装和环境问题。 ... [详细]
author-avatar
mobiledu2502929493
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有