开篇:机器人最头疼的 “掉电归零” 到底有多痛?

不知道做机器人、伺服、执行器开发的朋友们有没有遇到过这种崩溃现场:

设备正在正常运行,突然断电、急停、跳闸。等再次上电,机器人关节、丝杆执行器直接 “失忆”,完全不知道自己身处哪个位置。 ✅ 传统处理方式:必须执行回零操作,机械机构跑到原点找基准。

带来的现实代价:

  1. 生产停机:流水线、协作机器人断电重启,回零占用宝贵工时,工厂产能直接受损;
  2. 安全风险:人形机器人、起重设备、医疗设备,如果掉电后被外力拨动关节,上电直接会发生误动作,有碰撞损坏风险;
  3. 硬件妥协:为了记住圈数,要么加装笨重的齿轮多圈编码器,要么外挂备用电池,要么使用韦根德能量收集模块,体积、寿命、维护都是大坑Analog Dev...。

多圈掉电记忆,不是加分项,是高端机器人的刚需! 如果断电之后,哪怕外部外力转动关节,芯片依然默默记录一共转了多少圈,上电直接读出绝对位置,不需要回零、不需要电池、不需要齿轮,这会是什么体验?ADI 的 ADMT4000 就是这样一颗颠覆性单芯片多圈绝对位置传感器。

传统多圈方案大盘点:各有各的短板

在 ADMT4000 出现之前,行业主要是 3 套主流多圈解决方案,我们简单对比一下:

表格

方案实现原理核心痛点
机械齿轮多圈编码器齿轮组机械记录圈数体积巨大、齿轮磨损、抗冲击差、成本高,不适合小型关节
电池备份多圈单圈传感器 + 锂电池,断电电池供电保存圈数电池寿命有限,需要定期维护更换;低温环境电池性能衰减,有爆炸风险,增加布线空间
韦根德(Wiegand)能量收集转轴转动发电,写入 FRAM 存储圈数转轴必须转动才能发电记录;断电静止被外力转动,无法记录圈数,容易丢圈出错

以上方案,都没办法完美实现:完全无源,断电无论转轴是否转动,都可以记录旋转圈数,这就是 ADMT4000 瞄准的市场空白Analog Dev...。

主角登场:ADMT4000,什么叫 True Power‑On 真上电多圈?

ADMT4000 是 ADI 推出的单芯片磁性多圈绝对位置传感器,封装是 24 引脚 TSSOP,小小的一颗芯片,就集成完整多圈检测链路,不需要外接齿轮,不需要备用电池Analog Dev...。

✨核心硬核参数(来自官方 datasheet)

  • 最大测量圈数:46 圈,总角度 16560°(>16k°)
  • 角度精度:±0.25°
  • 采样速率:100kSPS
  • 工作磁场窗口:16‑31mT,搭配普通钕铁硼磁铁即可工作
  • 供电 VDD:3.3V;数字接口 VDRIVE:1.7V‑5.5V,兼容绝大多数 MCU 电平
  • 温度范围:结温‑40℃~+150℃,满足严苛工业环境
  • 通信接口:标准 SPI Mode0;内置温度传感器、过压欠压故障诊断;支持片内谐波校准,修正磁铁、机械安装带来的误差。

🛠️内部三套传感器协同工作

芯片内部集成 3 套磁传感单元,分工明确:

  1. GMR 巨磁阻多圈计数传感器【核心黑科技】 基于磁性纳米螺旋导线,依靠磁畴壁物理位置记录旋转圈数。关键点:这个记录过程完全不需要供电! 断电之后,外部磁铁旋转,内部磁畴壁跟随移动,物理状态永久保存,不用电维持。上电直接读取畴壁位置,就能知道断电期间一共转了多少圈,这就是 True Power‑On 真上电多圈的来源。
  2. GMR 象限检测传感器 用来把 AMR 的 180° 输出拓展到完整 0‑360° 全周角度。
  3. AMR 各向异性磁阻角度传感器 负责高精度单圈角度测量,输出 sin/cos 原始信号,芯片内部 ADC 运算,输出经过补偿校准后的角度数据。

三者数据融合,上电一瞬间直接输出【总圈数 + 当前单圈角度】完整绝对位置,不需要回零,不需要外部运算。

