Files
FDR-Core/Core/Inc/motor.h

44 lines
1.8 KiB
C
Raw Normal View History

2026-03-08 18:17:14 +08:00
#ifndef __MOTOR_H
#define __MOTOR_H
#include "main.h"
/* ================== 硬件与物理参数配置 ================== */
// PWM 满载占空比 (对应 CubeMX 中的 ARR = 1049)
#define MAX_PWM_DUTY 1049
// 为安全起见设置占空比上限,防溢出或满载锁死 (约 95%)
#define PWM_LIMIT 1000
// 编码器与减速箱参数 (JGB37-520 11线 90减速比)
#define ENCODER_RESOLUTION 11.0f // 电机尾部编码器线数
#define REDUCTION_RATIO 90.0f // 减速箱减速比 (90:1)
// 车轮转一圈的总脉冲数 = 11 * 4(倍频) * 90 = 3960
#define PULSES_PER_REV (ENCODER_RESOLUTION * 4.0f * REDUCTION_RATIO)
/* ================== 枚举与类型定义 ================== */
// 定义电机 ID (与物理位置一一对应)
typedef enum {
MOTOR_FL = 0, // 左上 Front-Left (PWM: TIM2, Encoder: TIM5)
MOTOR_RL, // 左下 Rear-Left (PWM: TIM9, Encoder: TIM3)
MOTOR_FR, // 右上 Front-Right (PWM: TIM8, Encoder: TIM4)
MOTOR_RR // 右下 Rear-Right (PWM: TIM8, Encoder: TIM1)
} Motor_ID_t;
/* ================== 函 数 声 明 ================== */
// --- 基础控制层 ---
void Motor_Init(void);
// 设置电机输出 (正数代表期望车轮推动车体【向前】,负数【向后】)
void Set_Motor_Output(Motor_ID_t id, int16_t control_out);
// 紧急制动所有电机
void Motor_Brake_All(void);
// --- 状态观测层 ---
// 读取脉冲并更新转速 (需周期性调用dt_s 为调用间隔的秒数,如 10ms 则传入 0.01f)
void Motor_Update_RPM(float dt_s);
// 获取计算好的实时转速 (正数代表车轮正使车体【向前】行驶)
float Get_Motor_RPM(Motor_ID_t id);
// 获取自上次调用以来的累加脉冲增量,并自动清零
void Motor_Get_And_Clear_Delta_Ticks(int16_t* d_fl, int16_t* d_rl, int16_t* d_fr, int16_t* d_rr);
#endif /* __MOTOR_H */