这部分是关于匿名串级PID的,我觉得有需要的同学可以直接移植,不需要自己写了,确实有点麻烦,基本上代码里面都注释的很清楚了,且由于本人水平有限,所以也不是都很懂,只能做到这里了。
#include "Ano_AttCtrl.h"
#include "Ano_Imu.h"
#include "Drv_icm20602.h"
#include "Ano_MagProcess.h"
#include "Drv_spl06.h"
#include "Ano_MotionCal.h"
#include "Ano_FlightCtrl.h"
#include "Ano_LocCtrl.h"
#include "Ano_MotorCtrl.h"
/*
在这里需要纠正一个概念,基于C语言实现的PID输出就是反馈,而基于控制系统实现的PID最终输出是作用于电机上的
即输出跟反馈并无直接联系
匿名”Ano_Pid.c“文件中PID函数有几个重要的入口参数,
期望值,反馈值,最后在结构体指针里面还有输出值。在这里,遥控器打杆值作为期望,
姿态解算测得的欧拉角作为反馈,经过PID最终输出一个不断接近我们期望的值,
通过PWM驱动电机,同时姿态改变,不断进行上述过程直至最后稳定。
*/
//1->内环即角速度环
//2->外环即角度环
//经过查看这些变量的定义发现,其是来源于”Ano_Pid.h“中的结构体,再滑到下面看到有好多个”Ano_Pid.c“
//中PID函数的引用,不难想到定义这些变量是为了给下面PID函数调用提供初始化,事实上确实是这样
//但是”Ano_Pid.c“中的PID函数除了这两个比较重要的参数外,还有PID的期望值和反馈值也很重要
//到"Ano_AttCtrl.h"中查看,果然可以看到定义有包含有期望值和反馈值的结构体,
//角度环控制参数
_PID_arg_st arg_2[VEC_RPY] ;
//角速度环控制参数
_PID_arg_st arg_1[VEC_RPY] ;
//角度环控制数据
_PID_val_st val_2[VEC_RPY];
//角速度环控制数据
_PID_val_st val_1[VEC_RPY];
/************************************************************************
*************************************************************************
*************************************************************************
*************************************************************************
*************************************************************************
*************************************************************************/
//PIT ROW YAW 各有一套PID吗?
//初始化为下面调用”Ano_Pid.c“中的PID函数做准备
/*角度环PID参数初始化*/
void Att_2level_PID_Init()
{
arg_2[ROL].kp = Ano_Parame.set.pid_att_2level[ROL][KP];
arg_2[ROL].ki = Ano_Parame.set.pid_att_2level[ROL][KI];
arg_2[ROL].kd_ex = Ano_Parame.set.pid_att_2level[ROL][KD];
arg_2[ROL].kd_fb = Ano_Parame.set.pid_att_2level[ROL][KD];
arg_2[ROL].k_ff = 0.0f;
arg_2[PIT].kp = Ano_Parame.set.pid_att_2level[PIT][KP];
arg_2[PIT].ki = Ano_Parame.set.pid_att_2level[PIT][KI];
arg_2[PIT].kd_ex = Ano_Parame.set.pid_att_2level[PIT][KD];
arg_2[PIT].kd_fb = Ano_Parame.set.pid_att_2level[PIT][KD];
arg_2[PIT].k_ff = 0.0f;
arg_2[YAW].kp = Ano_Parame.set.pid_att_2level[YAW][KP];
arg_2[YAW].ki = Ano_Parame.set.pid_att_2level[YAW][KI];
arg_2[YAW].kd_ex = Ano_Parame.set.pid_att_2level[YAW][KD];
arg_2[YAW].kd_fb = Ano_Parame.set.p