/* * @Author: wujunchao wujunchao@wuxismart.com * @Date: 2024-08-20 08:22:01 * @LastEditors: wujunchao wujunchao@wuxismart.com * @LastEditTime: 2024-09-18 16:46:03 * @FilePath: \VOQC\users\Src\encoder.c * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ #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[0] &= 0xFB; //初始化完成后线圈寄存器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[10] = (encode_num >> 16) & 0xffff; //32位int 拆分成两个 uint16_t,高16位 InputReg[11] = encode_num & 0xffff; //32位int 拆分成两个 uint16_t,低16位 }