1759浏览
查看: 1759|回复: 70

[项目] 【花雕学编程】Arduino动手做(225)---AS5600磁编码传感器

[复制链接]
本帖最后由 驴友花雕 于 2024-8-20 18:00 编辑

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

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

【花雕学编程】Arduino动手做(225)---AS5600磁编码传感器图1

【花雕学编程】Arduino动手做(225)---AS5600磁编码传感器图2

【花雕学编程】Arduino动手做(225)---AS5600磁编码传感器图3

驴友花雕  中级技神
 楼主|

发表于 2024-8-20 18:02:46

【花雕学编程】Arduino动手做(225)---AS5600磁编码传感器

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

实验开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验二百二十四:AS5600磁编码器 磁感应角度测量传感器  12bit高精度模块
  4.   项目实验之二:将AS5600角度传感器集成到电机项目中
  5. */
  6. #include "AS5600.h"
  7. #include "Wire.h"
  8. AS5600 as5600;  //默认情况下使用Wire
  9. //不同变量的声明
  10. int positionZero;
  11. const int buttonPin = 2;  //按钮的引脚号
  12. int buttonState = 0;      //用于读取按钮状态的变量
  13. void setup() {
  14.   //初始化串行端口并设置串行通信的波特率
  15.   Serial.begin(115200);
  16.   Wire.begin();
  17.   //使用内部上拉将按钮初始化为输入
  18.   pinMode(buttonPin, INPUT_PULLUP);
  19.   Serial.println("文件路径信息:");
  20.   Serial.println(__FILE__);
  21.   Serial.println(" ");
  22.   //显示AS5600库的版本
  23.   Serial.print("AS5600库的版本: ");
  24.   Serial.println(AS5600_LIB_VERSION);
  25.   as5600.begin(4);                         //这条线初始化AS5600传感器
  26.   as5600.setDirection(AS5600_CLOCK_WISE);  //确定传感器的旋转方向
  27.   //检查连接
  28.   int b = as5600.isConnected();
  29.   Serial.print("已连接: ");
  30.   Serial.println(b);
  31.   delay(5000);
  32.   //设置零位置
  33.   positionZero = as5600.rawAngle();
  34. }
  35. void loop() {
  36.   //读取按钮状态
  37.   buttonState = digitalRead(buttonPin);
  38.   if (buttonState == LOW) {
  39.     positionZero = as5600.rawAngle();
  40.   }
  41.   //显示相对于零点和定义方向的角度值
  42.   Serial.print("点角值:");
  43.   Serial.print("\t");
  44.   //该代码行从AS5600传感器读取调整后的角度并将其显示在监视器上,
  45.   //这可能有助于跟踪或调试。
  46.   Serial.println(as5600.readAngle());
  47.   //显示零的值
  48.   Serial.print("零->位置的总值");
  49.   //命令serial.print(“\t”);在代码中,Arduino在串行端口上发送一个制表符(由\t表示)
  50.   Serial.print("\t");
  51.   Serial.println(positionZero);
  52.   //使用AS5600传感器测量角位置
  53.   //并以度为单位显示角度值
  54.   conversion_de_angle();
  55.   Serial.println("  ");
  56.   Serial.println("  ");
  57.   delay(3000);
  58. }
复制代码



回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-8-24 10:23:47

【花雕学编程】Arduino动手做(225)---AS5600磁编码传感器

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二百二十五:AS5600磁编码器 磁感应角度测量传感器  12bit高精度模块
  项目实验之十六:转动电机轴,从AS5600读取原始数据,并计算角度、速度和位置

