AS5600磁编码器的使用以及简单的滤波算法(arduino)

目录

前言

实践

示例一:发现IIC设备

示例二:读取AS5600原始数据

示例三:对读取到的AS5600原始数据进行低通滤波

1. 一阶滤波算法的原理 

2.编程实现


前言

AS5600磁编码器常用于电机的角位移测量,如下图为使用AS5600芯片的一款编码器。

 该磁编码器支持IIC,SPI和模拟输出三种方式,具体的引脚定义如下:

这款编码器的原理图如下:

 AS5600的iic地址为0X36,数据所在寄存器地址如下

在这里插入图片描述

实践

示例一:发现IIC设备

Baize_Foc的iic口是25,26或者26,25

I2Cone.begin(26, 25, 400000); 

主程序 

#include <SimpleFOC.h>
TwoWire I2Cone = TwoWire(0);
 
void setup(){
  Serial.begin(115200); 
  I2Cone.begin(18, 5, 100000); 
  for(int i=0;i<127;i++)
  {
    I2Cone.beginTransmission(i);
    if(I2Cone.endTransmission()==0)
    {
      Serial.print("0x");
      Serial.println(i,HEX);
    }
  }
}
 
void loop(){}

 可以查看串口看效果:

可以发现,单片机已经发现了其他的iic设备

示例二:读取AS5600原始数据

#include <SimpleFOC.h>
TwoWire I2Cone = TwoWire(0);

uint16_t readValue = 0;
byte readArray[2];

void setup(){
  Serial.begin(115200); 
  I2Cone.begin(18, 5, 400000); 
  // notify the device that is aboout to be read
  I2Cone.beginTransmission(0X36);
  I2Cone.write(0X0C);
  I2Cone.endTransmission(false);
}
 
void loop(){
  // read the data msb and lsb
  I2Cone.requestFrom(0X36, (uint8_t)2);
  for (byte i=0; i < 2; i++) {
    readArray[i] = I2Cone.read();
  }

  // depending on the sensor architecture there are different combinations of 
  // LSB and MSB register used bits
  // AS5600 uses 0..7 LSB and 8..11 MSB
  // AS5048 uses 0..5 LSB and 6..13 MSB
  //readValue = ( readArray[1] &  lsb_mask );
  //readValue += ( ( readArray[0] & msb_mask ) << lsb_used );
  readValue=readArray[0]*256+readArray[1];
  Serial.println(readValue);
  delay(100);
}

可以从串口查看效果:

可以看到,当我用手旋转电机一圈的过程中,这个数字从0增加到了4095 

以下示例也可以:

主要删掉了setup函数中的begintransmission()等函数。

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

#include <SimpleFOC.h>

TwoWire I2Cone = TwoWire(0);

uint16_t readValue = 0;
byte readArray[2];
 
void setup(){
  Serial.begin(115200); 
  I2Cone.begin(18, 5, 400000); 
}
 
void loop(){
  // read the data msb and lsb
  I2Cone.requestFrom(0X36, (uint8_t)2);
  for (byte i=0; i < 2; i++) {
    readArray[i] = I2Cone.read();
  }
 
  // depending on the sensor architecture there are different combinations of 
  // LSB and MSB register used bits
  // AS5600 uses 0..7 LSB and 8..11 MSB
  // AS5048 uses 0..5 LSB and 6..13 MSB
  //readValue = ( readArray[1] &  lsb_mask );
  //readValue += ( ( readArray[0] & msb_mask ) << lsb_used );
  readValue=readArray[0]*256+readArray[1];
  Serial.println(readValue);
  delay(100);
}


示例三:对读取到的AS5600原始数据进行低通滤波

这里我们把读取到的数据,进行一个低通滤波处理。

1. 一阶滤波算法的原理 

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

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

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

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

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

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

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

2.编程实现

#include <SimpleFOC.h>

