You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32通过SPI对接RLS AksIM-2绝对编码器输出始终为0的问题

问题排查与修复建议

针对你用ESP32 Wroom Dev模块对接RLS AksIM-2轴编码器时输出始终为0的问题,从代码逻辑和编码器协议角度分析,核心问题及修复方案如下:

1. 未遵循编码器的SPI命令规范

根据AksIM-2的SPI通信协议,读取位置数据需要发送对应命令字,而非全0的32位帧:

  • 读取单圈绝对位置需发送前8位为0x00的32位命令
  • 读取多圈绝对位置需发送前8位为0x04的32位命令

你当前发送的0x00000000虽然包含单圈命令,但需要明确:编码器会在主机发送命令的同时返回32位数据——前8位为状态位,后24位为有效位置数据,直接读取全0帧无法触发正确的数据返回逻辑。

2. 数据输出与解析方式不合理

你直接打印buffer的十进制值,即使编码器返回有效数据,也可能因高位为0导致显示异常。建议改为输出十六进制原始数据,并提取后24位位置值,便于排查:

Serial.print(buffer, HEX);
Serial.print(" | ");
Serial.println((buffer >> 8) & 0xFFFFFF); // 提取有效位置位

3. SPI初始化的冗余操作

ESP32的SPI库在调用SPI.begin(SCK, MISO, MOSI, SS)时,会自动配置引脚模式,无需手动执行pinMode设置,可简化代码避免冲突。

修复后的完整代码

#include <Arduino.h>
#include <SPI.h>
#define RLS_MOSI 16
#define RLS_MISO 17
#define RLS_SCK 18
#define RLS_SS 19

void setup() {
  Serial.begin(9600);
  digitalWrite(RLS_SS, HIGH); // 初始化前拉SS为高,避免干扰
  SPI.begin(RLS_SCK, RLS_MISO, RLS_MOSI, RLS_SS);
}

void getTheData() {
  SPI.beginTransaction(SPISettings(500000, MSBFIRST, SPI_MODE1));
  digitalWrite(RLS_SS, LOW);
  
  // 发送单圈位置读取命令(前8位0x00,后24位任意)
  uint32_t buffer = SPI.transfer32(0x00000000);
  
  digitalWrite(RLS_SS, HIGH);
  SPI.endTransaction();

  // 输出原始数据与解析后的位置
  Serial.print("原始数据(HEX): ");
  Serial.print(buffer, HEX);
  Serial.print(" | 单圈位置: ");
  Serial.println((buffer >> 8) & 0xFFFFFF, DEC);
}

void loop() {
  getTheData();
  delay(100);
}

额外排查方向

  • 确认SPI引脚接线:ESP32的MOSI/MISO/SCK/SS需与编码器对应引脚一一连接
  • 检查编码器供电:AksIM-2需匹配ESP32的电平(3.3V或5V,参考手册确认)
  • 尝试更换为ESP32默认硬件SPI引脚(如SCK=18、MISO=19、MOSI=23、SS=5),排除自定义引脚的兼容性问题

内容的提问来源于stack exchange,提问作者Adarsh TS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 11:35:37