实验开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验二百二十五:AS5600磁编码器 磁感应角度测量传感器  12bit高精度模块
  4.   项目实验之十六:转动电机轴,从AS5600读取原始数据,并计算角度、速度和位置
  5. */
  6. #include <Wire.h>
  7. #include <AS5600.h>
  8. #include <SimpleFOC.h>
  9. // 使用SimpleFOC库中的低通滤波器
  10. LowPassFilter as5600_filter(0.01);
  11. #define AS5600_ADDRESS 0x36
  12. #define ANGLE_REG 0x0C
  13. AS5600 encoder;
  14. void setup() {
  15.   Serial.begin(115200);
  16.   Wire.begin(); // 初始化I2C
  17.   Serial.println("完成初始化I2C,准备就绪!");
  18. }
  19. void loop() {
  20.   // 读取原始位置
  21.   uint16_t rawPosition = readAS5600Angle();
  22.   float angle = (rawPosition * 360.0) / 4096.0; // 将原始数据转换为角度
  23.   // 计算速度
  24.   static float last_angle = 0;
  25.   static unsigned long last_time = 0;
  26.   unsigned long current_time = millis();
  27.   float delta_time = (current_time - last_time) / 1000.0; // 转换为秒
  28.   float speed = (angle - last_angle) / delta_time; // 角速度,单位为度/秒
  29.   // 打印原始位置、角度和速度
  30.   Serial.print("原始位置: ");
  31.   Serial.print(rawPosition);
  32.   Serial.print(" - 角度: ");
  33.   Serial.print(angle);
  34.   Serial.print(" 度, 速度: ");
  35.   Serial.print(speed);
  36.   Serial.println(" 度/秒");
  37.   // 更新上一次的角度和时间
  38.   last_angle = angle;
  39.   last_time = current_time;
  40.   delay(500); // 延迟500毫秒
  41. }
  42. uint16_t readAS5600Angle() {
  43.   Wire.beginTransmission(AS5600_ADDRESS);
  44.   Wire.write(ANGLE_REG);
  45.   Wire.endTransmission();
  46.   Wire.requestFrom(AS5600_ADDRESS, 2);
  47.   uint16_t angle = Wire.read() << 8 | Wire.read();
  48.   return angle;
  49. }
复制代码



回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-8-23 14:46:59

【花雕学编程】Arduino动手做(225)---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. // 使用SimpleFOC库中的低通滤波器
  9. LowPassFilter as5600_filter(0.01);
  10. unsigned long lastTime = 0;
  11. float lastAngle = 0;
  12. float rpm = 0;
  13. void setup() {
  14.   Serial.begin(115200);
  15.   Wire.begin(); // 初始化I2C
  16. }
  17. void loop() {
  18.   uint16_t readValue = 0;
  19.   byte readArray[2];
  20.   // 通知设备即将读取数据
  21.   Wire.beginTransmission(0x36);
  22.   Wire.write(0x0C);
  23.   Wire.endTransmission(false);
  24.   // 读取数据的MSB和LSB
  25.   Wire.requestFrom(0x36, (uint8_t)2);
  26.   if (Wire.available() == 2) {
  27.     readArray[0] = Wire.read();
  28.     readArray[1] = Wire.read();
  29.     readValue = (readArray[0] << 8) | readArray[1];
  30.     float angle = (readValue / 4096.0) * 360.0; // 将原始数据转换为度数
  31.     float filteredAngle = as5600_filter(angle);
  32.     // 计算转速
  33.     unsigned long currentTime = millis();
  34.     float deltaTime = (currentTime - lastTime) / 1000.0; // 转换为秒
  35.     float deltaAngle = filteredAngle - lastAngle;
  36.     if (deltaAngle < 0) deltaAngle += 360.0; // 处理角度回绕
  37.     rpm = (deltaAngle / 360.0) / deltaTime * 60.0; // 计算RPM
  38.     // 更新上次的时间和角度
  39.     lastTime = currentTime;
  40.     lastAngle = filteredAngle;
  41.     // 输出到串口监视器
  42.     Serial.println(rpm);
  43.   } else {
  44.     Serial.println("Error reading data");
  45.   }
  46.   delay(20);
  47. }
复制代码



回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-8-20 08:39:20

【花雕学编程】Arduino动手做(224)---AS5600磁编码传感器

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

【花雕学编程】Arduino动手做(225)---AS5600磁编码传感器图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-8-20 08:45:36

【花雕学编程】Arduino动手做(224)---AS5600磁编码传感器

AS5600框架与实物图

