共计 1381 个字符,预计需要花费 4 分钟才能阅读完成。
为什么选择 AS5047P?
在机器人关节和电机控制中,角度测量是核心需求。与增量式编码器相比,AS5047P 这类绝对式磁编码器有三大优势:

- 断电后仍能保持位置信息(增量式编码器需要重新寻零)
- 直接输出绝对角度值,省去脉冲计数电路
- 非接触式设计,寿命更长(AS5047P Datasheet §1.2)
但实际应用中常遇到以下痛点:
- SPI 信号干扰:长距离传输时波形畸变
- 机械安装偏差:磁铁偏心导致非线性误差
- 实时性挑战:高速旋转时的延迟问题
硬件设计关键点
推荐电路设计
STM32F4 与 AS5047P 的典型连接方案(原理图核心部分):
// SPI 接口定义
#define NSS_PIN GPIO_PIN_4
#define SCK_PIN GPIO_PIN_5
#define MISO_PIN GPIO_PIN_6
#define MOSI_PIN GPIO_PIN_7
// 关键元件选型:// 1. 磁珠 FB1/FB2:0603 封装,100Ω@100MHz
// 2. 去耦电容:0.1μF X7R 陶瓷电容
布线注意事项
- 双绞线使用建议:
- SPI 时钟线 (SCK) 与地线双绞
- 数据线 (MOSI/MISO) 单独与地线双绞
- 实测显示:10cm 平行线比双绞线噪声高 30%(测试条件:1MHz 时钟)
软件驱动实现
HAL 库基础驱动
// 读取角度值(带 CRC 校验)uint16_t AS5047P_ReadAngle(void)
{uint8_t txBuf[2] = {0xFF, 0xFD}; // 读取命令 +CRC
uint8_t rxBuf[2];
HAL_GPIO_WritePin(GPIOA, NSS_PIN, GPIO_PIN_RESET);
HAL_SPI_TransmitReceive(&hspi1, txBuf, rxBuf, 2, 100);
HAL_GPIO_WritePin(GPIOA, NSS_PIN, GPIO_PIN_SET);
if(VerifyCRC(rxBuf)) // CRC 校验函数
return (rxBuf[0] << 6) | (rxBuf[1] >> 2); // 14 位有效数据
else
return 0xFFFF; // 错误标志
}
DMA 传输优化
- 配置 SPI DMA 通道为循环模式
- 预填充 TX 缓冲区为连续读取命令
- 开启 DMA 半传输 / 传输完成中断
校准与补偿
非线性补偿算法
// 二阶多项式补偿
float CompensateAngle(uint16_t raw_val)
{
static const float a2 = 0.00015f; // 二次项系数
static const float a1 = 1.0012f; // 一次项系数
float normalized = raw_val / 16384.0f; // 归一化
return (a2 * normalized * normalized + a1 * normalized) * 360.0f;
}
温度补偿方案
- 每 5℃记录一次零点偏移
- 建立查找表进行实时补偿
避坑指南
- 寄存器写入失败:
- 检查写保护位(AS5047P Datasheet §8.3)
-
确保 NSS 信号下降沿与 SCK 第一个上升沿间隔 >100ns
-
磁铁安装:
- 最佳气隙距离:0.5-2mm(取决于磁铁强度)
-
偏心误差应 <0.5mm
-
批量校准:
- 制作治具固定磁铁位置
- 自动旋转测试台采集 360 点数据
进阶思考
动态精度提升方向:
– 结合卡尔曼滤波预测运动轨迹
– 自适应补偿转速变化引起的滞后误差
(完整工程代码可在公众号【嵌入式技术圈】回复 ”AS5047P” 获取)
正文完
