【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百二十五:AS5600磁编码器 磁感应角度测量传感器 12bit高精度模块
项目实验之十七:动态读取AS5600角度变化并设阙值LED报警
实验开源代码
- /*
- 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
- 实验二百二十五:AS5600磁编码器 磁感应角度测量传感器 12bit高精度模块
- 项目实验之十七:动态读取AS5600角度变化并设阙值LED报警
- */
-
- #include <Wire.h> // 包含Wire库,用于I2C通信
- #include <AS5600.h> // 包含AS5600库,用于与AS5600传感器通信
- #include <SimpleFOC.h> // 包含SimpleFOC库,用于低通滤波器
-
- // 使用SimpleFOC库中的低通滤波器
- LowPassFilter as5600_filter(0.01); // 创建一个低通滤波器对象,滤波系数为0.01
- #define AS5600_ADDRESS 0x36 // 定义AS5600传感器的I2C地址
- #define ANGLE_REG 0x0C // 定义AS5600传感器的角度寄存器地址
-
- AS5600 encoder; // 创建AS5600传感器对象
- const int ledPin = 13; // 定义LED引脚
-
- void setup() {
- Serial.begin(115200); // 初始化串口通信,波特率为115200
- Wire.begin(); // 初始化I2C通信
- Serial.println("完成初始化I2C,准备就绪!"); // 输出初始化完成信息
- pinMode(ledPin, OUTPUT); // 设置LED引脚为输出模式
- }
-
- void loop() {
- // 读取原始位置
- uint16_t rawPosition = readAS5600Angle(); // 调用函数读取AS5600传感器的原始角度数据
- float angle = (rawPosition * 360.0) / 4096.0; // 将原始数据转换为角度(度)
-
- // 使用低通滤波器平滑角度变化
- angle = as5600_filter(angle); // 使用低通滤波器平滑角度数据
-
- // 计算速度
- 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(" 度/秒");
-
- // 检测角度变化并触发LED报警
- if (abs(angle - last_angle) > 15.0) { // 如果角度变化超过15度
- Serial.println("警报: 角度变化超过阈值,点亮LED灯!"); // 输出警报信息
- digitalWrite(ledPin, HIGH); // 点亮LED
- delay(1000); // LED亮1秒
- digitalWrite(ledPin, LOW); // 熄灭LED
- }
-
- // 更新上一次的角度和时间
- last_angle = angle; // 更新上一次的角度
- last_time = current_time; // 更新上一次的时间
-
- delay(500); // 延迟500毫秒
- }
-
- uint16_t readAS5600Angle() {
- Wire.beginTransmission(AS5600_ADDRESS); // 开始与AS5600传感器的I2C通信
- Wire.write(ANGLE_REG); // 写入角度寄存器地址
- Wire.endTransmission(); // 结束I2C通信
- Wire.requestFrom(AS5600_ADDRESS, 2); // 请求从AS5600传感器读取2字节数据
- uint16_t angle = Wire.read() << 8 | Wire.read(); // 读取并组合两个字节的数据
- return angle; // 返回角度数据
- }
复制代码
|