【花雕学编程】Arduino动手做(225)---AS5600磁编码传感器图1
【花雕学编程】Arduino动手做(225)---AS5600磁编码传感器图2

【花雕学编程】Arduino动手做(225)---AS5600磁编码传感器图3
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-8-20 08:48:18

【花雕学编程】Arduino动手做(224)---AS5600磁编码传感器

该芯片包含四个呈圆圈排列的霍尔传感器。 内部霍尔元件放置在封装的中心,位于半径为 1 mm 的圆圈上。

【花雕学编程】Arduino动手做(225)---AS5600磁编码传感器图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-8-20 08:50:49

【花雕学编程】Arduino动手做(224)---AS5600磁编码传感器

【花雕学编程】Arduino动手做(224)---AS5600磁编码传感器

典型的径向磁铁感应气隙在 0.5 mm 到 3 mm 之间,这取决于所选的磁体。更大、更强的磁铁允许更大的气隙。以 AGC 值为指导,通过调整磁体和 AS5600 之间的距离,使 AGC 值位于其范围的中心,可以找到最佳气隙。当使用直径为 0.25mm 的磁体时,参考磁体的旋转轴从封装中心的最大允许位移为 6 mm。

【花雕学编程】Arduino动手做(225)---AS5600磁编码传感器图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-8-20 08:52:41

【花雕学编程】Arduino动手做(224)---AS5600磁编码传感器


AS5600 允许使用 DIR 引脚控制磁铁旋转方向。如果 DIR 连接到 GND (DIR = 0),则从顶部顺时针旋转将产生计算角度的增量。如果 DIR 引脚连接到 VDD (DIR = 1),则计算的角度将逆时针旋转。

【花雕学编程】Arduino动手做(225)---AS5600磁编码传感器图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-8-20 08:54:46

【花雕学编程】Arduino动手做(224)---AS5600磁编码传感器

AS5600磁编码器 磁感应角度测量传感器 12bit高精度模块

【花雕学编程】Arduino动手做(225)---AS5600磁编码传感器图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-8-20 09:03:32

【花雕学编程】Arduino动手做(224)---AS5600磁编码传感器

非接触式磁感应角度测量模块。
精度高,多种输出方式:IIC,PWM和电压。
采用优质材料制成的高品质AS5600模块坚固耐用,不易损坏。
广泛支持,完美匹配。
电路板尺寸:23.3 × 22.8 毫米
套件重量:2.6 克
包括一个 AS5600 磁编码器模块、一个 7 针针头和一块小磁铁。

【花雕学编程】Arduino动手做(225)---AS5600磁编码传感器图1
【花雕学编程】Arduino动手做(225)---AS5600磁编码传感器图2

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-8-20 09:07:35

【花雕学编程】Arduino动手做(224)---AS5600磁编码传感器

模块电原理图

【花雕学编程】Arduino动手做(225)---AS5600磁编码传感器图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-8-20 09:09:06

【花雕学编程】Arduino动手做(224)---AS5600磁编码传感器

电气参数:
VCC:3.3V
GND:电源地
Out:PWM /模拟电压输出
DIR:旋转方向(接地=顺时针值增加;接 VCC=顺时针值减小)
SCL:IIC 通信时钟线
SDA:IIC 数据通信线
GPO:模式选择(内部上拉接地=编程模式 B)

【花雕学编程】Arduino动手做(225)---AS5600磁编码传感器图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-8-20 09:16:11

【花雕学编程】Arduino动手做(224)---AS5600磁编码传感器

相关的径向磁铁也收集了不少

【花雕学编程】Arduino动手做(225)---AS5600磁编码传感器图1

【花雕学编程】Arduino动手做(225)---AS5600磁编码传感器图2
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-8-20 09:26:27

【花雕学编程】Arduino动手做(224)---AS5600磁编码传感器

为做好这个系列实验,特意打印了实验架子

【花雕学编程】Arduino动手做(225)---AS5600磁编码传感器图2

【花雕学编程】Arduino动手做(225)---AS5600磁编码传感器图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-8-20 09:27:39

