运动控制中的硬件抽象层设计从一次电机“鬼畜”说起去年调试一个四轴协作机器人,电机在低速运行时突然出现周期性抖动,示波器抓出来一看,电流波形每隔几十毫秒就出现一个毛刺。排查了三天,最后发现是底层驱动库里的定时器中断优先级被某个外设库给改了——硬件抽象层(HAL)里一个不起眼的HAL_NVIC_SetPriority调用,把电机控制中断的优先级从0降到了3,导致电流环被其他中断频繁打断。那次之后我彻底明白:运动控制的硬件抽象层,不是简单封装几个寄存器读写函数就完事的。它决定了你的控制算法到底能跑多“硬”,也决定了你换一块主控芯片时,是改三行代码还是重写整个工程。硬件抽象层到底要抽象什么?很多初学者把HAL理解成“把寄存器操作包成函数”,比如:voidmotor_set_pwm(uint8_tch,uint16_tduty)
127、运动控制中的硬件抽象层设计
运动控制中的硬件抽象层设计从一次电机“鬼畜”说起去年调试一个四轴协作机器人,电机在低速运行时突然出现周期性抖动,示波器抓出来一看,电流波形每隔几十毫秒就出现一个毛刺。排查了三天,最后发现是底层驱动库里的定时器中断优先级被某个外设库给改了——硬件抽象层(HAL)里一个不起眼的HAL_NVIC_SetPriority调用,把电机控制中断的优先级从0降到了3,导致电流环被其他中断频繁打断。那次之后我彻底明白:运动控制的硬件抽象层,不是简单封装几个寄存器读写函数就完事的。它决定了你的控制算法到底能跑多“硬”,也决定了你换一块主控芯片时,是改三行代码还是重写整个工程。硬件抽象层到底要抽象什么?很多初学者把HAL理解成“把寄存器操作包成函数”,比如:voidmotor_set_pwm(uint8_tch,uint16_tduty)