pid平衡小车hal库
时间: 2025-04-20 12:22:53 浏览: 25
### 使用STM32 HAL库实现PID控制的二轮自平衡小车
#### 定义PID控制器结构体
为了方便管理和调整PID参数,定义了一个`PID`结构体来存储比例、积分和微分系数以及其他必要的变量。
```c
typedef struct _PID {
float kp, ki, kd;
float err, lastErr;
float integral, maxIntegral;
float output, maxOutput;
} PID;
```
此结构体包含了用于计算PID输出所需的所有成员变量[^2]。
#### 初始化函数
初始化函数负责设置默认的KP、KI以及KD值,并可以在此处设定最大积分限幅值和其他初始条件。
```c
void PID_Init(void) {
static PID speed_pid;
speed_pid.kp = KP_speed;
speed_pid.ki = KI_speed;
speed_pid.kd = KD_speed;
speed_pid.integral = 0;
speed_pid.maxIntegral = 1000; // 防止积分饱和
}
```
这里设定了速度环路中的PID参数并进行了简单的防积分饱和处理。
#### 编码器配置
对于编码器而言,在四分频模式下工作能够提供更高的测量精度。这有助于更精确地获取电机转速信息以便于后续的速度反馈调节。
```c
TIM_HandleTypeDef htimX; // X代表具体的定时器编号
htimX.Instance = TIMX;
htimX.Init.Prescaler = 71;
htimX.Init.CounterMode = TIM_COUNTERMODE_UP;
htimX.Init.Period = 65535;
htimX.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htimX.Init.RepetitionCounter = 0;
if (HAL_TIM_Encoder_Init(&htimX, &sConfig) != HAL_OK) {
Error_Handler();
}
__HAL_TIM_SET_AUTORELOAD(&htimX, 0xFFFF);
HAL_TIM_Encoder_Start(&htimX, TIM_CHANNEL_ALL);
```
上述代码展示了如何通过HAL库配置一个定时器作为增量式编码器接口使用[^1]。
#### 实现PID算法
核心部分在于编写实际执行PID运算的方法:
```c
float Speed_PID_Realize(PID *pid, float target, float feedback) {
pid->err = target - feedback;
pid->integral += pid->ki * pid->err;
if (pid->integral > pid->maxIntegral) {
pid->integral = pid->maxIntegral;
} else if (pid->integral < -pid->maxIntegral) {
pid->integral = -pid->maxIntegral;
}
pid->output = pid->kp * pid->err +
pid->integral -
pid->kd * (feedback - pid->lastErr);
if (pid->output > pid->maxOutput) {
pid->output = pid->maxOutput;
} else if (pid->output < -pid->maxOutput) {
pid->output = -pid->maxOutput;
}
pid->lastErr = pid->err;
return pid->output;
}
```
这段程序实现了标准的比例-积分-微分控制逻辑,并加入了防止过冲的安全措施。
#### 主循环中调用
最后,在主循环里定期读取传感器数据更新目标角度/位置并与当前状态做比较传入到上面提到过的`Speed_PID_Realize()`方法当中去驱动电机动作从而达到保持车身直立的效果。
阅读全文
相关推荐


