【花雕学编程】Arduino动手做(224)---AS5600磁编码传感器

【花雕学编程】Arduino动手做(225)---AS5600磁编码传感器图1

【花雕学编程】Arduino动手做(225)---AS5600磁编码传感器图2
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-8-20 09:38:55

【花雕学编程】Arduino动手做(224)---AS5600磁编码传感器

Arduino实验接线示意图

【花雕学编程】Arduino动手做(225)---AS5600磁编码传感器图1

【花雕学编程】Arduino动手做(225)---AS5600磁编码传感器图2
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-8-20 13:50:14

【花雕学编程】Arduino动手做(224)---AS5600磁编码传感器

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

实验开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   实验二百二十四:AS5600磁编码器 磁感应角度测量传感器  12bit高精度模块
  4.   项目实验之一:从AS5600读取角度值
  5. */
  6. #include <Wire.h>
  7. #define AS5600_I2C_ADDRESS 0x36
  8. void setup() {
  9.   Serial.begin(9600);
  10.   Wire.begin();
  11.   Serial.println("AS5600准备就绪!开始测量");
  12. }
  13. void loop() {
  14.   //向AS5600请求2字节的数据
  15.   Wire.beginTransmission(AS5600_I2C_ADDRESS);
  16.   //角度值的注册地址
  17.   Wire.write(0x0E);
  18.   Wire.endTransmission();
  19.   Wire.requestFrom(AS5600_I2C_ADDRESS, 2);
  20.   //从AS5600读取角度值
  21.   int angleValue = (Wire.read() << 8) | Wire.read();
  22.   //将寄存器值转换为度数
  23.   float angle = (float)angleValue * 0.08789;
  24.   //打印角度到串行监视器
  25.   Serial.print("角度:");
  26.   Serial.print(angle);
  27.   Serial.println("度");
  28.   delay(2000);
  29. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-8-20 13:53:02

【花雕学编程】Arduino动手做(224)---AS5600磁编码传感器

实验串口返回情况

【花雕学编程】Arduino动手做(225)---AS5600磁编码传感器图1

这个项目实验一演示了如何通过I2C通信协议读取AS5600磁编码器的角度值。在setup()函数中,初始化了串口通信和Wire库(用于I2C通信)。在loop()函数中,通过向AS5600发送请求,并读取2个字节的数据。然后,将读取的数据转换为角度值,并打印到串口监视器中。通过调整延迟时间,可以控制采样频率。
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-8-20 13:57:11

【花雕学编程】Arduino动手做(224)---AS5600磁编码传感器

实验场景图

【花雕学编程】Arduino动手做(225)---AS5600磁编码传感器图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-8-20 18:08:09

【花雕学编程】Arduino动手做(225)---AS5600磁编码传感器

conversion_de_angle函数:

  1. void conversion_de_angle() {
  2.   //这行代码允许通过减去参考位置来计算相对角度
  3.   //测量的原始角度,这提供了更显著的角度测量
  4.   //在预定义的参考位置。
  5.   int angleBrut = as5600.rawAngle() - positionZero;  //减去零位置
  6.   if (angleBrut < 0) angleBrut += 4096;  //管理溢出
  7.   float angleBrutEnDegres = angleBrut * 0.088;  //转换为度
  8.   Serial.print("读取角度值为: ");
  9.   Serial.println(angleBrutEnDegres);
  10. }
复制代码



回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-8-20 18:14:32

【花雕学编程】Arduino动手做(225)---AS5600磁编码传感器

实验串口返回情况

【花雕学编程】Arduino动手做(225)---AS5600磁编码传感器图2

【花雕学编程】Arduino动手做(225)---AS5600磁编码传感器图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2024-8-22 15:49:09

【花雕学编程】Arduino动手做(225)---AS5600磁编码传感器

适配42步进电机,用3D打印了二种AS5600磁编码器模块的安装部件

【花雕学编程】Arduino动手做(225)---AS5600磁编码传感器图1

【花雕学编程】Arduino动手做(225)---AS5600磁编码传感器图2
回复

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail