驴友花雕 发表于 2024-8-22 15:50:59

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

在42步进电机底部,用胶水黏住一个径向磁铁




驴友花雕 发表于 2024-8-22 15:53:40

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

效果是这样的




驴友花雕 发表于 2024-8-22 15:56:18

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

可以开始做实验了




驴友花雕 发表于 2024-8-22 17:12:17

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

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

实验开源代码

/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百二十四:AS5600磁编码器 磁感应角度测量传感器12bit高精度模块
项目实验之三:转动42步进电机主轴从AS5600读取实时角度值
*/

#include <Wire.h>
#define AS5600_I2C_ADDRESS 0x36

void setup() {
Serial.begin(9600);
Wire.begin();
Serial.println("42步进电机准备就绪!AS5600开始测量角度");
}

void loop() {
//向AS5600请求2字节的数据
Wire.beginTransmission(AS5600_I2C_ADDRESS);
//角度值的注册地址
Wire.write(0x0E);
Wire.endTransmission();
Wire.requestFrom(AS5600_I2C_ADDRESS, 2);

//从AS5600读取角度值
int angleValue = (Wire.read() << 8) | Wire.read();
//将寄存器值转换为度数
float angle = (float)angleValue * 0.08789;

//打印角度到串行监视器
Serial.print("角度=");
Serial.print(angle);
Serial.println("度");

delay(2000);
}

驴友花雕 发表于 2024-8-22 17:18:39

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

实验串口返回情况


驴友花雕 发表于 2024-8-22 17:23:26

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

实验场景图


驴友花雕 发表于 2024-8-23 07:08:40

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

本帖最后由 驴友花雕 于 2024-8-23 07:13 编辑

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百二十四:AS5600磁编码器 磁感应角度测量传感器12bit高精度模块
项目实验之四:通过循环扫描I2C总线上的设备地址,找到连接的AS5600设备

实验开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百二十四:AS5600磁编码器 磁感应角度测量传感器12bit高精度模块
项目实验之四:通过循环扫描I2C总线上的设备地址,找到连接的AS5600设备
*/

#include <SimpleFOC.h>
#include <Wire.h>

void setup() {
Serial.begin(115200);
Wire.begin(); // 初始化I2C
for (int i = 0; i < 127; i++) {
    Wire.beginTransmission(i);
    if (Wire.endTransmission() == 0) {
      Serial.print("AS5600的IIC设备地址为");
      Serial.print("0x");
      Serial.println(i, HEX);
    }
}
}

void loop() {}




驴友花雕 发表于 2024-8-23 07:12:41

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

实验串口返回情况


驴友花雕 发表于 2024-8-23 07:33:53

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

搜索安装SimpleFOC库
1、打开 https://github.com/
2、搜索:SimpleFOC
3、下载:https://github.com/simplefoc/Arduino-FOC-drivers
4、安装:SimpleFOC库



驴友花雕 发表于 2024-8-23 07:39:32

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




驴友花雕 发表于 2024-8-23 07:46:16

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




驴友花雕 发表于 2024-8-23 08:58:48

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

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百二十五:AS5600磁编码器 磁感应角度测量传感器12bit高精度模块
项目实验之五:手动旋转步进电机轴,实时读取AS5600原始数据

实验开源代码

/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百二十五:AS5600磁编码器 磁感应角度测量传感器12bit高精度模块
项目实验之五:手动旋转步进电机轴,实时读取AS5600原始数据
*/

#include <SimpleFOC.h>
#include <Wire.h>

uint16_t readValue = 0;
byte readArray;

void setup() {
Serial.begin(115200);
Wire.begin(); // 初始化I2C
// 通知设备即将读取数据
Wire.beginTransmission(0x36);
Wire.write(0x0C);
Wire.endTransmission(false);
Serial.println("42步进电机准备就绪!手动旋转电机轴,准备读取数据");
}

void loop() {
// 读取数据的MSB和LSB
Wire.requestFrom(0x36, (uint8_t)2);
for (byte i = 0; i < 2; i++) {
    readArray = Wire.read();
}

// 根据传感器架构组合LSB和MSB寄存器的使用位
readValue = readArray * 256 + readArray;
Serial.print("实时读取AS5600原始数据为");
Serial.println(readValue);
delay(1000);
}


驴友花雕 发表于 2024-8-23 09:00:54

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

实验串口返回情况


驴友花雕 发表于 2024-8-23 09:47:23

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

居然通过手动,调到了0位置


驴友花雕 发表于 2024-8-23 10:11:18

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

方案之二,主要删掉了setup函数中的begintransmission()等函数。

这个函数主要用于开启传输,但是requestFrom函数本身就会向从机发送数据请求信号。

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百二十五:AS5600磁编码器 磁感应角度测量传感器12bit高精度模块
项目实验之六:无begintransmission()函数,简化读取AS5600原始数据

实验开源代码

/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百二十五:AS5600磁编码器 磁感应角度测量传感器12bit高精度模块
项目实验之六:无begintransmission()函数,简化读取AS5600原始数据
*/

#include <SimpleFOC.h>
#include <Wire.h>

uint16_t readValue = 0;
byte readArray;

void setup() {
Serial.begin(115200);
Wire.begin(); // 初始化I2C
Serial.println("完成初始化I2C,手动旋转电机轴,开始读取数据");
}

void loop() {
// 读取数据的MSB和LSB
Wire.requestFrom(0x36, (uint8_t)2);
for (byte i = 0; i < 2; i++) {
    readArray = Wire.read();
}

// 根据传感器架构组合LSB和MSB寄存器的使用位
readValue = readArray * 256 + readArray;
Serial.print("方案之二读取原始数据=");
Serial.println(readValue);
delay(1000);
}


