问题
嵌入式PID算法的输出结果是如何转换成pwm控制的
遇到的现象和发生背景
我现在在开发中需要运用到pid算法,主要是压力传感器和流量传感器,pwm主要控制的是比例阀,控制着流量的大小,而流量也会影响输出端的压力大小,现在反馈的是传感器压力的值和我设定的压力值之间的差值作为e(k)
如下是我现在的pid主要代码流程
//根据增量式离散PID公式
//▲u(k) = Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]
//pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]
//e(k)代表本次偏差
//e(k-1)代表上一次的偏差 以此类推
//e(k-2)代表上上次的偏差
//pwm代表增量输出
typedef struct PID
{
float kp;
float ki;
float kd;
float ek; //当前误差
float ek_1; //上一次误差
float ek_2; //上上一次误差
float limit; //限幅
float pid_out; //pid增量累加和
//float ek_sum; //误差总和
}PID;
static PID pid;
void PID_Init()
{
pid.kp = 5; //这个接口后续调出方便调试使用
pid.ki = 0.25;
pid.kd = 3;
pid.limit = 1000;
pid.ek = 0;
pid.ek_1 = 0;
pid.ek_2 = 0;
pid.pid_out = 0;
}
// 增量式PID控制
float PID_Increase(int Encoder,int Target)
{
float delta_pwm = 0;
pid.ek = Target - Encoder; // 计算当前误差
//pid.ek_sum += pid.ek; //求出偏差的积分
delta_pwm = pid.kp*(pid.ek - pid.ek_1) + pid.ki*pid.ek +
pid.kd*(pid.ek - 2*pid.ek_1 + pid.ek_2); //增量式PID控制器
pid.ek_1 = pid.ek; //保存上一次偏差
pid.ek_2 = pid.ek_1; //保存上上一次的偏差
if(pid.pid_out > pid.limit) //这段判断后续再做判断要不要
{
delta_pwm = pid.limit;
}
else if(pid.pid_out < -pid.limit)
{
delta_pwm = -pid.limit;
}
pid.pid_out += delta_pwm;
return pid.pid_out;
}
我的解答思路和尝试过的方法
这是我的PID流程图
我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏”
我现在想知道我用PID增量算法得出来的结果那个数值,是怎么转换成pwm 0-100的开合度的?是不是有一个比例系数?是如何计算的?
我这流量和压力两个参数是不是要用串级pid好一点