⚠️关键使用边界(开发务必看)

  • 无源掉电记录有效区间:0‑46 圈。断电时,如果磁铁旋转超过 46 圈范围,圈数会出错,无故障标志位输出,机械设计要控制行程在此区间内。
  • 可以软件读取 FAULT 故障寄存器,监控磁场异常、圈数校验异常、电源异常等问题。
  • GMR 计数传感器在装配完成之后,需要执行一次磁复位;可以用 315° 方向 > 60mT 外磁场,或者顺时针旋转磁铁 46 圈完成复位操作。

不止读角度!这些实用功能设计工程师要知道

  1. 片内硬件谐波校准 机械安装偏移、磁铁倾斜、磁铁磁化偏差,都会引入 1/2/3/8 次谐波误差。ADMT4000 内部提供对应寄存器,采集多圈数据做 FFT 之后,直接把谐波系数写入芯片,硬件实时补偿,不用 MCU 做复杂校正运算,大幅降低主控负担。
  2. IIR 角度滤波 内置一阶 IIR 低通滤波器,公式:Out[n]=Out[n‑1]+(In[n]‑Out[n‑1])/16,开启后角度噪声可以从 0.25°RMS 降低到 0.03°RMS;注意:单次 One‑shot 采样模式不推荐开启滤波,容易引入误差。滤波带来约 135μs 的固定延迟,高速旋转场景需要评估延迟带来的附加误差。
  3. 丰富诊断与保护 FAULT 寄存器汇总各类故障:磁场半径异常、GMR 圈数校验不匹配、NVM 存储器 ECC 错误、VDD/VDRIVE 过压欠压;SPI 通讯附带 CRC5 校验,保障工业环境通讯可靠性。
  4. 两种采样模式
  • 连续转换模式:芯片持续自动采样更新角度;
  • One‑shot 单次触发模式:CNV 引脚外部信号触发一次采样,适合低功耗场景,需要时才采集位置数据。
  1. 多路 GPIO 复用引脚:BUSY、ACALC、CNV 触发、BOOTLOAD 启动状态,硬件引脚可以同步提示测量状态,不用频繁轮询 SPI 寄存器。

🎯真实落地场景,它改变了什么?

  1. 协作机器人 / 人形机器人关节 小型关节内部空间寸土寸金。传统方案齿轮编码器体积大;电池方案要预留电池仓和维护。ADMT4000 一颗 TSSOP 芯片,PCB 贴装,磁铁放转轴末端。断电后哪怕外力掰动关节,上电直接读取关节绝对位置,省去回零流程,提升设备安全性和开机效率。
  2. 线性执行器、丝杆模组 丝杆伸出缩回对应多圈旋转。以往需要额外外置线性位移传感器,现在只靠 ADMT4000 读取旋转圈数换算行程,节省一个传感器 BOM 成本。断电丝杆被外力推动,重启依然知道实际位置。
  3. 起重、卷扬机、拉线编码器 吊具断电后重物可能带动卷筒转动。传统设备上电必须回原点;ADMT4000 掉电记录圈数,上电直接获取吊具高度,极大提升设备安全。
  4. 汽车执行器、医疗设备 不允许上电回零的安全关键设备,零维护需求,避免电池老化带来的失效风险。

📌硬件小提示:PCB 设计,VDD、DV18、VDRIVE 电源引脚必须就近放置 X8R 材质去耦电容;不用的 GPIO 引脚,需要通过 100kΩ 电阻下拉 / 上拉,参考 datasheet 典型应用电路。

总结:ADMT4000 的价值到底是什么?

很多人只看到参数 ±0.25° 精度、46 圈量程,真正的核心价值是技术范式改变: ✅ 抛弃机械齿轮,抛弃备用电池,抛弃韦根德能量收集模块; ✅ 真正无源物理存储圈数:断电期间转轴无论动或者不动,都记录旋转信息; ✅ 单芯片集成 ADC、校准、故障诊断,MCU 只需要简单 SPI 读取绝对角度; ✅ 工业宽温,片内谐波补偿,降低整机机械装配公差要求。

当然它不是万能:最大有效掉电记忆 46 圈,机械行程设计要控制在该区间;装配后必须做 GMR 磁复位;磁铁选型要保证全温度范围磁场落在 16‑31mT 窗口内。

对于机器人、自动化设备开发者,如果你正在被 “掉电回零、电池维护、编码器体积大” 折磨,ADMT4000 这套 True Power‑On 技术,值得放进方案选型清单。

附录 A:ADMT4000 开发踩坑清单(硬件 + 固件必看)

以下内容均来自官方 datasheet Rev.A 的逐条核对,建议开发前打印贴在工位上。

