【花雕学编程】Arduino动手做(225)---AS5600的16个小实验

2024-08-191.1万
AI 快速预览详细 收起
本文介绍了使用AS5600磁编码器进行16个小实验的过程,旨在帮助初学者掌握高精度角度测量技术。每个实验都详细记录了步骤和结果,适合STEM教育和零基础新手。通过这些实验,读者可以逐步了解AS5600磁编码器的使用方法,并学会如何进行高精度的角度测量。


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

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

【花雕学编程】Arduino动手做(225)---AS5600的16个小实验图1

【花雕学编程】Arduino动手做(225)---AS5600的16个小实验图2

【花雕学编程】Arduino动手做(225)---AS5600的16个小实验图3

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(71)
驴友花雕
驴友花雕
作者

驴友花雕
驴友花雕
作者
实验场景图


驴友花雕
驴友花雕
作者
实验串口绘图器返回情况


代码要点:[list=1]
[*][align=left]初始化和设置:[/align]
[list]
[*]包含必要的库文件。
[*]定义AS5600的I2C地址和角度寄存器地址。
[*]初始化串口通信和I2C通信。
[/list][*][align=left]主循环:[/align]
[list]
[*]读取AS5600的原始位置数据。
[*]将原始数据转换为角度值。
[*]计算角速度(度/秒)。
[*]打印原始位置、角度和速度。
[*]更新上一次的角度和时间。
[/list][*][align=left]读取角度数据的函数:从AS5600读取两个字节的角度数据,并将其合并为一个16位的原始角度数据。[/align]
[/list]
驴友花雕
驴友花雕
作者
实验串口绘图器返回情况


驴友花雕
驴友花雕
作者
实验串口返回情况

实验串口绘图器返回情况

驴友花雕
驴友花雕
作者
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百二十五:AS5600磁编码器 磁感应角度测量传感器 12bit高精度模块
项目实验之十六:转动电机轴,从AS5600读取原始数据,并计算角度、速度和位置
实验开源代码
[code]/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百二十五:AS5600磁编码器 磁感应角度测量传感器 12bit高精度模块
项目实验之十六:转动电机轴,从AS5600读取原始数据,并计算角度、速度和位置
*/
#include
#include
#include
// 使用SimpleFOC库中的低通滤波器
LowPassFilter as5600_filter(0.01);
#define AS5600_ADDRESS 0x36
#define ANGLE_REG 0x0C
AS5600 encoder;
void setup() {
Serial.begin(115200);
Wire.begin(); // 初始化I2C
Serial.println("完成初始化I2C,准备就绪!");
}
void loop() {
// 读取原始位置
uint16_t rawPosition = readAS5600Angle();
float angle = (rawPosition * 360.0) / 4096.0; // 将原始数据转换为角度
// 计算速度
static float last_angle = 0;
static unsigned long last_time = 0;
unsigned long current_time = millis();
float delta_time = (current_time - last_time) / 1000.0; // 转换为秒
float speed = (angle - last_angle) / delta_time; // 角速度,单位为度/秒
// 打印原始位置、角度和速度
Serial.print("原始位置: ");
Serial.print(rawPosition);
Serial.print(" - 角度: ");
Serial.print(angle);
Serial.print(" 度, 速度: ");
Serial.print(speed);
Serial.println(" 度/秒");
// 更新上一次的角度和时间
last_angle = angle;
last_time = current_time;
delay(500); // 延迟500毫秒
}
uint16_t readAS5600Angle() {
Wire.beginTransmission(AS5600_ADDRESS);
Wire.write(ANGLE_REG);
Wire.endTransmission();
Wire.requestFrom(AS5600_ADDRESS, 2);
uint16_t angle = Wire.read() << 8 | Wire.read();
return angle;
}[/code]
驴友花雕
驴友花雕
作者


驴友花雕
驴友花雕
作者
实验串口返回情况

实验串口绘图器返回情况

