Simple FOC内置通信接口学习(一):实时监控电机状态
本文参(zhao)考(chao)至官方文档https://docs.simplefoc.com/docs_chinese/monitoring
引言
在使用Simple FOC控制电机的过程中,尤其是对电机进行调试的时候,我们常常希望能在初始化和校准过程中显示电机的状态以及实时了解到电机每时每刻的状态参数。当然,强大的Simple FOC库早已为我们准备好了一切,那就是今天的主角(划重点):监控功能
和Commander接口
。Simplefoc库实现了一个简单的通信方案,借此,我们可以快速方便地对所设置的参数进行测试、调试和监控。在使用官方的SimpleFOCStudio(推荐新手使用,中文版戳这SimpleFOCStudio中文版)图形化傻瓜式调参以及监控电机之余,我们不妨来深入了解一下这套通信方式~既能增长知识,还能方便我们二次开发。
监控功能
BLDCMotor
和 StepperMotor
类支持使用 Serial
进行监控:
motor.useMonitoring(Serial);
监控有两个主要目标:
监控电机初始化过程
初始化motor.init()
和校准过程 motor.initFOC()
期间,电机将向串口输出其状态。启用此功能不会直接影响实时性能,因为在 motor.loopFOC()
和motor.move()
函数中没有预定义的实时循环监控。
这是一个电机正常初始化监控输出实例:
MOT: Monitor enabled!
MOT: Init
MOT: Enable driver.
MOT: Align sensor.
MOT: sensor direction==CW
MOT: PP check: OK!
MOT: Zero elec. angle: 4.28
MOT: Align current sense.
MOT: Success: 2
MOT: Ready.
位置传感器导致电机初始化失败:
MOT: Monitor enabled!
MOT: Init
MOT: Enable driver.
MOT: Align sensor.
MOT: Failed to notice movement
MOT: Init FOC failed.
以及电流传感导致的电机初始化失败:
MOT: Monitor enabled!
MOT: Init
MOT: Enable driver.
MOT: Align sensor.
MOT: sensor direction==CW
MOT: PP check: OK!
MOT: Zero elec. angle: 4.28
MOT: Align current sense.
MOT: Fail!
MOT: Init FOC failed.
电机变量实时监控
监控的第二个作用是实时标签分离输出电机变量到串行终端。它是启用的,包括这行循环函数:
监控的第二个作用是将电机变量实时以选项卡分隔的方式输出到串行终端。 在loop()
中执行以下函数来启动:
motor.monitor()
监控功能可输出7种不同的电机具体变量::
target
- 当前目标值,具体到所使用的运动控制(电流、电压、速度或位置)voltage.q
- 设置 电压分量qvoltage.d
- 设置电压分量dcurrent.q
- 电流分量q的测量值(如果电流传感可用)current.d
- 电流分量d的测量值(如果电流传感可用)shaft_velocity
- 电机速度shaft_angle
- 电机位置
设置监视的首选值,可以在setup()
函数中更改 motor.monitoring_variables
参数。
motor.monitor_variables = _MON_TARGET | _MON_VEL | _MON_ANGLE; // 默认 _MON_TARGET | _MON_VOLT_Q | _MON_VEL | _MON_ANGLE
默认情况下,监控的变量为 target
,voltage.q
,velocity
,angle
。该参数是一个7bit值,其中每个位代表 bool
标志信号,来表示变量应该输出 (1) 还是不输出 (0),。因此,我们定义了一组帮助监控常量,可以组合起来更容易地处理监控:
#define _MON_TARGET 0b1000000 // 监视器目标值
#define _MON_VOLT_Q 0b0100000 // 监视器电压q值
#define _MON_VOLT_D 0b0010000 // 监视器电压d值
#define _MON_CURR_Q 0b0001000 // 监视器电流q值 - 如有测量
#define _MON_CURR_D 0b0000100 // 监视器电流d值 - 如有测量
#define _MON_VEL 0b0000010 // 监视器速度值
#define _MON_ANGLE 0b0000001 // 监视器角度值
此外,使用motor.monitor()
函数输出实时执行变量在许多情况下会对电机性能产生负面影响,因此,应该尽可能减少对该函数的调用,特别是在低波特率时输出很多变量。你可以通过参数motor.monitor_downsample
来设置:
// 降采样
motor.monitor_downsample = 100; // 默认为10
这个变量告诉 motor.monitor()
直到计数到monitor_downsample
时才将变量输出到串行。也就是说每到一次monitor_downsample
循环才会输出一次变量。
下面是一个完整的配置代码实例:
...
void setup(){
...
Serial.begin(115200); // 越高越好
motor.useMonitoring(Serial);
//显示变量
motor.monitor_variables = _MON_TARGET | _MON_VEL | _MON_ANGLE;
// 下采样
motor.monitor_downsample = 100; // 默认为10
...
}
void loop(){
....
motor.monitor();
}
实时监控功能主要用于实时可视化,特别适用于Arduino IDE的Serial Plotter
或者在 Serial Terminal
...
voltage,target,velocity
1.17 2.00 2.29
1.23 2.00 1.96
1.30 2.00 1.65
1.28 2.00 1.80
1.20 2.00 2.20
1.07 2.00 2.70
0.91 2.00 3.22
0.69 2.00 3.74
0.40 2.00 4.34
0.18 2.00 4.57
0.09 2.00 4.38
0.06 2.00 4.04
0.08 2.00 3.58
0.11 2.00 3.14
0.18 2.00 2.65
0.27 2.00 2.13
0.37 2.00 1.65
0.47 2.00 1.26
0.55 2.00 0.99
0.64 2.00 0.77
0.71 2.00 0.67
...
执行时间障碍
这个方法的目的是在主循环函数中顺着loopFOC()和move()函数调用。因此,motor.monitor()将会影响执行性能,降低FOC算法的采样频率,因此在运行代码时要考虑这个因素。
自定义串行终端监控
如果希望实现自己的监控功能或只是将电机变量输出到Serial
串行终端,这里有BLDCMotor
和StepperMotor
类的公共变量,可以随时访问。
// 电流目标值
float target;
// 当前电机角度
float shaft_angle;
// 当前电机速度
float shaft_velocity;
// 当前目标速度
float shaft_velocity_sp;
// 当前目标角度
float shaft_angle_sp;
// 当前设置的电机电压 (voltage.q, voltage.d)
DQVoltage_s voltage;
// 当前电机电流 (current.q, current.d) - 如有测量
DQCurrent_s current;
// 相电压
float Ua, Ub, Uc;
在此之前可以通过添加motor
来访问这些变量中的任何一个。例如:
Serial.println(motor.shaft_angle);// 打印当前电机位置至串口终端
// 或者
Serial.println(motor.Ua); // 打印相电压Ua至串口终端
监视只能在一个方向上工作,并且假设它实现用户通信。
使用电机命令实时用户通信
为了在用户和电机之间进行双向通信, Arduino SimpleFOC库 为你提供了 电机命令接口。
Simple FOC内置通信接口学习(一):实时监控电机状态的更多相关文章
- pythone函数基础(8)内置函数学习
内置函数学习# sorted# map# filter# max# sum# round# chr# ord# dir# bool# eval# exec# zipimport mathres = m ...
- WebForm 内置对象、数据增删改、状态保持
一.内置对象 1.Response对象:响应请求 Response.Write("<script>alert('添加成功!')</script>"); → ...
- AWS邮件通知服务:实时监控邮件状态
以下为译文: 订阅“AWS中文技术社区”微信公众号,实时掌握AWS技术及产品消息! AWS中文技术社区为广大开发者提供了一个Amazon Web Service技术交流平台,推送AWS最新资讯.技术视 ...
- iOS实时监控网络状态的改变
在网络应用中,有的时候需要对用户设备的网络状态进行实时监控,有两个目的: (1)让用户了解自己的网络状态,防止一些误会(比如怪应用无能) (2)根据用户的网络状态进行智能处理,节省用户流量,提高用户体 ...
- jsp内置对象学习记录
1.session,是一个会话保留在服务器端的对象(默认保留时间为30分钟),所以我们可以在session里面放用户信息以便后续的访问便利(缺点:cookie劫持,导致用户数据泄露).案例:(1)同个 ...
- JS内置对象学习总结
日期对象: 创建日期对象: var date=new Date();//创建日期对象 设置/返回年份方法: date.getFullYear(); date.setFullYear(); 返回星期的方 ...
- window内置对象学习
1.location:本页面的location对象 对象属性图示: 对象属性: 对象方法: 2.history:是本页面的浏览历史 history对象记录了用户曾经浏览过的页面(URL),并可以实现浏 ...
- 蛙蛙推荐:如何实时监控MySql状态
大多网站的性能瓶颈都会出在数据库上,所以想把Mysql监控起来,就搜索了下相关资料. 后来和同事讨论了下cacti和nagios有些老套和过时,graphite比较时尚,然后就搜了下相关的资料,最后搞 ...
- 实时监控MySql状态
大多网站的性能瓶颈都会出在数据库上,所以想把Mysql监控起来,就搜索了下相关资料. 后来和同事讨论了下cacti和nagios有些老套和过时,graphite比较时尚,然后就搜了下相关的资料,最后搞 ...
- ngxtop实时监控nginx状态
ngxtop实时解析nginx访问日志,并且将处理结果输出到终端,功能类似于系统命令top,所以这个软件起名ngxtop.有了ngxtop,你可以实时了解到当前nginx的访问状况,再也不需要tail ...
随机推荐
- Js运算符(操作符)
算数运算符 a = 1 + 1 // 2 a = 10 - 5 // 5 a = 10 / 5 // 2 a = 10 / 0 // js中除以0不会报错,结果是Infinity a = 2*2 // ...
- java使用正则表达式验证手机号和电话号码和邮箱号码的方法
验证手机号 我国的手机号一般是以1开头,后面跟着10位数字.因此,可以用如下正则表达式: public static boolean isValidPhoneNumber(String phoneNu ...
- MySQL数据的导出
有时需要将MySQL数据库中的数据导出到外部存储文件中,MySQL数据库中的数据可以导出成sql文本文件.xml文件或者html文件.本节将介绍数据导出的常用方法. 11.4.1 使用SELECT- ...
- .NET 内存管理两种有效的资源释放方式
前言 嗨,大家好!今天我们要聊一聊 .NET 中的内存管理.你知道吗?虽然 .NET 有一个很好的垃圾回收系统来自动清理不再使用的对象,但在某些情况下,我们还需要自己动手来释放一些特殊的资源,比如打开 ...
- 云原生爱好者周刊:在 PaaS 平台上托管 WebAssembly 应用
云原生一周动态要闻: Knative v1.1 发布 Nocalhost v0.6.12 发布 CircleCI 的企业功能现在免费了 SolarWinds 修复了一个 Serv-U 漏洞 Nvidi ...
- 云原生周刊 | 让 ChatGPT 以电子邮件的方式来解释 KubeSphere
过去的一周是 ChatGPT 的狂欢,我猜每一位云原生玩家都很好奇他是如何看待 Kubernetes 的.咱们不防换个方式来提问,让它使用电子邮件的方式来向别人推荐 KubeSphere 和 Open ...
- Seralizable
class CSer { private String name; private int age; public CSer() { } public CSer(String name, int ag ...
- Python 潮流周刊#74:创下吉尼斯世界记录的 Python 编程课(摘要)
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- jarvisoj_level2_x64 1 writeup and blog
Here i finish the jarvisoj_level2_x64 1 challenge in buuctf and here is some writeup (i use English ...
- 重温c语言之,7天开整,就是随便的写写,第一天
一:转义字符 \t是一个字符,在printf里面,只占一个位置: 其他什么的抽象字符,用一个'\'+抽象字符就可以出现: \ddd这个是8进制的,可以转成10进制的,之后参考ASCLL码表即可 二:枚 ...