A.1 硬件设计踩坑

表格

序号踩坑点正确做法来源
1电源去耦随便放VDD、DV18、VDRIVE 引脚就近放置 X7R/X8R 去耦电容,参考 datasheet 典型应用电路Pin 配置章节
2未用 GPIO 悬空所有未使用的 GPIO 引脚必须通过100kΩ 电阻上拉或下拉,禁止悬空Pin 功能描述
3RESET 引脚误解Pin22 的 RESET 只复位数字和模拟电路,不复位 GMR 圈数传感器;GMR 需要单独磁复位Pin22 描述
4磁铁磁场不做温度校核工作磁场窗口 16~31mT,必须在全温度范围内校核磁铁剩磁衰减,低温 / 高温都不能越界电气特性表
5SPI 时钟极性配错ADMT4000 使用SPI Mode0:CPOL=0, CPHA=0,数据在 SCLK 上升沿采样、下降沿输出SPI 时序章节

A.2 上电初始化踩坑

表格

序号踩坑点正确做法
1上电立刻读角度上电后需等待BOOTLOAD (Pin4) 变低(典型启动时间 10ms),NVM 加载完成后再操作 SPI
2忽略 FAULT 寄存器上电值FAULT 寄存器上电复位值为0xFFFF,必须先读一次确认所有位可置 1,再写 0x0000 清零
3忘记 GMR 磁复位装配完成后必须执行一次 GMR 圈数传感器复位,否则圈数可能不准;复位方式见 A.4
4直接读 ABSANGLE 当有效第一次转换序列完成前 ABSANGLE 为复位值 0xDB00,需等待 BUSY 变低或转换计数器递增后再读

A.3 多圈量程与掉电记忆踩坑(最关键!)

表格

序号踩坑点正确做法
1以为 46 圈是 AMR 量程True Power-On 掉电记忆只有 0~46 圈有效(GMR 传感器);AMR 推导圈数 - 9~54 圈仅用于校准,不能用于正常掉电记忆
2掉电超 46 圈以为会报故障断电状态下旋转超过 46 圈,上电后角度可能错误,且不会置 FAULT 标志位! 机械设计必须硬限制行程在 0~46 圈内
3忽略圈数交叉校验FAULT 寄存器D13 位是 GMR 圈数与 AMR 圈数交叉校验位,差值超过 0.5 圈会置位,固件必须轮询此位
4以为 D9 位是普通故障FAULT 寄存器D9 位表示 GMR 圈数传感器检测到假状态(非法畴壁位置),出现后必须执行 GMR 磁复位

A.4 GMR 磁复位操作(必做!)

装配完成后,或 FAULT D9/D13 置位时,必须复位 GMR 圈数传感器,二选一:

方式一:外磁场复位(推荐量产用)

  • 315° 方向施加>60mT外磁场,保持≥10μs
  • 注意:如果应用磁铁已安装,合成磁场(应用磁铁 + 复位磁场)需 > 60mT

方式二:机械旋转复位(调试用)

  • 将系统磁铁顺时针连续旋转 46 圈以上

复位完成后:

  1. 中止当前转换序列(CNVPAGE bits [15:14] 写 0b11)
  2. 重新启动转换序列(CNVPAGE bits [15:14] 写 0b00)
  3. 此时圈数显示为 45 + 实际复位角度,属正常现象

A.5 IIR 滤波器使用踩坑

表格

序号踩坑点正确做法
1以为滤波默认关闭GENERAL 寄存器默认值0x1230,bit12(ANGLFILT)=1,滤波默认开启
2One-Shot 模式开滤波官方明确建议:One-Shot 单次采样模式不要开启 IIR 滤波,有效采样数不足会引入误差
3忽略滤波延迟IIR 滤波覆盖当前 + 前 15 次测量,引入约15×9μs=135μs 固定延迟,高速旋转场景需评估附加误差
4极端圈数时滤波异常圈数 > 53.5 圈或 <-8.5 圈时滤波自动旁路,角度数据正确但未滤波,属正常保护机制

A.6 谐波校准踩坑

表格

序号踩坑点正确做法
1以为只有 1/2/3 次谐波支持1/2/3/8 次谐波校准,8 次谐波默认用工厂值,可通过 GENERAL bit10 (H8CNTRL)=1 切换为用户值
2校准时不开启 CNVSYNC官方建议校准时设置 GENERAL bits14:13=0b11,用外部 CNV 信号同步 SINE/COSINE 采样,减小相位误差
3校准后不复位 GMRAMR 角度校准完成后,强烈建议再做一次 GMR 磁复位,确保整体处于已知良好状态

