c语言 PID
#include <Windows.h>
#include<stdio.h>
typedef struct{
float kp,ki,kd;
float ek,ek1,ek2; //ek1 是 ek 的前一次误差
float eSUM;
float out;
}PID;
PID pid = {10.0,10.0,0.0,0.0,0.0,0.0,0.0,0,0};
float PID_Loc(float SetValue, float ActualValue, PID *pid){
pid->ek=SetValue-ActualValue;
pid->eSUM += pid->ek;
pid->out=(pid->kp * pid->ek)
+(pid->ki * pid->eSUM)
+(pid->kd *( pid->ek1-pid->ek));
pid->ek1 = pid->ek;
returnpid->out;
}
int main()
{
int i, j;
PID t ;
int T=100;
for(i=0; i<5; i++){
for(j=4; j>0; j--){
printf ("%d\n",i);
printf ("%d\n",j);
PID_Loc(i, j , &t);
printf ("%d\n",t.out);
Sleep(T);//延时ms
}
}
}
如上代码所示 为什么这个pid out的值恒不变,讲道理应该会变得啊 t没有初始化,虽然定义了全局变量pid,但是却没有用上。
PID_Loc函数内使用的是t,kp, ki, kd都是0 本帖最后由 Cool_Breeze 于 2020-8-28 11:24 编辑
#include <Windows.h>
#include<stdio.h>
#include<stdlib.h>
typedef struct{
float kp,ki,kd;
float ek,ek1,ek2; //ek1 是 ek 的前一次误差
float eSUM;
float out;
}PID;
PID pid = {10.0,10.0,0.0,0.0,0.0,0.0,0.0,0};
float PID_Loc(float SetValue, float ActualValue, PID *pid){
pid->ek=SetValue-ActualValue;
pid->eSUM += pid->ek;
pid->out=(pid->kp * pid->ek)
+(pid->ki * pid->eSUM)
+(pid->kd *( pid->ek1-pid->ek));
pid->ek1 = pid->ek;
returnpid->out;
}
int main()
{
int i, j;
PID t = pid ; // 这里需要绑定在一起
int T=100;
for(i=0; i<5; i++){
for(j=4; j>0; j--){
printf ("%f\n",i);
printf ("%f\n",j);
PID_Loc(i, j , &t);
printf ("%f\n",t.out);
Sleep(T);//延时ms
}
}
} Json21 发表于 2020-8-28 11:09
t没有初始化,虽然定义了全局变量pid,但是却没有用上。
PID_Loc函数内使用的是t,kp, ki, kd都是0
前面的变量都是float型,打印的时候又搞个%d,这是闹哪样 coray 发表于 2020-8-28 11:17
前面的变量都是float型,打印的时候又搞个%d,这是闹哪样
这个影响不大吧 只是类型转化 我打印改成%f 也是不变的 coray 发表于 2020-8-28 11:17
前面的变量都是float型,打印的时候又搞个%d,这是闹哪样
确实这是个问题 我改了数字是动了 但是好像还是有问题
Json21 发表于 2020-8-28 11:09
t没有初始化,虽然定义了全局变量pid,但是却没有用上。
PID_Loc函数内使用的是t,kp, ki, kd都是0
刚刚才看到 抱歉 我去看一下 Json21 发表于 2020-8-28 11:09
t没有初始化,虽然定义了全局变量pid,但是却没有用上。
PID_Loc函数内使用的是t,kp, ki, kd都是0
PID_Loc(5, j , &t);
printf ("%f\n",t.out);
这段我用上了t
kp ki kd 在结构体之后我进行了赋值PID pid = {10.0,10.0,0.0,0.0,0.0,0.0,0.0,0.0}; 结构体,还没学,加油~努力~~
页:
[1]