我们需要的是单片机控制,将增量式pid的输出量转换成时间来控制固体继电器的开启时间?c程序这块就不会写
发布网友
发布时间:2022-04-29 21:00
我来回答
共2个回答
热心网友
时间:2023-10-09 03:07
代码修改如下(参考):
float pid_output = 10; //初始化一个控制器输出
int error0=0;
int error1=0;
int error2=0;
double Kp=1; //PID中的P,越大系统响应越快
double Ti = 0.1; //积分时间常数,越小积分作用越强,系统响应越快,系统越不稳定
double Td = 0.1; //微分时间常数
double T = 0.1; //采样周期
double ki=Kp*T/Ti; //离散后常数
double kd=Kp*Td/T;
int PID_control(unsigned int e)
{
int pid_output;
error0=e;
delta=(error0-error1)*kp+error0*ki+(error0-2*error1+error2)*kd;
pid_output = delta; //原文中的(1023/28.00)直接考虑到PID参数中,无需单独乘
error2=error1;
error1=error0;
return pid_output;
}
上面函数中定义你的PID参数和采样周期后,对应的就可以算出离散后的Kp,Ki,Kd参与计算。调参数只需调PID参数和采样周期即可。
由上面公式可以看出,增量式PID当误差为0时,控制器输出也为零。这就要求执行机构有积分保持特性,你确定你的执行机构在控制器输出为零时,能保持输出吗?如果不能,则应该用位置式PID。
上面公式得到的只是增量,位置式输出是上一时刻的PID输出加上这个增量。即
u(k)=u(k-1)+Δu(k)来自:求助得到的回答
热心网友
时间:2023-10-09 03:08
你好!你的要求不明确,没有看明白实现的功能追问就是把增量式pid的输出量转换成控制固体继电器的开关时间,从而来控制电磁阀的开关时间,来达到灌溉目的,输出量不同,则继电器的开关时间不同,所以定时这块不知道怎么下手写。