附录 B:SPI 读写伪代码示例(可直接移植)

B.1 SPI 帧格式回顾

ADMT4000 使用32 位 SPI 帧访问 16 位寄存器,SPI Mode0(CPOL=0, CPHA=0),MSB 先传。

读操作帧结构(32 位):

Bit31  : 忽略位(任意值)
Bit30  : R/W位 = 0(读)
Bit29-24: 6位寄存器地址 A5~A0
Bit23-8 : 芯片输出16位寄存器数据(MSB first)
Bit7   : 固定为1(生命计数器位)
Bit6-5 : 2位转换计数器 C1~C0(每次转换序列完成递增)
Bit4-0 : 5位CRC(多项式 x^5+x^2+1,种子0x1F)

写操作帧结构(32 位):

Bit31  : 忽略位
Bit30  : R/W位 = 1(写)
Bit29-24: 6位寄存器地址 A5~A0
Bit23-8 : 主机输入16位寄存器数据(MSB first)
Bit7-5 : 未指定(任意值)
Bit4-0 : 5位CRC

B.2 CRC-5 计算函数

/**
 * @brief  计算ADMT4000 SPI帧的CRC-5校验值
 * @param  data  26位数据(读:R/W+Addr+Data+Fault+ConvCnt;写:R/W+Addr+Data+3bit填充)
 * @retval 5位CRC值
 * @note   多项式 x^5+x^2+1,种子0x1F,与datasheet伪代码一致
 */
uint8_t admt4000_crc5(uint32_t data)
{
    uint8_t shft[5] = {1, 1, 1, 1, 1};  // 种子 0x1F
    uint8_t xor_0;

    for (int8_t i = 30; i >= 5; i--) {
        xor_0 = ((data >> i) & 0x01) ^ shft[4];
        shft[4] = shft[3];
        shft[3] = shft[2];
        shft[2] = shft[1] ^ xor_0;
        shft[1] = shft[0];
        shft[0] = xor_0;
    }
    return (shft[4] << 4) | (shft[3] << 3) | (shft[2] << 2) |
           (shft[1] << 1) | shft[0];
}

B.3 寄存器读函数

/**
 * @brief  读取ADMT4000寄存器
 * @param  addr   6位寄存器地址 (0x00~0x3F)
 * @param  pData  输出:16位寄存器值
 * @retval 0=成功,-1=CRC校验失败
 */
int8_t admt4000_read_reg(uint8_t addr, uint16_t *pData)
{
    uint32_t tx_frame = 0;
    uint32_t rx_frame = 0;
    uint8_t  crc_calc, crc_rx;

    // 构造发送帧:bit30=0(读), bit29-24=地址
    tx_frame = ((uint32_t)(addr & 0x3F)) << 24;

    // SPI收发32位(CS拉低→传输→CS拉高)
    // 假设底层SPI函数:spi_xfer(&tx_frame, &rx_frame, 32)
    spi_xfer(&tx_frame, &rx_frame, 32);

    // 解析接收帧:bit23-8=16位数据
    *pData = (uint16_t)((rx_frame >> 8) & 0xFFFF);

    // CRC校验:对bit30~bit5共26位计算CRC
    crc_calc = admt4000_crc5(rx_frame & 0x7FFFFFFE);  // bit30~bit5
    crc_rx   = (uint8_t)(rx_frame & 0x1F);              // bit4~bit0

    if (crc_calc != crc_rx) {
        return -1;  // CRC错误,数据不可信
    }
    return 0;
}

B.4 寄存器写函数

/**
 * @brief  写入ADMT4000寄存器
 * @param  addr  6位寄存器地址
 * @param  data  16位待写入数据
 */
void admt4000_write_reg(uint8_t addr, uint16_t data)
{
    uint32_t tx_frame = 0;
    uint8_t  crc;

    // 构造发送帧:bit30=1(写), bit29-24=地址, bit23-8=数据
    tx_frame = ((uint32_t)1 << 30) |
               ((uint32_t)(addr & 0x3F) << 24) |
               ((uint32_t)data << 8);

    // 计算CRC(对bit30~bit5共26位)
    crc = admt4000_crc5(tx_frame & 0x7FFFFFFE);
    tx_frame |= crc;  // bit4~bit0填入CRC

    // SPI发送32位
    uint32_t dummy;
    spi_xfer(&tx_frame, &dummy, 32);
}

