3、标定前的准备工作:硬件连接检查、供电稳定性确认、通信协议确认(SPI/I2C/ABZ)
好,咱们正式开始动手之前,先把准备工作做扎实。这一步要是偷懒,后面调试起来会非常痛苦。我个人习惯是,拿到传感器和电机,先不急着上电,而是花十分钟把硬件连接、供电、通信这三件事逐一确认清楚。
3.1 硬件连接检查:别让虚焊坑了你
先看硬件连接。说白了,就是检查传感器和主控板之间的物理连线。我见过太多工程师,代码调了一整天,最后发现是杜邦线松了。
具体检查哪些点?我列个清单:
- 电源线(VCC/GND):这是最容易出问题的地方。我曾经遇到过传感器VCC和GND接反,瞬间冒烟。嗯,那滋味不好受。
- 信号线(SCK/MOSI/MISO/CS 或 SDA/SCL):确保每根线都对应到正确的引脚。尤其是SPI的片选线(CS),如果接错,通信会完全乱掉。
- ABZ编码器信号线:如果是增量式编码器,A、B、Z三根线要区分清楚。Z信号是零位信号,接错会导致归零失败。
- 焊接点:如果是自己焊的板子,检查有没有虚焊、连锡。我习惯用放大镜看一遍,别嫌麻烦。
你想想看,如果硬件连接有问题,后面所有的软件调试都是白费功夫。所以这一步,我建议你至少花5分钟认真检查。
3.2 供电稳定性确认:电压不稳,一切归零
供电问题,是标定过程中最隐蔽的坑。传感器对电压非常敏感,尤其是角度传感器,电压波动会直接导致角度读数跳变。
为什么会这样?因为传感器内部的ADC(模数转换器)参考电压通常就是供电电压。如果供电不稳,参考电压也跟着抖,转换出来的角度值自然不准。
我建议你这样做:
- 用示波器看电源纹波:把探头夹在传感器VCC引脚和GND之间,看波形。如果纹波太大,考虑加一个100nF的陶瓷电容和10μF的电解电容。
- 检查电源线长度:如果传感器离主控板很远(比如超过20cm),电源线上的压降可能会让传感器欠压。我遇到过这种情况,电机一转,传感器电压就掉到3.0V以下,角度数据直接飞了。
- 确认电流是否足够:有些传感器启动瞬间电流很大,如果电源输出能力不足,电压会被拉低。记得看数据手册里的最大工作电流。
嗯,这里要注意:如果你用的是电池供电,电池电量下降时电压也会变化。所以标定过程中,最好用稳压电源供电,别用电池。
3.3 通信协议确认:SPI、I2C、ABZ,你选哪个?
通信协议这块,说白了就是传感器和主控之间怎么“说话”。不同的协议,接线方式和配置方法都不一样。我根据经验,把三种常见协议的特点整理了一下:
| 协议类型 | 接线数量 | 通信速度 | 抗干扰能力 | 典型应用场景 |
|---|---|---|---|---|
| SPI | 4根(SCK/MOSI/MISO/CS) | 高(可达10MHz以上) | 强 | 高精度、高速标定 |
| I2C | 2根(SDA/SCL) | 中(通常400kHz) | 中等 | 多传感器共用总线 |
| ABZ | 3根(A/B/Z) | 取决于脉冲频率 | 强 | 增量式编码器、电机位置反馈 |
我个人习惯是:如果传感器支持SPI,优先用SPI。为什么?因为SPI是全双工通信,速度快,而且没有I2C那种地址冲突的问题。我曾经在一个项目里用I2C挂了8个传感器,结果地址冲突调了整整两天。
确认协议后,还要检查主控的对应外设是否配置正确。比如SPI的极性(CPOL)和相位(CPHA)必须和传感器匹配。我见过有人把CPOL设反了,结果读出来的数据全是0xFF。
这里给一个SPI初始化的示例代码(以STM32为例):
// SPI初始化配置
SPI_HandleTypeDef hspi1;
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER; // 主模式
hspi1.Init.Direction = SPI_DIRECTION_2LINES; // 全双工
hspi1.Init.DataSize = SPI_DATASIZE_8BIT; // 8位数据
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; // CPOL=0
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; // CPHA=0
hspi1.Init.NSS = SPI_NSS_SOFT; // 软件片选
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32; // 分频
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; // 高位在前
HAL_SPI_Init(&hspi1);
如果是I2C,记得检查地址是否正确。很多传感器支持多个地址,通过引脚电平选择。我曾经因为忘记拉高ADDR引脚,导致I2C地址对不上,通信失败。
至于ABZ编码器,主要是检查脉冲计数方向。如果电机正转时计数值反而减小,说明A、B相接反了,对调一下就好。
3.4 避坑指南:我踩过的几个坑
我曾经... 在一个项目中,传感器标定一直失败,角度数据跳来跳去。查了两天,最后发现是SPI的MISO和MOSI接反了。嗯,从那以后,我每次接线都会用万用表通断档再确认一遍。
还有一次,I2C总线上拉电阻没焊,通信时有时无。我以为是代码问题,反复调试,最后发现是硬件问题。所以,上拉电阻一定要焊,一般用4.7kΩ。
另外,ABZ编码器的Z信号线,如果线太长,容易受到电机干扰。我建议用屏蔽线,或者加一个100nF的滤波电容到GND。
好了,准备工作做到这一步,基本上可以放心上电了。下一章,我们开始讲具体的标定流程。