原创 温控器PID算法的实现(C语言)

2008-9-24 14:18 9916 8 9 分类: MCU/ 嵌入式

硬件原理:加热电阻为400,电源为市电,固态继电器控制通断,并提取市电的过零信号,单片机采用mega48,继电器通断最小时间为10ms,通断PWM的周期为100个过零信号.


本程序采用绝对式PID算法,当温度相差很多时,采用P算法(比例算法),当到达设定温度时,采用PID算法,实际实用稳定性还可以,上下波动在0.5度以内.


#include <avr/io.h>
#include "PID.h"
//static PID sPID;
//static PID *sptr=&sPID;
TADD Tadd1;
TADD Tadd2;
void IncPIDInit(PID *sptr)
{
 sptr->SumError=0;
 sptr->LastError=0;
 sptr->PrevError=0;
 
 //sptr->Proportion = 900;
 //sptr->Integral=20;
 //sptr->Derivative = 2;
 
 //sptr->SetPoint = 0;
}


 


typedef struct
{
 int SetPoint;   //设定目标值
 int32_t SumError; //误差累计
 
 //int Proportion;
 //int Integral; //积分常数
 //int Derivative; //微分常数
 
 int LastError;  //Error[-1]
 int PrevError;  //Error[-2]
}PID;
#define PID_Proportion 900    //比例常数
#define PID_Integral 20  //积分常数
#define PID_Derivative 2  //微分常数
#define PWM_T 100
#define MAX_T 80   //加热的最大温度 
typedef struct
{
 PID spid; //PID控制器
 unsigned char pwm_H;//输出
 unsigned char EnAdd;//加热使能
 int real_T;   //实际温度值
 unsigned char Taddset[3]; //加热的设定温度
 unsigned char set_NO;   //加热的档数
 unsigned char errorflg;
 unsigned char addokflg;
}TADD;


void LocPIDCalc(TADD *sptr)
{
 int iError,dError;
 int32_t result;
 iError = (sptr->spid.SetPoint*4) - (sptr->real_T/4);
 //sptr->spid.LastError = iError;
 if(iError>-2&&iError<4)
 {
  sptr->addokflg=1;
  sptr->spid.SumError +=iError;
  dError = iError-sptr->spid.LastError;
  sptr->spid.LastError = iError;
  result=(PID_Proportion * iError +
   PID_Integral * sptr->spid.SumError +
   PID_Derivative * dError)/20;
 }
 else
 {
  sptr->spid.SumError =0;
  sptr->spid.LastError=0;
  if(iError>0)
   sptr->addokflg=0;
  result=(PID_Proportion * iError)/20;
 }
 if(result>PWM_T)
  result=PWM_T;
 else if(result<0)
  result=0;
 if((sptr->real_T>>4)>MAX_T||sptr->errorflg==0)
  result=0;
 sptr->pwm_H=(unsigned char) result;
 //return (unsigned char) result;
}


 

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

xucun915_925777961 2009-2-27 13:22

好的,不错,俺来学习学习……
相关推荐阅读
用户136065 2012-05-29 16:46
立体车库操作盒(内有本项目的源代码,电路图)
https://static.assets-stash.eet-china.com/album/old-resources/2009/2/26/8ba54db8-208e-4ab8-850e-b7...
用户136065 2008-12-17 13:50
STM32 protel 封装(不断更新中)
STM32 Protel 封装只画了三个封装(LQFP48,LQFP64,LQFP100)https://static.assets-stash.eet-china.com/album/old-res...
用户136065 2008-11-03 16:54
最新发现与创新:科学家证实电子电路存在记忆电阻
 美国科学家日前宣布,他们已证实电子电路存在第四种基本元件———记忆电阻(简称忆阻),并成功设计出一个能工作的忆阻实物模型。   早在1971年,非线性电路理论先驱、美国加利福尼亚大学伯克利分校的华裔...
用户136065 2008-11-03 12:06
国内主要网络电台地址
mms://211.89.225.101/live3 中央电台音乐频道      收听mms://vl.sina.com.cn/popmusic 东广音乐台动感101mms://vstream.sin...
用户136065 2008-11-03 11:47
W5100集TCP/IP协议栈、以太网MAC和PHY为一体
W5100是WIZnet公司最新推出的固件网络芯片,它是在W3150A+的基础上,集成了以太网物理层RTL8201CP核,因此W5100集TCP/IP协议栈、以太网MAC和PHY为一体。W5100支持...
用户136065 2008-10-20 11:22
iccavr用户手册(中文)
https://static.assets-stash.eet-china.com/album/old-resources/2008/10/20/370fcf86-59d6-46f9-a7e5-e01...
我要评论
1
8
关闭 站长推荐上一条 /3 下一条