B.5 初始化流程(完整上电序列)

/**
 * @brief  ADMT4000完整上电初始化
 * @retval 0=成功,<0=失败
 */
int8_t admt4000_init(void)
{
    uint16_t val;
    uint32_t timeout = 0;

    // 1. 等待BOOTLOAD(Pin4)变低,NVM加载完成(典型10ms)
    while (GPIO_ReadBootload() == GPIO_PIN_SET) {
        if (++timeout > 10000) return -1;  // 超时
        delay_us(1);
    }
    delay_ms(2);  // 额外等待内部状态稳定

    // 2. 读取FAULT寄存器,验证上电值为0xFFFF(功能自检)
    if (admt4000_read_reg(0x06, &val) != 0) return -2;
    if (val != 0xFFFF) return -3;  // FAULT寄存器上电应为0xFFFF

    // 3. 清零FAULT寄存器
    admt4000_write_reg(0x06, 0x0000);

    // 4. (可选)配置GENERAL寄存器
    //    默认0x1230已开启IIR滤波、连续转换模式
    //    如需关闭滤波:val &= ~(1<<12); 如需One-Shot:val |= (1<<0)
    //    注意:bit9必须保持1,bits[5:4]必须保持0b11!
    // admt4000_write_reg(0x01, 0x0002);  // 先切到Page 0x02
    // admt4000_write_reg(0x10, 0x1230);  // 写GENERAL

    // 5. 启动连续转换序列(默认已启动,显式触发一次确保)
    admt4000_write_reg(0x01, 0x0000);  // CNVPAGE bits[15:14]=0b00 启动

    // 6. 等待第一次转换完成(BUSY变低)
    timeout = 0;
    while (GPIO_ReadBusy() == GPIO_PIN_SET) {
        if (++timeout > 10000) return -4;
        delay_us(1);
    }

    // 7. 读取FAULT确认无故障
    admt4000_read_reg(0x06, &val);
    if (val != 0x0000) return -5;  // 存在故障

    return 0;
}

B.6 读取绝对角度(含圈数)

/**
 * @brief  读取绝对角度(圈数+单圈角度)
 * @param  pTurns   输出:整圈数 (0~45有效范围)
 * @param  pAngle   输出:单圈角度,单位度 (0~360)
 * @param  pAbsDeg  输出:总绝对角度,单位度 (0~16560)
 * @retval 0=成功,-1=CRC错误,-2=无效圈数
 */
int8_t admt4000_read_absolute(uint16_t *pTurns, float *pAngle, float *pAbsDeg)
{
    uint16_t raw;
    uint16_t turns_raw;
    uint16_t angle_raw;

    // ABSANGLE寄存器地址0x03,Page Agnostic,无需切页
    if (admt4000_read_reg(0x03, &raw) != 0) return -1;

    // 解析:bit15~bit10 = 整圈数(6位)
    turns_raw = (raw >> 10) & 0x3F;

    // 检查无效圈数编码 0b110110 = 54
    if (turns_raw == 0x36) return -2;  // 无效圈数

    // 负数圈数(two's complement):0b110111~0b111111 对应 -9~-1
    // 正常工作范围0~45,此处简单处理
    *pTurns = turns_raw;

    // 解析:bit9~bit0 = 角度,分辨率 360/1024 ≈ 0.3516°
    angle_raw = raw & 0x03FF;
    *pAngle = (float)angle_raw * 360.0f / 1024.0f;

    // 总绝对角度
    *pAbsDeg = (float)(*pTurns) * 360.0f + (*pAngle);

    return 0;
}

B.7 读取高精度单圈角度(ANGLE 寄存器)

/**
 * @brief  读取高精度单圈角度(已应用偏移/增益/相位/谐波校准)
 * @param  pAngle  输出:角度,单位度 (0~360)
 * @retval 0=成功,-1=CRC错误
 * @note   ANGLE寄存器分辨率 360/4096 ≈ 0.0879°,比ABSANGLE的0.351°更高
 */
int8_t admt4000_read_angle(float *pAngle)
{
    uint16_t raw;

    // ANGLE寄存器地址0x05,Page Agnostic
    if (admt4000_read_reg(0x05, &raw) != 0) return -1;

    // bit15~bit4 = 12位角度值,分辨率 360/4096
    uint16_t angle_raw = (raw >> 4) & 0x0FFF;
    *pAngle = (float)angle_raw * 360.0f / 4096.0f;

    return 0;
}

