AS5600磁编码器,默认OUT脚输出模拟量,改PWM输出,修改方式
使用I2C引脚修改
下面以ESP32单片机为例
I2C的SDA,SCL接默认的I2C引脚21和22
out脚接34号
GND接地
VCC接3.3V
代码如下:
/*打开 Arduino IDE → 库管理器 → 搜索并安装 AS5600(作者 RobTillaart)。在VSCode+PlatformIO里面同样记载这个库即可*/
#include <Wire.h>
#include <AS5600.h>
AS5600 as5600; // 默认 I2C 地址 0x36
#define PWM_INPUT_PIN 34 // AS5600 的 OUT 引脚接到 ESP32 GPIO34
// ======================
// 测量 PWM 占空比函数
// ======================
float measurePWMDuty() {
const uint32_t timeout = 30000; // 超时时间(微秒),对应约115Hz
// 测量一个完整周期的高电平时间
uint32_t highTime = pulseIn(PWM_INPUT_PIN, HIGH, timeout);
if (highTime == 0) {
return 0.0; // 测量失败
}
// 测量低电平时间(为了更准确)
uint32_t lowTime = pulseIn(PWM_INPUT_PIN, LOW, timeout);
if (lowTime == 0) {
return 0.0;
}
uint32_t totalTime = highTime + lowTime;
if (totalTime == 0) return 0.0;
return (highTime * 100.0) / totalTime;
}
void setup() {
Serial.begin(115200);
Wire.begin(); // ESP32 默认 SDA=21, SCL=22
pinMode(PWM_INPUT_PIN, INPUT); // 设置 GPIO34 为输入
delay(100);
Serial.println("=== AS5600 PWM 输出 + ESP32 PWM 读取测试 ===");
// 设置为 PWM 输出模式
bool success = as5600.setOutputMode(AS5600_OUTMODE_PWM);
if (success) {
Serial.println("✓ 成功设置为 PWM 输出模式");
} else {
Serial.println("✗ PWM 模式设置失败!");
}
// 设置 PWM 频率(115Hz 便于观察和测量)
as5600.setPWMFrequency(AS5600_PWM_115);
// 设置旋转方向(根据你的实际安装方向修改)
as5600.setDirection(AS5600_CLOCK_WISE);
delay(50);
// 打印配置寄存器,确认设置是否成功
uint16_t conf = as5600.getConfiguration();
Serial.print("当前 CONF 寄存器: 0x");
Serial.println(conf, HEX);
Serial.println("OUT 引脚已连接到 GPIO34");
Serial.println("开始读取角度...\n");
}
void loop() {
// 1. 通过 I2C 读取角度(推荐,最准确)
uint16_t raw = as5600.readAngle(); // 0 ~ 4095
float angle = raw * (360.0 / 4096.0); // 转换为角度
// 2. PWM 理论占空比
float duty_theory = (raw * 100.0) / 4096.0;
// 3. 通过 GPIO34 实际测量 PWM 占空比
float duty_measured = measurePWMDuty();
// 打印结果
Serial.printf("Raw: %4d | Angle: %6.1f° | Theory: %5.1f%% | Measured: %5.1f%%\n",
raw, angle, duty_theory, duty_measured);
delay(200); // 可根据需要调整刷新速度
}