/************************************************************************** 函数功能:角度环PD控制 入口参数:目标偏航角 返回值:转向控制PWM **************************************************************************/ void Keep_Angle_PD(float Tar_angle_Z) { static float Last_Keep_bias=0,Last_last_Keep_bias=0,Turn=0; uint8 turn_error=1;//可接受的角度误差 //当前角度和目标角度相差绝对值在这个范围内是 认转向成功 Keep_Bias = Tar_angle_Z-Angle_Z;//当前偏差 if(abs((int)Keep_Bias)<turn_error) { Vz=0; } else { Turn = Turn_KP[0]*(Keep_Bias-Last_Keep_bias) + Turn_KD[0]*Keep_Bias+Turn_KI[0]*(Keep_Bias-2*Last_Keep_bias+Last_last_Keep_bias); if(Turn>Turn_limiting) Turn=Turn_limiting; if(Turn<-Turn_limiting) Turn=-Turn_limiting; Vz=Turn; Last_Keep_bias=Keep_Bias; Last_last_Keep_bias=Last_Keep_bias; } Speed_Control(Vx,Vy,Vz); }
时间: 2023-07-23 12:04:21 浏览: 98
这段代码是一个角度环PD控制的函数,用于调整角度以实现转向控制。函数的输入参数是目标偏航角,返回值是转向控制PWM。
函数中使用了PD控制器来调整角度,代码中的注释也给出了相应的说明。下面对代码进行解释:
1. 首先定义了一些静态变量,用于存储上一次和上上次的偏差(Last_Keep_bias和Last_last_Keep_bias)以及转向控制量(Turn)。
2. 计算当前偏差(Keep_Bias),即目标偏航角与当前角度的差值。
3. 判断当前偏差是否在可接受的角度误差范围内。如果在范围内,将转向控制PWM设置为0,表示转向成功。
4. 如果偏差不在范围内,使用PD控制器计算转向控制量(Turn)。其中,KP、KD和KI分别表示比例、微分和积分系数,用于调节控制器的响应特性。Turn_limiting是一个限制输出幅值的参数。
5. 将转向控制量赋值给Vz,即转向控制PWM。
6. 最后调用Speed_Control函数,将Vx、Vy和Vz作为参数传入,实现速度控制。
根据您的问题,如果误差较小时电机输出值太小,您可以考虑调整PD控制器的参数,增大比例系数KP或者微分系数KD,以增加控制器的响应速度。另外,您也可以尝试使用增量式控制器来替代PD控制器,以解决误差较小时电机输出值过小的问题。
相关问题
/**********/在c语言中什么意思
在C语言中,`/**********/`并没有特殊的意义。这看起来像是一个注释的样式,但实际上在C语言中,注释是以`/*`开始,并以`*/`结束的。所以,如果你看到`/**********/`,它可能就是一个不完整或者错误的注释。
例如,以下的代码是正确的注释使用方法:
```c
/* 这是一个注释 */
```
而以下的代码是错误的:
```c
/**********/ 这是一个注释 // 这是另一个注释
```
在这个例子中,`/**********/`并没有起到任何作用,只有`/* 这是一个注释 */`是有效的注释。
/** @defgroup */
/** @defgroup 是Doxygen文档生成工具中的一个指令,用于创建一个模块组。模块组是一种将相关的模块组织在一起的方式,可以方便地对这些模块进行管理和查看。
模块组可以包含多个模块,每个模块都有自己的文档和功能。通过使用/** @defgroup 指令,可以为每个模块创建一个独立的文档页面,并将它们组织在一个模块组中。
使用/** @defgroup 指令的格式如下:
/**
* @defgroup group_name group_title
* @{
* // 模块内容
* @}
*/
其中,group_name是模块组的名称,group_title是模块组的标题。在@{和@}之间的部分是模块组的具体内容,可以包含多个模块。
通过使用/** @addtogroup 指令,可以将一个模块添加到已存在的模块组中。例如:
/**
* @addtogroup group_name
* @{
* // 模块内容
* @}
*/
这样,就可以将一个新的模块添加到已存在的模块组中。