381浏览
查看: 381|回复: 6

[项目] 【花雕学编程】使用卡尔曼滤波器处理AS5600磁编码器数据

[复制链接]
本帖最后由 驴友花雕 于 2024-9-1 19:55 编辑

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百二十五:AS5600磁编码器 磁感应角度测量传感器 12bit高精度模块


【花雕学编程】使用卡尔曼滤波器处理AS5600磁编码器数据图1

【花雕学编程】使用卡尔曼滤波器处理AS5600磁编码器数据图3

【花雕学编程】使用卡尔曼滤波器处理AS5600磁编码器数据图2

驴友花雕  中级技神
 楼主|

发表于 2024-9-1 19:57:28

【花雕学编程】使用卡尔曼滤波器处理AS5600磁编码器数据

核心芯片:AS5600
是一款易于编程的磁性旋转位置传感器,具有高分辨率 12 位模拟或 PWM 输出。这种非接触式系统测量径向磁化同轴磁体的绝对角度。这款 AS5600 专为非接触式电位计应用而设计,其坚固的设计消除了任何均匀的外部杂散磁场的影响。行业标准的I²C接口支持用户对非易失性参数进行简单编程,无需专门的编程器。此外,该器件还实现了在所谓的“3线模式”中轻松进行启动和停止位置编程,无需编程器或数字接口。输出的默认范围是 0 到 360 度。AS5600 可以通过编程零角度(开始位置)和最大角度(停止位置)来应用于较小的范围。AS5600 还配备了智能低功耗模式功能,可自动降低功耗。


【花雕学编程】使用卡尔曼滤波器处理AS5600磁编码器数据图3
【花雕学编程】使用卡尔曼滤波器处理AS5600磁编码器数据图2
【花雕学编程】使用卡尔曼滤波器处理AS5600磁编码器数据图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-9-1 19:58:43

【花雕学编程】使用卡尔曼滤波器处理AS5600磁编码器数据

Arduino实验接线示意图


【花雕学编程】使用卡尔曼滤波器处理AS5600磁编码器数据图3

【花雕学编程】使用卡尔曼滤波器处理AS5600磁编码器数据图2

【花雕学编程】使用卡尔曼滤波器处理AS5600磁编码器数据图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-9-1 20:01:04

【花雕学编程】使用卡尔曼滤波器处理AS5600磁编码器数据

  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二百二十五:AS5600磁编码器 磁感应角度测量传感器  12bit高精度模块
  项目实验之十九:使用卡尔曼滤波器处理AS5600编码器数据

实验开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验二百二十五:AS5600磁编码器 磁感应角度测量传感器  12bit高精度模块
  4.   项目实验之十九:使用卡尔曼滤波器处理AS5600编码器数据
  5. */
  6. #include <Wire.h>
  7. #include <SimpleFOC.h>
  8. #include <AS5600.h>
  9. // 使用SimpleFOC库中的低通滤波器
  10. LowPassFilter as5600_filter(0.01); // 创建一个低通滤波器实例,滤波系数为0.01
  11. AS5600 encoder; // 创建一个AS5600编码器实例
  12. // 定义卡尔曼滤波相关变量
  13. float measured_angle = 0; // 测量的角度
  14. float estimated_angle = 0; // 估计的角度
  15. float Q_angle = 0.001; // 过程噪声
  16. float R_measure = 0.03; // 测量噪声
  17. float P = 1; // 估计误差协方差
  18. float K; // 卡尔曼增益
  19. void setup() {
  20.   Serial.begin(115200); // 初始化串口通信,波特率为115200
  21.   Wire.begin(); // 初始化I2C通信
  22.   encoder.begin(); // 初始化AS5600编码器
  23.   Serial.println("已完成初始化I2C,Baize_FOC准备就绪"); // 输出初始化完成信息
  24. }
  25. void loop() {
  26.   uint16_t readValue = 0; // 存储读取的原始数据
  27.   byte readArray[2]; // 存储读取的字节数据
  28.   // 通知设备即将读取数据
  29.   Wire.beginTransmission(0x36); // 开始与I2C地址为0x36的设备通信
  30.   Wire.write(0x0C); // 写入寄存器地址0x0C,准备读取角度数据
  31.   Wire.endTransmission(false); // 结束传输,但保持I2C总线激活状态
  32.   // 读取数据的MSB和LSB
  33.   Wire.requestFrom(0x36, (uint8_t)2); // 请求从设备读取2个字节的数据
  34.   if (Wire.available() == 2) { // 检查是否有2个字节可用
  35.     readArray[0] = Wire.read(); // 读取第一个字节(MSB)
  36.     readArray[1] = Wire.read(); // 读取第二个字节(LSB)
  37.     readValue = (readArray[0] << 8) | readArray[1]; // 将两个字节合并为一个16位的值
  38.     float raw_angle = (float)readValue / 4096.0 * 360.0; // 将原始数据转换为0-360度
  39.     float filteredValue = as5600_filter(raw_angle); // 对角度数据进行低通滤波
  40.     // 卡尔曼滤波
  41.     measured_angle = filteredValue; // 更新测量的角度
  42.     // 预测步骤
  43.     P = P + Q_angle; // 更新估计误差协方差
  44.     // 更新步骤
  45.     K = P / (P + R_measure); // 计算卡尔曼增益
  46.     estimated_angle = estimated_angle + K * (measured_angle - estimated_angle); // 更新估计的角度
  47.     P = (1 - K) * P; // 更新估计误差协方差
  48.     // 确保角度在0-360度范围内
  49.     if (estimated_angle < 0) {
  50.       estimated_angle += 360;
  51.     } else if (estimated_angle >= 360) {
  52.       estimated_angle -= 360;
  53.     }
  54.     // 输出滤波后的角度
  55.     Serial.print("卡尔曼滤波后的角度: ");
  56.     Serial.println(estimated_angle);
  57.   } else {
  58.     Serial.println("Error reading data"); // 如果读取数据失败,输出错误信息
  59.   }
  60.   delay(50); // 延迟50毫秒
  61. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-9-1 20:04:18

【花雕学编程】使用卡尔曼滤波器处理AS5600磁编码器数据

实验串口返回情况

【花雕学编程】使用卡尔曼滤波器处理AS5600磁编码器数据图1

要点解读1、初始化与配置:在setup()函数中,初始化串口通信、I2C总线和AS5600编码器,确保系统准备就绪。2、数据读取:通过I2C总线从AS5600磁编码器读取角度数据,确保读取的MSB和LSB数据正确组合成16位的角度值。3、角度转换:将AS5600编码器的原始数据转换为0-360度范围内的角度值,便于后续处理和输出。4、低通滤波:使用SimpleFOC库中的低通滤波器对读取的角度数据进行滤波,减少噪声,提高数据的平滑度。5、简化的卡尔曼滤波算法:简化后的卡尔曼滤波算法去掉了复杂的矩阵运算,适合在资源有限的Arduino上实现。包括预测和更新步骤,以提高角度测量的精度,并确保角度值在0-360度范围内。
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-9-1 20:07:11

【花雕学编程】使用卡尔曼滤波器处理AS5600磁编码器数据

实验串口绘图器返回情况

【花雕学编程】使用卡尔曼滤波器处理AS5600磁编码器数据图1

【花雕学编程】使用卡尔曼滤波器处理AS5600磁编码器数据图2
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-9-1 20:10:04

【花雕学编程】使用卡尔曼滤波器处理AS5600磁编码器数据

实验场景图

【花雕学编程】使用卡尔曼滤波器处理AS5600磁编码器数据图1
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail