给关节加振动监测,选型其实只有两个岔路口:要模拟输出还是要占空比数字输出。前者用 ADXL311(±2g、灵敏度 167mV/g),后者用 MXD2020A(±1g、20%/g),两片都是 5mm×5mm 贴片、单电源供电。本文用三张表把量程、带宽、噪声、零偏漂移一次说清,再给出 STM32 的 ADC+DMA 与定时器输入捕获两套采集代码,最后落到振动数据上云。
六轴协作机器人或人形机器人的关节,本体是"无刷电机 + 谐波减速器 + 编码器"的三件套。编码器只回答"关节转到了哪个角度",它测不出减速器齿面磨损、装配偏心、负载突变带来的振动。而这些早期异常,恰恰会先出现在振动信号里。要测振动,就得在关节里塞一颗 加速度计。结论先放在前面:第一,先定输出形式——模拟输出直接进 ADC,占空比输出用定时器捕获,别一上来就纠结型号;第二,量程按关节实际冲击选,±2g 够测稳态振动,±10g 以上留给碰撞冲击;第三,噪声密度决定了你能分辨多小的信号,带宽越小噪声越低,这两个参数必须一起算。下面用三张表把选型和落地讲透。
先分清两类量。一类是静态加速度,也就是重力分量,关节倾斜角度、末端姿态就靠它反推;另一类是动态加速度,也就是振动与冲击,减速器早期磨损、轴承点蚀、装配不同轴,都会在特定频段上把振动幅值抬高。ADXL311 与 MXD2020A 这两片器件都能同时测静态和动态加速度,区别主要在输出形式和量程。
把选型拉成一张表,岔路口一眼就清楚了。数据来自两片器件的原厂数据手册。
| 对比项 | ADXL311(ADI) | MXD2020A/B(MEMSIC) |
|---|---|---|
| 敏感轴 | 双轴 X / Y | 双轴 X / Y |
| 量程 | ±2 g | ±1 g |
| 输出形式 | 模拟电压,正比于加速度 | 占空比(脉宽/周期)数字信号 |
| 灵敏度 | 140 / 167 / 195 mV/g(VDD=3V) | 20 %Duty Cycle / g(18~22) |
| 零加速度偏置 | 1.2 / 1.5 / 1.8 V | 50 %Duty Cycle(42~58) |
| 噪声密度 | 300 µg/√Hz RMS | 0.015 %dc/√Hz |
| -3dB 带宽 | 6 kHz(传感器谐振 10 kHz) | 30 Hz,可扩展至 >160 Hz |
| 供电 / 电流 | 2.7~5.25 V,静态 0.4 mA(典型) | 2.7~5.25 V,5V 时 4.2 mA(典型) |
| 抗冲击 | 3500 g / 0.5 ms(绝对最大) | 50,000 g |
| 工作温度 | 0~70 ℃(商业级) | -40~+105 ℃ |
| 封装 | 8 脚 CLCC,5mm×5mm×2mm | LCC 气密封装,5mm×5mm×2mm |
| 自检 / 辅助输出 | 自检脚,0→1 时输出变化约 45 mV | 连续自检;内置温度输出 Tout 与 2.5V 基准 |
一句话选型:关节里如果已经有 MCU 的 ADC 空闲通道、且需要宽频带看振动频谱,选 ADXL311(模拟,6kHz 带宽);如果走线长、怕模拟信号被干扰,或者 MCU 的 ADC 通道紧张,选 MXD2020A(占空比输出,一根线进定时器捕获,抗干扰天然更好)。
还有一处容易被忽略的差异:MXD2020A 采用的是热传导原理,内部没有可移动质量块,因此不存在电容式器件常见的粘连与颗粒失效问题,抗冲击能力做到 50,000 g;ADXL311 是经典的表面微机械电容式结构,带宽高、噪声低,但绝对最大冲击是 3500 g。关节一旦发生碰撞,这个差别会直接体现在"器件还能不能活"上。
选型不能只看量程。对振动监测来说,能分辨多小的加速度才是关键,而这个能力由噪声密度和带宽共同决定。ADXL311 的噪声密度是 300 µg/√Hz,RMS 噪声约等于"噪声密度 × √带宽"。带宽越小,噪声越低,能分辨的信号就越小。
ADXL311 的带宽由 XFILT、YFILT 两个引脚上的电容 C 决定,关系式是 F-3dB = 5µF / C,电容最小值 1000 pF;内部滤波电阻 RFILT 标称 32 kΩ,容差可达 ±15%,所以实际带宽会有相应偏差。下面这张表把常用带宽对应的电容和噪声算好,直接抄。
| 目标带宽 F-3dB | CFILT(按 5µF/C 计算) | RMS 噪声(300µg/√Hz × √BW) | 典型用途 |
|---|---|---|---|
| 10 Hz | 0.5 µF | 约 0.95 mg | 关节倾角 / 静态姿态 |
| 100 Hz | 0.05 µF(50 nF) | 约 3 mg | 减速器低频振动、转速谐波 |
| 1 kHz | 5 nF(5000 pF) | 约 9.5 mg | 轴承点蚀、齿面啮合高频 |
| 2 kHz | 2.5 nF | 约 13.4 mg | 碰撞冲击波形捕捉 |
再补一个启动时间:ADXL311 的上电稳定时间约为 160 × CFILT(µF)+ 0.3 ms。用 0.05 µF 时约 8.3 ms,用 0.5 µF 时要 80 ms。关节控制器上电后如果立刻采样,必须等过这个时间,否则读到的是没稳定的偏置。
MXD2020A 的算法略有不同。它的输出是占空比,灵敏度 20 %dc/g,噪声密度 0.015 %dc/√Hz。把噪声折算成加速度:噪声(g) = 0.015 %dc/√Hz × √BW ÷ 20 %dc/g。在 30 Hz 带宽下约 4.1 mg,在 1 Hz 带宽下才能做到数据手册标注的"优于 2 mg 分辨率"。这也解释了为什么它更适合低频姿态与稳态振动,而不是高频频谱分析。
两片器件的输出形式不同,信号链也不同。用一张图把两条路径画清楚。
模拟通道这条路径,关键是采样率要满足奈奎斯特。要分析 1 kHz 以内的振动,采样率至少 2.5~5 kHz,建议用定时器触发 ADC、DMA 搬运成块,避免逐个通道读寄存器把 CPU 拖死。下面这段 STM32 HAL 骨架代码按"定时器触发 + DMA 半满/全满双缓冲"组织,采集端只负责填缓冲区,算法端在回调里处理。
/* ADXL311 双轴采集:TIM3 触发 ADC1,DMA 循环搬运
* 目标:采样率 5 kHz,缓冲 512 点,半满/全满各触发一次处理
* 约定:ADXL311 零偏 1.5V,灵敏度 167mV/g,VDD=3V
*/
#define ACC_SENS_MV_PER_G 167.0f /* 灵敏度典型值,实际需校准 */
#define ACC_ZERO_MV 1500.0f /* 零加速度偏置,实测校准后替换 */
static uint16_t adc_buf[512 * 2]; /* X、Y 交错:X0,Y0,X1,Y1... */
volatile uint8_t block_ready = 0;
/* 把 ADC 原始码换算成 g:12 位 ADC、参考 3.3V */
static float adc_to_g(uint16_t code)
{
float mv = (float)code * 3300.0f / 4095.0f; /* 码值 -> mV */
return (mv - ACC_ZERO_MV) / ACC_SENS_MV_PER_G; /* 减去零偏 -> g */
}
void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef *hadc)
{
block_ready = 1; /* 前半满:可处理 adc_buf[0..511] */
}
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
block_ready = 2; /* 后半满:可处理 adc_buf[512..1023] */
}
占空比通道这条路径,关键是用输入捕获同时测"高电平时间"和"整个周期",两者相除才是占空比。MXD2020A 输出的是 100 Hz 或 400 Hz 的方波,1 g 对应 20% 的占空比变化,所以分辨率取决于定时器计数精度。用 72 MHz 主频、预分频到 1 MHz 计数,400 Hz 信号周期 2500 个计数,1% 占空比对应 25 个计数,足够分辨。
/* MXD2020A 占空比采集:TIM2 通道 1 输入捕获,PWM 输入模式
* 占空比 = 高电平计数 / 周期计数;零偏 50%,灵敏度 20%/g
*/
#define MXD_ZERO_DUTY 0.50f /* 零加速度占空比 */
#define MXD_SENS_DUTY 0.20f /* 20 %Duty Cycle / g */
/* PWM 输入模式下:CCR1 为周期,CCR2 为高电平时间 */
float mxd_duty_to_g(uint32_t period_cnt, uint32_t high_cnt)
{
if (period_cnt == 0) return 0.0f;
float duty = (float)high_cnt / (float)period_cnt;
return (duty - MXD_ZERO_DUTY) / MXD_SENS_DUTY; /* 占空比 -> g */
}
/* 在捕获中断里读出两个比较寄存器即可 */
void TIM2_IRQHandler(void)
{
if (TIM2->SR & TIM_SR_CC1IF) {
TIM2->SR = ~TIM_SR_CC1IF; /* 清中断标志 */
uint32_t period = TIM2->CCR1; /* 一个完整周期 */
uint32_t high = TIM2->CCR2; /* 高电平持续时间 */
float g = mxd_duty_to_g(period, high);
/* g 交给后续振动特征提取 */
}
}
数据手册给的都是典型值,真实器件有离散性,而且会随温度漂移。这三件事不做,振动数据会一直带着一个"假的直流分量"。
| 参数 | ADXL311 | MXD2020A | 工程处理 |
|---|---|---|---|
| 零偏离散 | 1.2~1.8 V | 42~58 %dc | 上电静置校准,把实测零偏写入参数区 |
| 零偏温漂 | 2.0 mg/℃ | ±2.0 mg/℃ | 用器件内置温度输出做一阶补偿 |
| 灵敏度温漂 | -0.025 %/℃ | 未补偿时 -40~+105℃ 变化显著,补偿后 <3% | 标定后做温度分段修正 |
| 非线性度 | 0.2 % of FS | 1.0~2.0 % of FS | 高精度场合优先模拟通道 |
| 自检 | 自检脚置 1,输出变化约 45 mV | 失效时输出端持续为 VDD 电平 | 开机跑一次自检,异常直接报警 |
MXD2020A 在这方面更省心一些:它内置了温度传感器(25℃ 时输出 1.25V、灵敏度 5.0 mV/°K)和 2.5V 参考电压输出,补偿所需的温度量不用外挂。ADXL311 则需要靠 MCU 的其它温度通道来近似,或者干脆在恒温环境下用,用软件高通滤波把零偏慢慢滤掉——但要注意,高通滤波会把关节真实的低频姿态信息一起滤掉,测静态倾角时不能这么做。
加速度计采到的原始波形数据量不小。5 kHz 采样、双轴、16 位,一秒就是 20 kB,直接上传不现实。工程上通常在节点侧先把原始波形做成特征量:RMS 有效值、峰值、峭度,再做一次 FFT 取几个关键频段的幅值。一帧特征量几十字节,通过 RS-485 汇到 RTU 或网关,再经 NB-IoT / 4G 用 MQTT 上报到云平台,只有触发阈值时才上传一小段原始波形用于回溯。
这套"边缘提特征 + 云端看趋势"的分工,正好和加速度计的两条输出路径配合:模拟通道带宽高,适合做 FFT;占空比通道带宽低,适合做 RMS 与趋势量。选择哪一片,本质上取决于你更想看清"频谱里的哪根刺",还是更想守住"趋势上的那根线"。
| 现象 | 根因 | 处理 |
|---|---|---|
| 上电读到的零偏一直漂 | 没等稳定时间就开始采样 | ADXL311 等 160×CFILT+0.3ms,再静置校准 |
| 频谱里混进工频干扰 | 模拟输出走线长、未做滤波与屏蔽 | 缩短走线、加 RC 低通,或改用占空比输出 |
| 振动幅值明显偏小 | 带宽电容取值过小,信号被过度衰减 | 按 F-3dB=5µF/C 重新计算 C,并考虑 ±15% 容差 |
| 占空比换算出的 g 值不线性 | 只测了高电平时间,没除以周期 | 输入捕获同时取 CCR1 周期与 CCR2 高电平 |
| 温度升高后振动基线抬升 | 零偏与灵敏度温漂未补偿 | 用内置温度输出做一阶补偿,标定后分段修正 |
| 关节碰撞后传感器失效 | 选型时未评估抗冲击余量 | 强冲击场景优先热传导式器件,并做机械缓冲 |
给机器人关节加振动监测,加速度计的选型逻辑并不复杂:先定输出形式(模拟还是占空比),再按关节实际冲击定量程,最后把噪声密度和带宽一起算,确定能分辨的最小信号。ADXL311 用模拟输出、6 kHz 带宽、300 µg/√Hz 噪声,适合做频谱分析;MXD2020A 用占空比输出、30 Hz 带宽、内置温度补偿,接线简单、抗干扰好,适合做姿态与趋势。
落地时记住三点:上电先等稳定时间再校准零偏、模拟通道要滤波、占空比通道要同时测周期和高电平。把这两片器件的参数表贴在项目墙上,再配上边缘提特征、MQTT 上云的数据通路,关节的健康状态就能被持续看见。
关节振动监测的选型不是比参数大小,而是先问自己"要频谱还是要趋势"——要频谱选 ADXL311 走 ADC,要趋势选 MXD2020A 走定时器捕获,两条路都能在 STM32 上稳定落地。
本文基于《ADXL311 数据手册(ADI,±2g 双轴加速度计)》《MXD2020A/B 中文数据手册(MEMSIC,±1g 双轴加速度计)》以及《加速度传感器选择指南-ADI》等技术资料整理优化,并结合机器人关节振动监测与嵌入式采集的工程实践进行了系统化梳理。
沧州艾诺威电子 — 国家高新技术企业,20+项国家专利
嵌入式系统开发 · 物联网方案 · AI智能硬件 · 一站式交付
电话:13930711029 | 邮箱:tech@czinv.com | 24小时内响应