关于单片机PID的算法实现
//================================================================
// pid.H
// Operation about PID algorithm procedure
// C51编译器 Keil 7.08
//================================================================
// 作者:zhoufeng
// Date :2007-08-06
// All rights reserved.
//================================================================
#include
#include
typedef
typedef
typedef
//
void
void
//================================================================
typedef struct PIDValue
{
uint32
uint8
uint8
uint8
uint8
uint16
uint16
uint16
}PIDValueStr;
PIDValueStr PID;
uint8
uint8
//================================================================
PID = Uk + KP*[E(k)-E(k-1)]+KI*E(k)+KD*[E(k)-2E(k-1)+E(k-2)];(增量型PID算式)
函数入口: RK(设定值),CK(实际值),KP,KI,KD
函数出口: U(K)
//PID运算函数
//================================================================
void
{
uint32
uint32
uint32
Temp[0] = 0;
Temp[1] = 0;
Temp[2] = 0;
PostSum = 0;
NegSum = 0;
if( PID.RK_Uint16 > PID.CK_Uint16 )
{
if( PID.RK_Uint16 - PID.CK_Uint16 >10 )
{
else
{
//================================================================
Temp[0]=PID.Ek_Uint32[0] - PID.Ek_Uint32[1];
{
Temp[0]=PID.Ek_Uint32[0] - PID.Ek_Uint32[1];
//================================================================
if( (PID.Ek_Uint32[0]+ PID.Ek_Uint32[2])>Temp[2] )
Temp[2]=(PID.Ek_Uint32[0]+ PID.Ek_Uint32[2])-Temp[2];
{
Temp[2]=Temp[2]-(PID.Ek_Uint32[0]+ PID.Ek_Uint32[2]); //E(k-2)+E(k)<2E(k-1)
//================================================================
//以下部分代码是讲所有的正数项叠加,负数项叠加
//KP*[E(k)-E(k-1)]
if(PID.EkFlag_Uint8[0]==0)
PostSum += Temp[0];
else
NegSum += Temp[0];
// KI*E(k)
if(PID.EkFlag_Uint8[1]==0)
PostSum += Temp[1];
else
//KD*[E(k-2)+E(k)-2E(k-1)]
if(PID.EkFlag_Uint8[2]==0)
PostSum += Temp[2];
else
NegSum += Temp[2];
//U(K)
PostSum += (uint32)PID.Uk_Uint16;
if(PostSum > NegSum )
{ Temp[0] = PostSum - NegSum;
if( Temp[0] < 100 )
PID.Uk_Uint16 = (uint16)Temp[0];
else
PID.Uk_Uint16 = 100;
}
else
}
}
else
{ PID.Uk_Uint16 = 0; }
单片机PID算法实 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)