Link

磁性传感器模拟输出设置

要用磁性位置传感器的模拟输出,首先创建一个MagneticSensorAnalog 的实例:

// MagneticSensorAnalog(uint8_t _pinAnalog, int _min, int _max)
//  pinAnalog     - 此引脚可以从磁性传感器读取模拟输出
//  min_raw_count - 预期读取的最小数值
//  max_raw_count - 读取的最大数值  
MagneticSensorAnalog sensor = MagneticSensorAnalog(A1, 14, 1020);

这个类的参数有:

  • pinAnalog - 读取磁性传感器模拟输出的引脚, ,
  • min_raw_count - 最小的预期读数。虽然你可能期望它是O,但通常是0~15。如果出现这种错误,将导致每次旋转会轻轻咔哒一下。
  • max_raw_count - 读取的最大值。虽然你可能期望它是2^10 = 1023,但它通常是1020~1023。注意:仅对于ESP32(带有12位ADC的MCU会接近4096)

💡 求最小值和最大值

每种mcu,每种传感器都有一点不同,所以我们建议你使用提供的例程 examples/sensor_test/magentic_sensor_analog_example/find_raw_min_max来确定你的传感器的最大值和最小值

最后,在初始化之后,唯一需要做的事情就是调用 init() 函数。该函数初始化传感器硬件。所以你的磁性传感器初始化代码如下:

MagneticSensorAnalog sensor = MagneticSensorAnalog(A1, 14, 1020);

void loop(){
  ...
  sensor.init();
  ...
}

如果你希望使用多个模拟输出的磁性传感器,请确保将它们的模拟输出引脚连接到不同的arduino ADC引脚上,并遵循上面的相同想法,这里是一个简单的例子:

MagneticSensorAnalog sensor1 = MagneticSensorAnalog(A1, 14, 1020);
MagneticSensorAnalog sensor2 = MagneticSensorAnalog(A2, 14, 1020);

void loop(){
  ...
  sensor1.init();
  sensor2.init();
  ...
}

请检查 magnetic_sensor_analog_example.ino 举个例子来了解更多。

实时使用磁性传感器

. 在这个库中有两种方法来使用磁性传感器:

  • 作为电机位置传感器,用于FOC算法
  • 作为独立位置传感器。

用于FOC算法的位置传感器

在本库中要用位置传感器来实现FOC算法的话,一旦初始化了 sensor.init() ,就需要链接到无刷直流电机:

motor.linkSensor(&sensor);

独立的传感器

要在任意时刻获取磁性传感器输出的速度和角度,可以用下面的公共函数:

class MagneticSensorSPI{
 public:
    // 获取轴速度
    float getVelocity();
  	// 获取轴角度
    float getAngle();
}
class MagneticSensorAnalog{
 public:
    // 获取轴速度
    float getVelocity();
  	// 获取轴角度
    float getAngle();
}

下面是一个使用AS5600磁性传感器模拟输出的快速示例:

#include <SimpleFOC.h>

// MagneticSensorAnalog(uint8_t _pinAnalog, int _min, int _max)
//  pinAnalog     - 此引脚可以从磁性传感器读取模拟输出
//  min_raw_count - 预期读取的最小数值 
//  max_raw_count - 读取的最大数值  
MagneticSensorAnalog sensor = MagneticSensorAnalog(A1, 14, 1020);

void setup() {
  // 监视点
  Serial.begin(115200);

  // 初始化磁性传感器硬件
  sensor.init();

  Serial.println("Sensor ready");
  _delay(1000);
}

void loop() {
  // 在终端显示角度和角速度
  Serial.print(sensor.getAngle());
  Serial.print("\t");
  Serial.println(sensor.getVelocity());
}