「位置」就是 TIM3 编码器模式的计数值 + 溢出累计值(正转加、反转减,由 CR1 的 DIR 位判断),每 5ms 读一次存入 g_motor_data.location。它与转角严格成正比:

编码器 44 脉冲/圈 × 减速比 30 = 1320 个计数对应输出轴一圈。按键每按一次目标 ±1320 就是 ±1 圈,限位 ±6600(最多正/反 5 圈)。
/* TIM6 更新中断:位置闭环 */
else if (htim->Instance == TIM6) {
int Encode_now = gtim_get_encode();
speed_computer(Encode_now, 5); /* 速度只用于显示 */
g_motor_data.location = Encode_now; /* 计数总值 = 位置反馈 */
if (val % SMAPLSE_PID_SPEED == 0) { /* 50ms 一次 */
if (g_run_flag) {
motor_pwm_temp = increment_pid_ctrl(&g_location_pid,
g_motor_data.location);
/* 输出低通 0.5/0.5 后限幅 ±4200(比速度环小:定位不需要飙车) */
g_motor_data.motor_pwm = (int32_t)((g_motor_data.motor_pwm * 0.5)
+ (motor_pwm_temp * 0.5));
if (g_motor_data.motor_pwm >= 4200)
g_motor_data.motor_pwm = 4200;
else if (g_motor_data.motor_pwm <= -4200)
g_motor_data.motor_pwm = -4200;
motor_pwm_set(g_motor_data.motor_pwm);
}
val = 0;
}
val++;
}按键逻辑:KEY0 目标 +1320(正转一圈)、KEY1 −1320、KEY2 目标清零(回初始位置)。输出可正可负,PID 自动决定正转还是反转去逼近目标。
上位机用 debug_set_point_range(6600, -6600, 6600) 限定目标范围;HALT 命令回原点,RUN 命令目标 1320(一圈)。每 200ms 上传一次编码器总计数值。
