数字PI控制器

最近项目需要用到PI控制器,于是参考网上的一些资料,尝试着写了一下,将它记录下来以备后用。

PID公式:


Ti,Td分别为积分,微分常数,只取PI部分:



根据采样周期T离散化,t=nT,用n表示,



可得增量式:

分别为比例,积分系数



为计算系数
最终输出为:


写代码时,定义一个结构体来存放各个参数,

程序设计流程为:

本次采样输入→计算本次误差→计算输出增量→更新数据为下次做准备

附源码:

/************声明和定义,通常放在头文件中********/
typedef struct
{
	int SetValue;        //设置值
	int An;			//当前误差e(n)的系数,=kp+ki
	int Bn_1;			//前一项误差e(n-1)的系数,= -kp
	int Limit;			//限制最大最小值
	int Errorn_1;		//e(n-1)
	int DeltaUn;		//输出增量△u(n);
	int Un_output;	//输出值 u(n)
}PI_Typedef;

void PI_StructInit(PI_Typedef *PI_Struct,int Kp,int Ki,int limit);
void PI_Controller(PI_Typedef *PI_Struct,int NewInput,int *Output);
/*****************************************************************/


void PI_StructInit(PI_Typedef *PI_Struct,int Kp,int Ki,int limit)
{
	PI_Struct->SetValue = 0;
	PI_Struct->An = Kp+Ki;
	PI_Struct->Bn_1 = -Kp;
	PI_Struct->Limit = limit;
	PI_Struct->DeltaUn = 0;
	PI_Struct->Errorn_1 = 0;
}

void PI_Controller(PI_Typedef *PI_Struct,int NewInput,int *Output)
{
	int Errorn =0;

	Errorn = PI_Struct->SetValue - NewInput;//计算e(n)

	PI_Struct->DeltaUn = (PI_Struct->An)*Errorn+(PI_Struct->Bn_1)*(PI_Struct->Errorn_1);//计算增量
	PI_Struct->Errorn_1 = Errorn;//保存误差e(n)作为下一次计算的e(n-1)
	//限制增量的范围
	if(PI_Struct->DeltaUn > PI_Struct->Limit)
		{PI_Struct->DeltaUn = PI_Struct->Limit;}
	else if(PI_Struct->DeltaUn < -PI_Struct->Limit)
		{PI_Struct->DeltaUn = -PI_Struct->Limit;}

	PI_Struct->Un_output += PI_Struct->DeltaUn; //计算输出u(n)=u(n-1)+△u(n),并保存作下一次运算

	*Output = PI_Struct->Un_output;
}
 

源码和公式下载:http://download.csdn.net/detail/wind4study/8608351

参考:http://wenku.baidu.com/linkurl=6ruMmAQJXxQDwhJZSYlZEYdfRMrMuZ_HvK5XfiTZja9y4Nxwa3J8AKiKhWvIJ5SoSjNiZ1lkAsvuhO3e7HLVnhNmhHygdIVhtqIkUDL2x_
wind
2015,04,18


  • 8
    点赞
  • 98
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
双有源桥电压闭环数字PI控制器是一种用于控制电力系统中的有源桥电路的控制器。它通过对电压进行调节来实现对系统的稳定控制。 以下是一个简单的C语言程序示例,用于实现双有源桥电压闭环数字PI控制器: ```c #include <stdio.h> // 双有源桥电压闭环数字PI控制器参数 float kp = 1.0; // 比例增益 float ki = 0.5; // 积分增益 // 初始化变量 float referenceVoltage = 10.0; // 参考电压 float measuredVoltage = 0.0; // 测量电压 float error = 0.0; // 误差 float integral = 0.0; // 积分项 float outputVoltage = 0.0; // 输出电压 // 更新输出电压 void updateOutputVoltage() { error = referenceVoltage - measuredVoltage; integral += error; outputVoltage = kp * error + ki * integral; } int main() { // 模拟电压测量,这里假设测量电压为5.0 measuredVoltage = 5.0; // 更新输出电压 updateOutputVoltage(); // 打印输出电压 printf("Output voltage: %.2f\n", outputVoltage); return 0; } ``` 在这个示例程序中,我们首先定义了双有源桥电压闭环数字PI控制器的参数,包括比例增益kp和积分增益ki。然后,我们初始化了一些变量,包括参考电压referenceVoltage、测量电压measuredVoltage、误差error、积分项integral和输出电压outputVoltage。 在main函数中,我们假设测量电压为5.0,并调用updateOutputVoltage函数来更新输出电压。最后,我们打印输出电压。 这只是一个简单的示例程序,实际的双有源桥电压闭环数字PI控制器可能需要更复杂的算法和更多的参数来实现更精确的控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值