📄 pidtext._c
字号:
/*------------------------------------------------------------
;------------------------------------------------------------
; PID LIB
; V0.1c
; zhongwh
; Copyright 2003-2005
; Email: hfkj01@163.com
; mtel : 13708004895
; 2005-9-28 15:38:52
; ICC-AVR application builder
;-------------------------------------------------------------
;-------------------------------------------------------------
; Target : ALL AVR
; Crystal: 8Mhz
;-------------------------------------------------------------
;-------------------------------------------------------------*/
#include <io8515v.h>
#include <macros.h>
#include <eeprom.h>
#define uchar unsigned char
#define uint unsigned int
//
#define Kp_E2P_Addr 0x40
#define Ki_E2P_Addr 0x41
#define Kd_E2P_Addr 0x42
#define Set_E2P_TargetV_Addr_h 0x43
#define Set_E2P_TargetV_Addr_l 0x44
uchar Kp=0,Ki=0,Kd=0 ,s_e_0=0,s_e_1=0,s_e_2=0;//状态=1为负数
uint Set_Target_Value=0,PID_OutValue=0,PID_OutValue_1=0,e_0=0,e_1=0,e_2=0,Check_Value=7;
//v=v0+Kp[(e_0-e_1)+Ki*e_0+Kd(e_0-2*e_1+e_2)]
void read_PID_E2P_Value(void)
{
uchar set_Target_value_h,set_Target_value_l ,Kp_1,Ki_1,Kd_1;
EEPROM_READ(Kp_E2P_Addr,Kp_1);
if (Kp_1>=100){Kp=100;}else{Kp=Kp_1;}
EEPROM_READ(Ki_E2P_Addr,Ki_1);
if (Ki_1>=100){Ki=100;}else{Ki=Ki_1;}
EEPROM_READ(Kd_E2P_Addr,Kd_1);
if (Kd_1>=100){Kd=100;}else{Kd=Kd_1;}
EEPROM_READ(Set_E2P_TargetV_Addr_h,set_Target_value_h);
EEPROM_READ(Set_E2P_TargetV_Addr_l,set_Target_value_l);
Set_Target_Value=set_Target_value_h;
Set_Target_Value=(Set_Target_Value<<8)+set_Target_value_l;
}
void PID_Count(void)
{ uint Ea,Eb,Ec,Ed,Ee,Ef,Eg,Eh,Ei,Ej;
uchar s_Ea=0,s_Eb=0,s_Ec=0,s_Ed=0,s_Ee=0,s_Ef=0,s_Eg=0,s_Eh=0,s_Ei=0;
//e_0
if (Set_Target_Value>=Check_Value)
{
e_0=Set_Target_Value-Check_Value;
s_e_0=0;
}
else
{
e_0=Check_Value-Set_Target_Value;
s_e_0=1;
}
//Ea=e_0-e_1
if (e_0>=e_1)
{
if (s_e_0==0)
{
if (s_e_1==0)
{
Ea=e_0-e_1;
}
else
{
Ea=e_0+e_1;
}
}
else
{
if (s_e_1==0)
{
Ea=e_0+e_1;
s_Ea=1;
}
else
{
Ea=e_0-e_1;
s_Ea=1;
}
}
}
else
{
if (s_e_0==0)
{
if (s_e_1==0)
{
Ea=e_1-e_0;
s_Ea=1;
}
else
{
Ea=e_1+e_0;
s_Ea=0;
}
}
else
{
if (s_e_1==0)
{
Ea=e_1+e_0;
s_Ea=1;
}
else
{
Ea=e_1-e_0;
s_Ea=0;
}
}
}
//Eb=Ki*e_0
if (s_e_0==0)
{
Eb=Ki*e_0;
}
else
{
Eb=Ki*e_0;
s_Eb=1;
}
//Ec=2*e_1
if (s_e_1==0)
{
Ec=2*e_1;
}
else
{
Ec=2*e_1;
s_Ec=1;
}
//Ed=e_0-2*e_1(Ed=e_0-Ec)
if (e_0>=Ec)
{
if (s_e_0==0)
{
if (s_Ec==0)
{
Ed=e_0-Ec;
}
else
{
Ed=e_0+Ec;
}
}
else
{
if (s_Ec==0)
{
Ed=e_0+Ec;
s_Ed=1;
}
else
{
Ed=e_0-Ec;
s_Ed=1;
}
}
}
else
{
if (s_e_0==0)
{
if (s_Ec==0)
{
Ed=Ec-e_0;
s_Ed=1;
}
else
{
Ed=Ec+e_0;
s_Ed=0;
}
}
else
{
if (s_Ec==0)
{
Ed=Ec+e_0;
s_Ed=1;
}
else
{
Ed=Ec-e_0;
s_Ed=0;
}
}
}
//Ee=Ed+e_2
if (s_Ed==0)
{
if (s_e_2==0)
{
Ee=Ed+e_2;
}
else
{
if (Ed>=e_2){Ee=Ed-e_2;}else{Ee=e_2-Ed;s_Ee=1;}
}
}
else
{
if (s_e_2==0)
{
if (Ed>=e_2){Ee=Ed-e_2;s_Ee=1;}else{Ee=e_2-Ed;}
}
else
{
Ee=Ed+e_2;s_Ee=1;
}
}
//Ef=Kd*Ee
if (s_Ee==0)
{
Ef=Kd*Ee;
}
else
{
Ef=Kd*Ee;
s_Ef=1;
}
//Eg=Ea+Eb
if (s_Ea==0)
{
if (s_Eb==0)
{
Eg=Ea+Eb;
}
else
{
if (Ea>=Eb){Eg=Ea-Eb;}else{Eg=Eb-Ea;s_Eg=1;}
}
}
else
{
if (s_Eb==0)
{
if (Ea>=Eb){Eg=Ea-Eb;s_Eg=1;}else{Eg=Eb-Ea;}
}
else
{
Eg=Ea+Eb;s_Eg=1;
}
}
//Eh=Eg+Ef
if (s_Eg==0)
{
if (s_Ef==0)
{
Eh=Eg+Ef;
}
else
{
if (Eg>=Ef){Eh=Eg-Ef;}else{Eh=Ef-Eg;s_Eh=1;}
}
}
else
{
if (s_Ef==0)
{
if (Eg>=Ef){Eh=Eg-Ef;s_Eh=1;}else{Eh=Ef-Eg;}
}
else
{
Eh=Eg+Ef;s_Eh=1;
}
}
//Ei=Kp*Eh
if (s_Eh==0)
{
Ei=Kp*Eh;
}
else
{
Ei=Kp*Eh;
s_Ei=1;
}
//PID_OutValue=PID_OutValue_1+Ei
if (s_Ei==0)
{
Ej=PID_OutValue_1+Ei;
if (Ej>=0x3ff){PID_OutValue=0x3ff;}else{PID_OutValue=Ej;}
}
else
{
if(PID_OutValue_1>=Ei){PID_OutValue=PID_OutValue_1-Ei;}else{PID_OutValue=0;}
}
//
PID_OutValue_1=PID_OutValue;
e_2=e_1;
s_e_2=s_e_1;
e_1=e_0;
s_e_1=s_e_0;
}
void main(void)
{
read_PID_E2P_Value();
while(1)
{
PID_Count();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -