39 lines
1.2 KiB
C
39 lines
1.2 KiB
C
#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位
|
||
}
|
||
|
||
|