B.8 读取内部温度

/**
 * @brief  读取芯片内部温度
 * @param  pTemp  输出:温度,单位℃
 * @retval 0=成功,-1=CRC错误
 * @note   公式:T(℃) = (TMP_reg - 1168) / 15.66
 */
int8_t admt4000_read_temp(float *pTemp)
{
    uint16_t raw;

    // TMP寄存器在Page 0x00,地址0x20,需先切页
    admt4000_write_reg(0x01, 0x0000);  // CNVPAGE切到Page 0x00
    if (admt4000_read_reg(0x20, &raw) != 0) return -1;

    // bit15~bit4 = 12位温度值
    uint16_t tmp_raw = (raw >> 4) & 0x0FFF;
    *pTemp = ((float)tmp_raw - 1168.0f) / 15.66f;

    return 0;
}

B.9 故障轮询函数

/**
 * @brief  读取并解析FAULT寄存器
 * @retval 故障位掩码(0=无故障)
 * @note   调用后自动清零FAULT寄存器
 */
uint16_t admt4000_poll_fault(void)
{
    uint16_t fault;

    admt4000_read_reg(0x06, &fault);

    if (fault != 0x0000) {
        // 解析关键故障位
        if (fault & (1 << 14)) { /* AMR角度传感器半径异常,磁场过强/过弱 */ }
        if (fault & (1 << 13)) { /* 圈数交叉校验错误,需GMR复位 */ }
        if (fault & (1 << 9))  { /* GMR假状态检测,需GMR复位 */ }
        if (fault & (1 << 7))  { /* NVM ECC双bit错误,芯片可能损坏 */ }
        if (fault & (1 << 5))  { /* NVM CRC错误 */ }

        // 清零故障寄存器
        admt4000_write_reg(0x06, 0x0000);
    }
    return fault;
}

附录 C:关键寄存器速查表

表格

寄存器名地址所在页复位值读写用途
CNVPAGE0x01Agnostic0x0000R/W转换启动控制 + 寄存器页选择
ABSANGLE0x03Agnostic0xDB00R绝对角度(圈数 + 角度),0~16560°
DIGIO0x04Agnostic0x0000R/WGPIO 引脚状态读写
ANGLE0x05Agnostic0x8000R高精度单圈角度,12 位,0.0879° 分辨率
FAULT0x06Agnostic0xFFFFR/W故障状态汇总,上电需清零
SINE0x100x000x0000R正弦原始测量值(2's complement)
COSINE0x110x000x0000R余弦原始测量值
RADIUS0x180x000x0000R角度向量模长(磁场强度诊断)
TMP0x200x000x0000R内部温度传感器
GENERAL0x100x020x1230R/W全局配置(转换模式 / 滤波 / 谐波源等)
DIGIOEN0x120x020x201FR/WGPIO 功能选择与输出使能
CNVCNT0x140x020x0000R转换计数器
H1MAG/H1PH0x15/0x160x020x0000R/W1 次谐波误差幅值 / 相位
H2MAG/H2PH0x17/0x180x020x0000R/W2 次谐波误差幅值 / 相位
H3MAG/H3PH0x19/0x1A0x020x0000R/W3 次谐波误差幅值 / 相位
H8MAG/H8PH0x1B/0x1C0x02工厂值R/W8 次谐波误差幅值 / 相位
UNIQID0~30x1E~0x210x02R芯片唯一 ID + 产品 / 电压 / 版本信息

GENERAL 寄存器 bit 位速记(默认 0x1230):

  • bit0 CNVMDE:0 = 连续转换,1=One-Shot
  • bits [5:4]:必须保持 0b11(保留位)
  • bit9:必须保持 1(保留位)
  • bit10 H8CNTRL:0 = 工厂 8 次谐波值,1 = 用户值
  • bit12 ANGLFILT:0 = 关滤波,1 = 开滤波(默认开启
  • bits [14:13] CNVSYNC:00 = 内部时序,11 = 外部 CNV 同步

以上附录内容全部基于 ADI 官方 datasheet Rev.A 逐条核对,可以直接追加到你的 CSDN 博文中。如果还需要补充谐波校准 FFT 算法示例STM32 HAL 完整驱动代码或者Python 上位机读取脚本,随时告诉我。

思考互动:你们项目里,多圈掉电记忆遇到过哪些坑?欢迎评论区聊聊!

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