AS5600改PWM输出

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);   // 可根据需要调整刷新速度

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

M创动工坊

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

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

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

打赏作者

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

抵扣说明:

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

余额充值