l2C磁性传感器设置
要用基于I2C的磁性位置传感器,首先创建一个MagneticSensorI2C
类的实例:
// MagneticSensorI2C(uint8_t _chip_address, float _cpr, uint8_t _angle_register_msb)
// chip_address - I2C芯片地址
// bit_resolution - 传感器分辨率
// angle_register_msb - 角度读取寄存器msb
// bits_used_msb - msb寄存器使用的分辨率位数
MagneticSensorI2C sensor = MagneticSensorI2C(0x36, 12, 0x0E, 4);
这个类的参数有:
chip_address
- I2C 磁性传感器的地址bit_resolution
-传感器的分辨率(传感器内部计数器寄存器的位数)angle_register_msb
- 包含MSB部分角度值的寄存器。( ex. AS5600 -0x0E
, AS5048 -0xFE
)bits_used_msb
- MSB寄存器中使用的位数
如何找到MSB的寄存器值和使用的位数?
由于I2C寄存器是字节(8位)寄存器,它们包含12-14位的角度,用两个字节地址分隔开,分别是MSB(最高有效字节)和LSB(最低有效字节)。要实例化I2C磁性传感器,你需要提供MSB寄存器地址,并告知这两个寄存器所存储的角度值是如何分隔的。通过指定MSB寄存器包含的位数和bit_resolution
值,库可以计算出LSB寄存器中使用了多少位,并可以重建完整的角度值。
示例MSB / LSB:
- AS5600 (12 bit) - MSB (4bit), LSB (8bit)
- AS5048B (14bit): - MSB (8bit), LSB(6bit)
以AS5600为例
- 首先我们打开传感器 AS5600 的 datasheet .
- 在数据表中,我们找到了l2C寄存器表(第18页)
angle_register_msb
的值是第一个(在数据表的上部)寄存器值 -0x0E
bits_used_msb
的值是MSB寄存器中的位数 -4
在配置相关参数后,唯一要做的是调用 init()
函数。该函数预备了I2C接口和初始化传感器。磁性传感器初始化代码如下:
MagneticSensorI2C sensor = MagneticSensorI2C(0x36, 12, 0x0E, 4);
void loop(){
...
sensor.init();
...
}
如果你希望使用多个I2C磁性传感器,请确保你的传感器有不同的地址,这里是一个简单的示例:
MagneticSensorI2C sensor1 = MagneticSensorI2C(0x36, 12, 0x0E, 4);
MagneticSensorI2C sensor2 = MagneticSensorI2C(0x37, 12, 0x0E, 4);
void loop(){
...
sensor1.init();
sensor2.init();
...
}
多I2C总线
此外,本库可以使用 init()
函数将已经配置好的 I2C 总线配置到传感器。
Wire.setClock(400000);
Wire.begin();
// 假定
sensor.init(&Wire)
对于可能的微控制器(Arduino UNO除外),你可以为多个 I2C 传感器使用不同的l2C总线 。例子: utils > sensor_test > magnetic_sensors > magnetic_sensor_i2c_dual_bus_examples
.
常见传感器的快速配置
对于最常见的 I2C 磁性传感器,该库提供了简化的配置构造函数。即AS5600 12位传感器和AS5048 14位传感器
// AS5600传感器实例
MagneticSensorI2C sensor2 = MagneticSensorI2C(AS5600_I2C);
// AS5048B传感器实例
MagneticSensorI2C sensor2 = MagneticSensorI2C(AS5048_I2C);
如果你想实现自己的快速配置结构,你需要创建一个结构的实例:
struct MagneticSensorI2CConfig_s {
int chip_address;
int bit_resolution;
int angle_register;
int data_start_bit;
};
并将其提供给构造函数,下面是一个示例:
// 配置AS5600传感器
MagneticSensorI2CConfig_s MySensorConfig = {
.chip_address = 0x36,
.bit_resolution = 12,
.angle_register=0x0E,
.data_start_bit=11
};
// 在传感器类中配置所需的传感器
MagneticSensorI2C sensor = MagneticSensorI2C(MySensorConfig);
void setup(){
sensor.init();
...
}
请检查 magnetic_sensor_i2_example.ino
举一个快速测试你的传感器的例子。l2C磁性传感器的所有功能在MagneticSensorI2C.cpp/h
的文件上实现。
实时使用磁性传感器
在这个库中有两种方法来使用磁性传感器:
- 作为电机位置传感器,用于FOC算法
- 作为独立位置传感器
用于FOC算法的位置传感器
在本库中要用位置传感器来实现FOC算法的话,一旦初始化了 sensor.init()
,就需要链接到无刷直流电机
motor.linkSensor(&sensor);
独立的传感器
要在任意时刻获取磁性传感器输出的速度和角度,可以用下面的公共函数:
class MagneticSensorI2C{
public:
// 获取轴速度
float getVelocity();
// 获取轴角度
float getAngle();
}
下面是一个带有12C通信的AS5600磁性传感器的快速示例:
#include <SimpleFOC.h>
// MagneticSensorI2C(uint8_t _chip_address, float _cpr, uint8_t _angle_register_msb)
// chip_address - I2C芯片地址
// bit_resolution - 传感器分辨率
// angle_register_msb - 角度读取寄存器msb
// bits_used_msb - msb寄存器使用的分辨率位数
MagneticSensorI2C as5600 = MagneticSensorI2C(0x36, 12, 0x0E, 4);
// 快速配置
MagneticSensorI2C as5600 = MagneticSensorI2C(AS5600_I2C);
void setup() {
// 监视点
Serial.begin(115200);
// 初始化磁性传感器硬件
as5600.init();
Serial.println("AS5600 ready");
_delay(1000);
}
void loop() {
// 在终端显示角度和角速度
Serial.print(as5600.getAngle());
Serial.print("\t");
Serial.println(as5600.getVelocity());
}