⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pidtext._c

📁 用ICC-AVR编译器编译适用与AVR系列单片机的PID库.
💻 _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 + -