152、运动控制中的固件开发:日志与调试接口
152 运动控制中的固件开发:日志与调试接口一次让我通宵的“幽灵抖动”去年做六轴机械臂的力控项目,电机在低速运行时出现周期性抖动,频率大约2Hz。示波器看电流波形正常,编码器读数在终端打印出来也看不出异常——直到我在中断里加了时间戳日志,才发现问题出在SPI通信的DMA传输完成回调里,一个毫秒级的延迟导致速度环计算周期从1kHz漂到了800Hz左右。那次之后我彻底明白:运动控制固件里,日志和调试接口不是“锦上添花”的功能,而是保命的工具。没有它们,你连问题在哪都不知道。日志系统的设计原则:别让日志本身成为故障源运动控制对实时性极其敏感,日志系统必须遵循几个硬约束:零阻塞原则中断服务函数里绝对不能直接调用printf或写串口。我见过有人把日志打印放在1kHz的电流环里,结果串口缓冲区溢出,系统直接hardfault。正确的做法是:中断里只做“记录”,把日志数据塞进环形缓冲区,由低优先级任务或空闲时间处理输出。时间戳必须硬件级别用HAL_GetTick()这种1ms精度的软件定时器。运动控制需要微秒级的时间分辨率,我习惯用定时器的计数器直接捕获时间戳。比如STM32的TIM2计数器跑在72MHz,读取CNT寄存器就能得到14ns精度的时间戳——这对分析中断延迟、任务切换抖动足够了。日志分级要实用别搞什么TRACE/DEBUG/INFO/WARN/ERROR五级,运动控