差。微分部分的作用强弱由微分时间Td决定。Td的值大,则它抑制e(t)变化的能力强,Td的值小,e(t)则它阻止变化的能力弱。
PID离散化
PID的数学公式是对一个连续系统的控制,在实际编程中我们不可能用单片机来实现对温度的连续采样,也不可能实现连续,所以要将算法离散化, 那么我们对算式G(s)?E(s)1Ki?Kp(1??Tds)?Kp??Kds U(s)Tiss进行离散化变换。
我们假设单片的对温度的采集的周期为Ts,那么我们的采集温度也就是PID算法输入就变为R(T0-k*Ts),k=1,2,3……。设目的温度为G(k) 那么从T0时刻起,系统的输入误差U(k)
U(k)=G(k)-R(T0-k*Ts)
对于离散的U(k)误差积分项变为;k Ki * U(k) Σ
而微分项变为;
Kd *△U(k)=Kd*[U(k) -U(k-1)]
= Kd*R[T0-(k+1)*Ts]-Kd* R(T0-k*Ts)
所以最终的算式如式所示离散变换得
E(k)=Kp*U(k)+Ki*ΣU(k)+Kd*[U(k)-U(k-1)]
pid c语言实现:
对于已经离散化的pid公式,就可以程序来进行编写和实现,我们编写程序的思想是,构造一个循环函数,来实现pid的迭代运算。
首先我们将当前设定的温度定义为终点Set_Point,然后将单片机的定时中断装入合适的初值 这样每隔一个周期T单片机便将获取的环境温度送去与设定温度(Set_Point)进行比较,计算出温度误差U(k),将U(K)的值赋给Error,这时可以计算出比例项,Kp*Error
又过一个周期将计算出的U(k-1)的值赋给Next_Error,由Error- Next_Error=dError,我们就可以得到微分项;Kd*dError。
至于积分项,每当PID的循环算法执行一次,累积误差SumError变加上当前误差Error,SumError在不停的做一个累加运算,所以积分项为;Ki*SumError。
28
n=0 (3-5) (3-6)
(3-7)
(3-8)
每一个周期的PID计算程序执行完后,将当前的Next_Error的值赋给 Error,这样在下一个周期时Next_Error装入新的误差值,以便计算下一个dError的值,得出微分项,整个pid计算程序的流程图如下图所示。
等待中断 返回结果 将Next-Error的值传递给Error 开始 PID结构体初始化 Error=0 读取当前温度 计算 Next_Error 复制个、 Sumerror+=Error 计算dError=Error-Next_Error 图 3-10 pid流程图
部分c语言语句如下
定义PID结构体,由于节省编写量 将unsigned int 变量define为 uint struct PID {
uint SetPoint; // 设定目标 Desired Value uint Proportion; // 比例常数 uint Integral; // 积分常数 uint Derivative; // 微分常数
uint PrevError; // Error uint LastError; // Error
uint SumError; // Sums of Errors };
struct PID spid; // PID Control Structure
下面是PID的计算函数
uint PIDCalc( struct PID *pp, uint NextPoint )
29
{
uint dError,Error;
pp->SetPoint=set_temper;
Error = pp->SetPoint - NextPoint; // 偏差 pp->SumError += Error; // 积分
dError = pp->LastError - pp->PrevError; // 当前微分 pp->PrevError = pp->LastError; pp->LastError = Error;
return (pp->Proportion * Error // 比例项 + pp->Integral * pp->SumError // 积分项 + pp->Derivative * dError); // 微分项 }
3.5串行通信
串行通信的传输方向
1、单工
单工是指数据传输仅能沿一个方向,不能实现反向传输。 2、半双工
半双工是指数据传输可以沿两个方向,但需要分时进行。 3、全双工
全双工是指数据可以同时进行双向传输。
当T1作为波特率发生器时,最典型的用法是使T1工作在自动再装入的8位定时器方式(即方式2,且TCON的TR1=1,以启动定时器)。这时溢出率取决于TH1中的计数值。
T1 溢出率 = fosc /{12×[256 -(TH1)]}
串行口工作之前,应对其进行初始化,主要是设置产生波特率的定时器1、串行口控制和中断控制。具体步骤如下:
30
确定T1的工作方式(编程TMOD寄存器); 计算T1的初值,装载TH1、TL1; 启动T1(编程TCON中的TR1位); 确定串行口控制(编程SCON寄存器);
串行口在中断方式工作时,要进行中断设置(编程IE、IP寄存器)。
串行通行的部分程序 主机发送程序:
void init_com(void) {
TMOD = 0x20; PCON = 0x00; SCON = 0x50; TH1 = 0xFd; TL1 = 0xFd; TR1 = 1; }
void comm(char *parr) { do { }
SBUF= *parr++; //发送数据 TI=0; //标志清零
}while(*parr); //保持循环直到字符为'\\0'
while(!TI); //等待发送完成标志为1
31
4系统调试及仿真
4.1仿真环境
Proteus 软件是来自英国Labcenter electronics 公司的EDA 工具软件,Proteus 软件有近20年的历史,在全球广泛使用。它除了具有和其它EDA 工具一样的原理布图、PCB 自动或人工布线及电路仿真的功能外,其革命性的功能是,它的电路仿真是交互的,可视化的,针对微处理器的应用,还可以直接在基于原理图的虚拟原型上编程,并实现软件源码级的实时调试,如有显示及输出,还能看到运行后输入输出的效果,配合系统配置的虚拟仪器如示波器、逻辑分析仪等,可以测量仿真的波形及记录仿真数据。在不需要硬件设备投入的情况下Proteus 软件可以建立完整的电子学习设计开发环境,缩短研发周期,并且降低开发成本。
Proteus 组合了高级原理布图、混合模式SPICE 仿真,PCB 设计以及自动布线来实现一个完整的电子设计系统。此系统受益于多年来的持续开发,被《电子世界》在其对PCB 设计系统的比较文章中评为最好产品—―The Route to PCB CAD‖。Proteus 产品系列也包含了我们革命性的VSM 技术,用户可以对基于微控制器的设计连同所有的周围电子器件一起仿真。用户甚至可以实时采用诸如LED/LCD、键盘、RS232 终端等动态外设模型来对设计进行交互仿真。
其功能模块:—个易用而又功能强大的ISIS 原理布图工具;PROSPICE 混合模型SPICE 仿真; ARESPCB 设计。
PROSPICE 仿真器的一个扩展PROTEUS VSM:便于包括所有相关的器件的基于微处理器设计的协同仿真。此外,还可以结合微控制器软件使用动态的键盘,开关,按钮,LED 甚至LCD 显示CPU 模型。 Proteus 主要特征:
(1)支持许多通用的微控制器,如 ARM,PIC,AVR,以及8051。 (2)交互的装置模型包括:LED 和LCD 显示,RS232 终端,通用键盘。 (3)强大的调试工具,包括寄存器和存储器,断点和单步模式。 (4)IAR C-SPY 和 Keil uVision2 等开发工具的源层调试。 (5)应用特殊模型的 DLL 界面-提供有关元件库的全部文件。
32