PID 控制器,编码 D 部分的问题
PID controller, Issues with coding D part.
我正在努力创建一个用于控制电机的PID控制器。我研究了使用PID库,但我认为它不适合我的需求,因为我需要使用相同的控制器在两个方向上控制电机。
我目前有 PI 部分工作,但我正在努力处理 D 部分。我无法将当前错误存储到最后一个错误,然后可用于计算下一个 D 值。相反,我的 d 值似乎反映了错误,而不是当前错误与上次错误相比的变化。我的代码如下所示,任何建议将不胜感激。
**注意,我知道通常delta_T包含在控制器的积分和导数部分中,但是我更喜欢将其合并到控制常量Ki和Kd中以避免编码复杂化。
Distance = analogRead (irSense); //read the sensor, assigns value to Distance
//Serial.println(Distance) ;
double lastError;
int control; //initialize control variable , set up PID parameters
int setpoint = 350; //Neutral position, zero point, desired input
int error = Distance - setpoint; //error function
double d = (error - lastError); //derivative function
double kp = 0.9; //Proportional constant
double ki = 0.000001; //Intergral constant
double kd = .0001; //Derivitve constant
i += error; //intergral Set
control = error * kp + i * ki + d * kd; //PID control funtion
lastError = error;
Serial.println (d);
听起来好像
lastError 总是零。 也许在代码开头将其打印为调试信息。
如果您发布的代码位于函数内部,则可能需要 static 关键字:
static double lastError;
为了保留从调用到调用的值。 否则,它可能会重新初始化为零并为您提供看到的结果。 如果 lastError 是全局的,
对于导数(误差),有些人使用导数(measured_value)来避免对设定值变化敏感。
我会将您的代码更改为:
static double lastDistance;
...
double d = Distance-lastDistance
...
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 我在微控制器STM32F373发现中点亮LED的问题
- 要求将各种类型的各种类型传递给微控制器上的规则引擎.施放问题
- LPC微控制器上的DFU问题
- 在微控制器上编写 UART 控制台时出现 UTF-8 问题
- PID 控制器,编码 D 部分的问题
- 视图控制器中的 C 函数问题
- CppCMS教程:静态链接模板错误(控制器问题)