驴友花雕 发表于 2024-8-23 10:14:23

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

实验串口返回情况


驴友花雕 发表于 2024-8-23 11:13:05

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

要点解读
1、库的正确使用:确保使用正确的库和函数。Arduino Uno的Wire库不支持传入多个参数来初始化I2C。
2、I2C初始化:使用Wire.begin()初始化I2C总线。
3、数据请求:使用Wire.requestFrom()直接向从机发送数据请求信号。
4、数据读取:使用Wire.read()获取传感器数据。
5、数据处理:将读取的MSB和LSB数据组合成一个16位的值,并通过串口输出,便于调试和验证。




驴友花雕 发表于 2024-8-23 11:15:32

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

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百二十五:AS5600磁编码器 磁感应角度测量传感器12bit高精度模块
项目实验之七:对读取到的AS5600原始数据进行低通滤波

实验开源代码

/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百二十五:AS5600磁编码器 磁感应角度测量传感器12bit高精度模块
项目实验之七:对读取到的AS5600原始数据进行低通滤波
*/

#include <Wire.h>
#include <SimpleFOC.h>

LowPassFilter as5600_filter(0.01); // 使用SimpleFOC库中的低通滤波器

void setup() {
Serial.begin(115200);
Wire.begin(); // 初始化I2C
Serial.println("完成初始化I2C,准备就绪,对数据进行低通滤波");
}

void loop() {
uint16_t readValue = 0;
byte readArray;

// 通知设备即将读取数据
Wire.beginTransmission(0x36);
Wire.write(0x0C);
Wire.endTransmission(false);

// 读取数据的MSB和LSB
Wire.requestFrom(0x36, (uint8_t)2);
if (Wire.available() == 2) {
    readArray = Wire.read();
    readArray = Wire.read();
    readValue = (readArray << 8) | readArray;
    float filteredValue = as5600_filter(readValue);
    Serial.print("低通滤波后的数据=");
    Serial.println(filteredValue);
} else {
    Serial.println("读取数据时出错!");
}
delay(1000);
}


驴友花雕 发表于 2024-8-23 11:24:53

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

实验串口返回情况



要点解读
避免类重定义:确保自定义类名称与库中的类名称不冲突。
使用库中的类:如果库中已有合适的类,可以直接使用,避免重复定义。
I2C初始化:使用Wire.begin()初始化I2C总线。
数据请求:使用Wire.requestFrom()直接向从机发送数据请求信号。
数据处理:将读取的MSB和LSB数据组合成一个16位的值,并通过低通滤波器进行处理,最后通过串口输出,便于调试和验证。


驴友花雕 发表于 2024-8-23 11:27:17

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

本帖最后由 驴友花雕 于 2024-8-23 11:28 编辑

一阶滤波算法的原理
一阶滤波,又叫一阶惯性滤波,或一阶低通滤波。是使用软件编程实现普通硬件RC低通滤波器的功能。

一阶低通滤波的算法公式为:

                         Y(n)=αX(n) + (1-α)Y(n-1)

式中:α=滤波系数;X(n)=本次采样值;Y(n-1)=上次滤波输出值;Y(n)=本次滤波输出值。

一阶低通滤波法采用本次采样值与上次滤波输出值进行加权,得到有效滤波值,使得输出对输入有反馈作用。

滤波系数越大,则更快达到目标开度,灵敏度越高,但曲线平滑性较差,滤波结果越不稳定;同样的滤波系数越小,则更慢达到目标开度,但曲线更加平滑,且稳定,但灵敏度较低。

因此在实际标定过程中,我们需要根据实际情况,平衡灵敏度和稳定性,来确定最终的滤波系数。

驴友花雕 发表于 2024-8-23 11:50:39

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

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百二十五:AS5600磁编码器 磁感应角度测量传感器12bit高精度模块
项目实验之八:使用Baize_FOC代码的示例,确保正确读取AS5600传感器的数据,
并进行低通滤波处理,是一个用于无刷电机驱动的开源项目

实验开源代码


/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百二十五:AS5600磁编码器 磁感应角度测量传感器12bit高精度模块
项目实验之八:使用Baize_FOC代码的示例,确保正确读取AS5600传感器的数据,
并进行低通滤波处理,是一个用于无刷电机驱动的开源项目
*/

#include <Wire.h>
#include <SimpleFOC.h>

// 使用SimpleFOC库中的低通滤波器
LowPassFilter as5600_filter(0.01);

void setup() {
Serial.begin(115200);
Wire.begin(); // 初始化I2C
Serial.println("已完成初始化I2C,Baize_FOC准备就绪");
}

void loop() {
uint16_t readValue = 0;
byte readArray;

// 通知设备即将读取数据
Wire.beginTransmission(0x36);
Wire.write(0x0C);
Wire.endTransmission(false);

// 读取数据的MSB和LSB
Wire.requestFrom(0x36, (uint8_t)2);
if (Wire.available() == 2) {
    readArray = Wire.read();
    readArray = Wire.read();
    readValue = (readArray << 8) | readArray;
    float filteredValue = as5600_filter(readValue);
    Serial.print("AS5600原始数据=");
    Serial.println(filteredValue);
} else {
    Serial.println("Error reading data");
}
delay(1000);
}

页: 1 [2] 3 4
查看完整版本: 【花雕学编程】Arduino动手做(225)---AS5600磁编码传感器