驴友花雕
驴友花雕
作者
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百二十五:AS5600磁编码器 磁感应角度测量传感器 12bit高精度模块
项目实验之十五:转动42步进电机主轴从AS5600读取实时位置和速度值
实验开源代码
[code]/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百二十五:AS5600磁编码器 磁感应角度测量传感器 12bit高精度模块
项目实验之十五:转动42步进电机主轴从AS5600读取实时位置和速度值
*/
#include
#include
#include
// 使用SimpleFOC库中的低通滤波器
LowPassFilter as5600_filter(0.01);
#define AS5600_ADDRESS 0x36
#define ANGLE_REG 0x0C
AS5600 encoder;
void setup() {
Serial.begin(115200);
Wire.begin(); // 初始化I2C
Serial.println("完成初始化I2C,准备就绪!");
}
void loop() {
// 读取位置
uint16_t position = encoder.getCumulativePosition();
float angle = fmod(position * 0.08789, 360.0);// 将位置值转换为角度(0.08789度/LSB)
// 计算速度
static float last_angle = 0;
static unsigned long last_time = 0;
unsigned long current_time = millis();
float delta_time = (current_time - last_time) / 1000.0; // 转换为秒
float speed = (angle - last_angle) / delta_time; // 角速度,单位为度/秒
// 打印位置和速度
Serial.print("角度= ");
Serial.print(angle);
Serial.print(" 度, 速度= ");
Serial.print(speed);
Serial.println(" 度/秒");
// 更新上一次的角度和时间
last_angle = angle;
last_time = current_time;
delay(500); // 延迟500毫秒
}[/code]
驴友花雕
驴友花雕
作者
代码的整体要点:
1、库文件导入:
#include :用于I2C通信。
#include :用于低通滤波。
2、定义和初始化:
LowPassFilter as5600_filter(0.01);:创建一个低通滤波器实例,用于平滑角度数据。
#define AS5600_ADDRESS 0x36:定义AS5600的I2C地址。
#define ANGLE_REG 0x0C:定义角度数据寄存器的地址。
3、设置函数:
void setup():初始化串口通信(波特率115200)和I2C通信,并打印初始化完成的消息。
4、主循环:
void loop():在主循环中,读取AS5600的原始角度数据,将其转换为角度值,并通过串口打印出来。每次循环后延迟500毫秒。
5、读取角度数据的函数:
uint16_t readAS5600Angle():这个函数负责从AS5600读取角度数据。具体步骤包括开始I2C通信、写入寄存器地址、请求数据、读取数据并返回。
这个代码的主要功能是通过I2C接口从AS5600读取原始角度数据,并将其转换为0°到360°之间的角度值,然后通过串口监视器输出。这样可以实时监控AS5600的角度数据。

驴友花雕
驴友花雕
作者
实验串口绘图器返回情况

驴友花雕
驴友花雕
作者
实验串口返回情况

驴友花雕
驴友花雕
作者
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百二十五:AS5600磁编码器 磁感应角度测量传感器 12bit高精度模块
项目实验之十四:通过AS5600读取电机轴的实时原始数据和角度值
实验开源代码
[code]/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百二十五:AS5600磁编码器 磁感应角度测量传感器 12bit高精度模块
项目实验之十四:通过AS5600读取电机轴的实时原始数据和角度值
*/
#include
#include
// 使用SimpleFOC库中的低通滤波器
LowPassFilter as5600_filter(0.01);
#define AS5600_ADDRESS 0x36
#define ANGLE_REG 0x0C
void setup() {
Serial.begin(115200);
Wire.begin(); // 初始化I2C
Serial.println("完成初始化I2C,准备就绪!");
}
void loop() {
uint16_t rawAngle = readAS5600Angle();
float angle = (rawAngle * 360.0) / 4096.0;
Serial.print("原始输出: ");
Serial.print(rawAngle);
Serial.print(" - 角度: ");
Serial.println(angle);
delay(500);
}
uint16_t readAS5600Angle() {
Wire.beginTransmission(AS5600_ADDRESS);
Wire.write(ANGLE_REG);
Wire.endTransmission();
Wire.requestFrom(AS5600_ADDRESS, 2);
uint16_t angle = Wire.read() << 8 | Wire.read();
return angle;
}[/code]
驴友花雕
驴友花雕
作者


驴友花雕
驴友花雕
作者
为了测量步进电机的实时位置并在Arduino IDE的串口绘图监视器中显示,可以使用AS5600传感器读取角度数据,并将其转换为度数。
要点解读
1、I2C初始化:使用Wire.begin()初始化I2C总线。
2、数据请求:使用Wire.requestFrom()直接向从机发送数据请求信号。
3、数据读取:使用Wire.read()获取传感器数据。
4、数据转换:将原始数据除以4096,再乘以360,得到角度值。
5、低通滤波:对转换后的角度值进行低通滤波处理。
6、串口输出:将处理后的角度值通过串口输出,便于在串口绘图监视器中查看。
使用串口绘图监视器
1、打开Arduino IDE。
2、选择工具菜单中的“串口监视器”。
3、在串口监视器窗口中,选择右下角的“绘图”模式。
4、你将看到传感器数据的实时图形显示。