class LowPassFilte{
  public:
    LowPassFilte(float Tf);//低通滤波器时间常量
    ~LowPassFilte() = default;
    float operator() (float x);
    float Tf; //!< 低通滤波器时间常量
  protected:
    unsigned long timestamp_prev;  //!< 上次执行时间戳
    float y_prev; //!< 经过上次执行后过滤到的值
};

LowPassFilte::LowPassFilte(float time_constant)
    : Tf(time_constant)
    , y_prev(0.0f)
{
    timestamp_prev = micros();
}

float LowPassFilte::operator() (float x)
{
    unsigned long timestamp = micros();
    float dt = (timestamp - timestamp_prev)*1e-6f;

    if (dt < 0.0f || dt > 0.5f)
        dt = 1e-3f;

    float alpha = Tf/(Tf + dt);
    float y = alpha*y_prev + (1.0f - alpha)*x;

    y_prev = y;
    timestamp_prev = timestamp;
    return y;
}

TwoWire I2Cone = TwoWire(0);
LowPassFilte as5600_filter(0.001);

void setup(){
  Serial.begin(115200); 
  I2Cone.begin(18, 5, 400000); 
  I2Cone.beginTransmission(0X36);
  I2Cone.write(0X0C);
  I2Cone.endTransmission(false);
}
 
void loop(){
  // read the data msb and lsb
  I2Cone.requestFrom(0X36, (uint8_t)2);
  byte readArray[2];
  for (byte i=0; i < 2; i++) {
    readArray[i] = I2Cone.read();
  }
  uint16_t readValue = 0;
  readValue=readArray[0]*256+readArray[1];
//  Serial.print(readValue);
//  Serial.print(",");
  Serial.println(as5600_filter(readValue));
}

使用Baize_FOC代码

#include <SimpleFOC.h>
 
class LowPassFilte{
  public:
    LowPassFilte(float Tf);//低通滤波器时间常量
    ~LowPassFilte() = default;
    float operator() (float x);
    float Tf; //!< 低通滤波器时间常量
  protected:
    unsigned long timestamp_prev;  //!< 上次执行时间戳
    float y_prev; //!< 经过上次执行后过滤到的值
};
 
LowPassFilte::LowPassFilte(float time_constant)
    : Tf(time_constant)
    , y_prev(0.0f)
{
    timestamp_prev = micros();
}
 
float LowPassFilte::operator() (float x)
{
    unsigned long timestamp = micros();
    float dt = (timestamp - timestamp_prev)*1e-6f;
 
    if (dt < 0.0f || dt > 0.5f)
        dt = 1e-3f;
 
    float alpha = Tf/(Tf + dt);
    float y = alpha*y_prev + (1.0f - alpha)*x;
 
    y_prev = y;
    timestamp_prev = timestamp;
    return y;
}
 
TwoWire I2Cone = TwoWire(0);
LowPassFilte as5600_filter(0.01);
 
void setup(){
  Serial.begin(115200); 
  I2Cone.begin(26, 25, 400000); 
  I2Cone.beginTransmission(0X36);
  I2Cone.write(0X0C);
  I2Cone.endTransmission(false);
}
 
void loop(){
  // read the data msb and lsb
  I2Cone.requestFrom(0X36, (uint8_t)2);
  byte readArray[2];
  for (byte i=0; i < 2; i++) {
    readArray[i] = I2Cone.read();
  }
  uint16_t readValue = 0;
  readValue=readArray[0]*256+readArray[1];
//  Serial.print(readValue);
  Serial.println(readValue);
  Serial.print(",");
  Serial.println(as5600_filter(readValue));
}

 

 通过arduino的串口监视器,我们可以看到滤波后的数据跳动范围更小,变化更加平缓。

原数值

 滤波后数值

 放在一起对比(蓝色为原数值,红色为滤波后数值)

我们把时间常数从0.001改成0.01,可以看到输出数据更加稳定了。

参考链接:

