平衡车 -- 倒立摆
🌈个人主页:羽晨同学
💫个人格言:“成为自己未来的主人~”
串级PID
串级PID的参数整定方法
代码
我们对单片机的前面部分的实现新建两个文件。
#include "app_control.h"
static PID_TypeDef pid_theta;//θ环的PID控制器
static PID_TypeDef pid_theta_dot;//θ点环的PID控制器
//
// @简介: 负责初始化平衡车控制系统
//
void App_Control_Init(void)
{PID_Init(&pid_theta,4.0f,0.0f,0.0f);//初始化θ环PIDPID_Init(&pid_theta_dot,10.0f,10.0f,0.0f);//初始化θ点环PID
}
//
// @简介: 平衡车控制系统的进程函数
//
void App_Control_Proc(void)
{}
然后我们根据上面的示意图对这个进程函数进行完善
static const float g = 9.8;
static const float lp = 0.0625;
//
// @简介: 平衡车控制系统的进程函数
//
void App_Control_Proc(void)
{PERIODIC(5) //控制程序每5ms执行一次// #1. 将外环的设定值SP设置为0PID_ChangeSP(&pid_theta,0);// #2. 读取传感器的数据float theta = App_MPU6050_GetPitch()*0.0174533;//单位radfloat theta_dot =App_MPU6050_GetGx()*0.0174533;//单位rad// #3. 计算外环PID的输出float theta_dot_ref = PID_Compute(&pid_theta,theta);// #4. 改变内环的设定值SPPID_ChangeSP(&pid_theta_dot,theta_dot_ref);// #5. 计算内环PID的输出float theta_dot_dot_ref = PID_Compute(&pid_theta_dot,theta_dot);// #6. 倒立摆的逆解算float x_dot_dot_ref = (g*qsin(theta) - theta_dot_dot_ref*lp)/qcos(theta);}
//
// @简介: 平衡车控制系统的进程函数
//
void App_Control_Proc(void)
{PERIODIC(5) //控制程序每5ms执行一次// #1. 将外环的设定值SP设置为0PID_ChangeSP(&pid_theta,0);// #2. 读取传感器的数据float theta = App_MPU6050_GetPitch()*0.0174533;//单位radfloat theta_dot =App_MPU6050_GetGx()*0.0174533;//单位rad// #3. 计算外环PID的输出float theta_dot_ref = PID_Compute(&pid_theta,theta);// #4. 改变内环的设定值SPPID_ChangeSP(&pid_theta_dot,theta_dot_ref);// #5. 计算内环PID的输出float theta_dot_dot_ref = PID_Compute(&pid_theta_dot,theta_dot);// #6. 倒立摆的逆解算float x_dot_dot_ref = (g*qsin(theta) - theta_dot_dot_ref*lp)/qcos(theta);// #7. 计算轮胎转速omega_ref += 1.0f/rw * x_dot_dot_ref * 0.005;// #8. 设置轮胎的转速App_Motor_SetOmega_L(omega_ref);App_Motor_SetOmega_R(omega_ref);
}