驴友花雕
驴友花雕
作者
实验串口返回情况

驴友花雕
驴友花雕
作者
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百二十五:AS5600磁编码器 磁感应角度测量传感器 12bit高精度模块
项目实验之十三:测量步进电机的实时位置并在Arduino IDE的串口绘图监视器中显示
实验开源代码
[code]/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百二十五:AS5600磁编码器 磁感应角度测量传感器 12bit高精度模块
项目实验之十三:测量步进电机的实时位置并在Arduino IDE的串口绘图监视器中显示
*/
#include
#include
// 使用SimpleFOC库中的低通滤波器
LowPassFilter as5600_filter(0.01);
void setup() {
Serial.begin(115200);
Wire.begin(); // 初始化I2C
}
void loop() {
uint16_t readValue = 0;
byte readArray[2];
// 通知设备即将读取数据
Wire.beginTransmission(0x36);
Wire.write(0x0C);
Wire.endTransmission(false);
// 读取数据的MSB和LSB
Wire.requestFrom(0x36, (uint8_t)2);
if (Wire.available() == 2) {
readArray[0] = Wire.read();
readArray[1] = Wire.read();
readValue = (readArray[0] << 8) | readArray[1];
float angle = (readValue / 4096.0) * 360.0; // 将原始数据转换为度数
float filteredAngle = as5600_filter(angle);
Serial.println(filteredAngle); // 输出到串口监视器
} else {
Serial.println("Error reading data");
}
delay(50);
}[/code]
驴友花雕
驴友花雕
作者


驴友花雕
驴友花雕
作者
要测量步进电机的实时转速,可以通过计算单位时间内的步数来实现。以上是一个示例代码,使用AS5600传感器读取角度数据,并计算步进电机的实时转速。这个代码会将实时转速显示在Arduino IDE的串口绘图监视器中。
要点解读
数据转换:将原始数据除以4096,再乘以360,得到角度值。
低通滤波:对转换后的角度值进行低通滤波处理。
转速计算:通过计算单位时间内的角度变化量来计算转速(RPM)。
串口输出:将实时转速通过串口输出,便于在串口绘图监视器中查看。
使用串口绘图监视器
打开Arduino IDE。
选择工具菜单中的“串口监视器”。
在串口监视器窗口中,选择右下角的“绘图”模式。
你将看到实时转速的图形显示。

驴友花雕
驴友花雕
作者
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百二十五:AS5600磁编码器 磁感应角度测量传感器 12bit高精度模块
项目实验之十二:使用AS5600传感器读取角度数据,并计算步进电机的实时转速
实验开源代码
[code]/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百二十五:AS5600磁编码器 磁感应角度测量传感器 12bit高精度模块
项目实验之十二:使用AS5600传感器读取角度数据,并计算步进电机的实时转速
*/
#include
#include
// 使用SimpleFOC库中的低通滤波器
LowPassFilter as5600_filter(0.01);
unsigned long lastTime = 0;
float lastAngle = 0;
float rpm = 0;
void setup() {
Serial.begin(115200);
Wire.begin(); // 初始化I2C
}
void loop() {
uint16_t readValue = 0;
byte readArray[2];
// 通知设备即将读取数据
Wire.beginTransmission(0x36);
Wire.write(0x0C);
Wire.endTransmission(false);
// 读取数据的MSB和LSB
Wire.requestFrom(0x36, (uint8_t)2);
if (Wire.available() == 2) {
readArray[0] = Wire.read();
readArray[1] = Wire.read();
readValue = (readArray[0] << 8) | readArray[1];
float angle = (readValue / 4096.0) * 360.0; // 将原始数据转换为度数
float filteredAngle = as5600_filter(angle);
// 计算转速
unsigned long currentTime = millis();
float deltaTime = (currentTime - lastTime) / 1000.0; // 转换为秒
float deltaAngle = filteredAngle - lastAngle;
if (deltaAngle < 0) deltaAngle += 360.0; // 处理角度回绕
rpm = (deltaAngle / 360.0) / deltaTime * 60.0; // 计算RPM
// 更新上次的时间和角度
lastTime = currentTime;
lastAngle = filteredAngle;
// 输出到串口监视器
Serial.println(rpm);
} else {
Serial.println("Error reading data");
}
delay(20);
}[/code]