1.算法学习笔记之一阶低通滤波算法_一颗偏执的心-CSDN博客_低通滤波算法

  • 26
    点赞
  • 234
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
### 回答1: AS5600编码器是一种常用于角度测量的传感器。它可以测量360度范围内的角度,并输出相应的数字信号。以下是对AS5600编码器中文手册的回答。 AS5600编码器中文手册提供了关于该传感器的详细信息和使用指南。手册的内容主要包括以下几个方面: 1. 产品介绍:手册首先介绍了AS5600编码器的特点和应用领域。它强调了该传感器的高精度、低功耗和简单的安装方式等优点。 2. 技术规格:手册详细列出了AS5600编码器的技术规格,包括工作电压、测量范围、角度分辨率、输出接口等。这些规格信息可以帮助用户了解和选择适合自己需求的编码器。 3. 连接与安装:手册提供了AS5600编码器的连接方式和安装指南。它介绍了传感器与其他硬件设备(如Arduino、STM32等)的连接方法,并给出了一些示意图和实例。 4. 参数设置:手册详细介绍了AS5600编码器的参数设置方法。用户可以通过设置不同的参数实现对编码器的不同功能调整,如角度偏移校准、输出范围选择等。 5. 常见问题与故障排除:手册列出了一些用户在使用AS5600编码器时可能遇到的常见问题,并给出了解决方法。这些问题包括传感器输出异常、信号干扰等。 总之,AS5600编码器中文手册提供了对该传感器的全面介绍和使用指南,帮助用户了解和正确使用编码器。它是理解AS5600编码器技术和解决相关问题的重要参考资料。 ### 回答2: AS5600是一种编码器,它提供了许多有用的功能和特性,适用于各种应用。在AS5600编码器的中文手册中,我们将找到详细的说明和指导,以帮助我们更好地理解和使用它。 首先,手册将介绍AS5600的基本工作原理和场感应技术。它将解释如何正确地安装和连接编码器,以确保准确的测量和传输数据。 手册中还将介绍如何设置和配置AS5600,以满足特定应用需求。这包括调整解析度、选择不同的输出接口和通信协议。此外,手册还将提供有关如何使用其内置的自动校准功能和低功耗模式的详细说明。 在手册的详细规格部分,我们将获得有关AS5600的技术参数和性能特征的详细信息。这些包括测量范围、精度、分辨率、最大速度和供电电压要求等。这些技术数据对于工程师在设计和应用中起到至关重要的作用。 此外,手册还提供针对常见问题和故障排除的解决方案。这些指导将帮助用户快速识别和解决可能出现的问题,确保设备的正常运行。 总之,在AS5600编码器的中文手册中,我们将找到关于安装、配置、规格和故障排除等方面的详细指导。这将使用户更加容易理解和使用这款编码器,以便在各种应用中取得更好的效果。 ### 回答3: as5600编码器是一种具有性传感器的编码器,用于检测旋转运动。它采用非接触式的测量原理,能够实时准确地测量转动物体的角度,并将其转换为数字输出信号。 as5600的中文手册包含了该编码器的详细技术参数和使用说明,旨在帮助用户更好地理解和使用该产品。手册内容主要包括以下几个方面: 1. 产品概述:手册首先介绍了as5600编码器的特点和应用领域,以及产品的外观和结构。 2. 技术参数:手册详细列出了as5600的主要技术指标,包括分辨率、精度、工作电压、温度范围等,并提供了典型应用方案和电气连接图。 3. 功能介绍:手册进一步介绍了as5600的各项功能,包括零点校准、过零检测、PWM输出等。针对不同的应用需求,手册详细说明了如何设置和调试这些功能。 4. 使用说明:手册提供了as5600的安装和使用指南,包括安装位置、连接方式和注意事项等。此外,手册还介绍了常见问题的解决方法和维护保养建议。 5. 应用实例:手册最后给出了一些实际应用案例,展示as5600在不同领域的应用效果和使用范例。这些案例可以帮助用户更好地了解产品的实际应用情况和使用方法。 总之,as5600编码器中文手册通过详细的技术说明和实用的应用示例,为用户提供了一份全面的使用指南。该手册的详尽内容和清晰的表达将有助于用户更好地了解和操作as5600编码器
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Allen953

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值