#include "encoder.h" //编码器相关参数 int last_encode_num = 0; int curr_encode_num = 0; uint32_t encode_num = 0; int cnt_update = 152; void encoder_init(void) { HAL_TIM_Encoder_Stop(&htim1, TIM_CHANNEL_ALL); //定时器1编码器关闭 __HAL_TIM_SetCounter(&htim1, 0x9718); //编码器初始值一千万 HAL_TIM_Encoder_Start(&htim1, TIM_CHANNEL_ALL); //定时器1编码器启动 last_encode_num = 0; curr_encode_num = 0; encode_num = 0; cnt_update = 152; CoilState[3] &= 0x7F; //初始化完成后线圈寄存器0x28置零 } void encoder_run(void) { //编码器 last_encode_num = curr_encode_num; curr_encode_num = __HAL_TIM_GET_COUNTER(&htim1); if((curr_encode_num - last_encode_num) < -50000) //向上溢出检测,o(65535)->o(0) cnt_update++; else if((curr_encode_num - last_encode_num) > 50000) //向下溢出检测, o(0)->o(65535) cnt_update--; encode_num = curr_encode_num + cnt_update * 0xFFFF; //编码器,返回计数脉冲值 InputReg[20] = (encode_num >> 16) & 0xffff; //32位int 拆分成两个 uint16_t,高16位 InputReg[21] = encode_num & 0xffff; //32位int 拆分成两个 uint16_t,低16位 }