基于单片机的pid控制程序

合集下载

基于单片机的PID温度控制

基于单片机的PID温度控制

间延迟的控制系统 [ 1] , 它可以通过模型设定和频率响应设定两种方法设定 PID 控制器的参数 K p 、、Ti 。Td 假设控制系统模型为:
如图.5 在时域内作系统的阶跃响应曲线,根据曲线可以得出特征参数 k , L 和 T 的值, 有了这些参数, 并假设ê = kL/ T , 则 PID 控制器的参数可以由表 1 求出来。如图.6 在频域内作系统的 Nyquist 图, 可以从图形上直接得出系统 的相位穿越频率ω g 和该点处的增益值 K g , 这样就可以得出 Tg = 2 π / ω g , 这时 PID 控制器的参数也可以由表 1 求出来。
2.1 实物展示
图.1
ቤተ መጻሕፍቲ ባይዱ图.2
图.3
图.4
图.1 是用欧姆龙的温控器,已经集成于机箱中,图.2 是单片机模块,图.3 是 实验室实验平台,图.4 是系统集成模块。
3.1 PID 参数自整定思想
本系统的被控对象是某水壶里的温度, 一般温度可近似用一阶惯性纯滞后环 节来表示, 其传递函数 G s
PID 控制指的是通过调整上式的控制器参数 K p 、Ti 、Td , 使整个控制 系统性能满足工作要求。自整定 PID 控制提供了简单的调整参数的方法, 使其 能够达到较好的控制效果 。常用的自整定 PID 设定参数方法有 :Zieg ler -Nichols 方法、改进的 Zieg ler -Nichols 方法、幅值相位裕度设定方法及最 优整定方法等, 下面将分别介绍各种参数设定方法 (1)Ziegler -Nichols 方法。Zieg ler 和 Nichols 提控制策略给出的控制 结构, PID 控制器模型为出的调节 PID 控制器参数的经验公式适用于具有纯时
3.3

基于单片机的pid温度控制系统设计

基于单片机的pid温度控制系统设计

一、概述单片机PID温度控制系统是一种利用单片机对温度进行控制的智能系统。

在工业和日常生活中,温度控制是非常重要的,可以用来控制加热、冷却等过程。

PID控制器是一种利用比例、积分、微分三个调节参数来控制系统的控制器,它具有稳定性好、调节快等优点。

本文将介绍基于单片机的PID温度控制系统设计的相关原理、硬件设计、软件设计等内容。

二、基本原理1. PID控制器原理PID控制器是一种以比例、积分、微分三个控制参数为基础的控制系统。

比例项负责根据误差大小来控制输出;积分项用来修正系统长期稳态误差;微分项主要用来抑制系统的瞬时波动。

PID控制器将这三个项进行线性组合,通过调节比例、积分、微分这三个参数来实现对系统的控制。

2. 温度传感器原理温度传感器是将温度变化转化为电信号输出的器件。

常见的温度传感器有热电偶、热敏电阻、半导体温度传感器等。

在温度控制系统中,温度传感器负责将环境温度转化为电信号,以便控制系统进行监测和调节。

三、硬件设计1. 单片机选择单片机是整个温度控制系统的核心部件。

在设计单片机PID温度控制系统时,需要选择合适的单片机。

常见的单片机有STC89C52、AT89S52等,选型时需要考虑单片机的性能、价格、外设接口等因素。

2. 温度传感器接口设计温度传感器与单片机之间需要进行接口设计。

常见的温度传感器接口有模拟接口和数字接口两种。

模拟接口需要通过模数转换器将模拟信号转化为数字信号,而数字接口则可以直接将数字信号输入到单片机中。

3. 输出控制接口设计温度控制系统通常需要通过继电器、半导体元件等控制输出。

在硬件设计中,需要考虑输出接口的类型、电流、电压等参数,以及单片机与输出接口的连接方式。

四、软件设计1. PID算法实现在单片机中,需要通过程序实现PID控制算法。

常见的PID算法包括位置式PID和增量式PID。

在设计时需要考虑控制周期、控制精度等因素。

2. 温度采集和显示单片机需要通过程序对温度传感器进行数据采集,然后进行数据处理和显示。

51单片机pid算法程序

51单片机pid算法程序

51单片机pid算法程序51单片机是一种广泛应用于嵌入式系统开发的微控制器。

PID算法是一种常用的控制算法,用于实现系统的闭环控制。

本文将介绍如何在51单片机上实现PID算法。

PID算法是一种经典的控制算法,它能够根据系统的反馈信息,自动调整控制量,使系统的输出接近期望值。

PID算法由比例项(P 项)、积分项(I项)和微分项(D项)组成。

比例项用来根据当前误差大小调整控制量,积分项用来根据过去误差的累积值调整控制量,微分项用来根据误差的变化速度调整控制量。

在51单片机上实现PID算法,首先需要编写程序来读取系统的反馈信息和期望值。

例如,可以通过ADC模块读取传感器的信号,然后通过计算得到当前误差。

接下来,根据比例项、积分项和微分项的系数,计算PID控制量。

最后,将PID控制量输出到执行机构,例如电机或舵机,来控制系统的输出。

在编写PID算法程序时,需要注意一些细节。

首先,要根据实际系统的特点和要求来选择合适的PID参数。

比例项的系数决定了控制量对误差的敏感程度,积分项的系数决定了控制量对误差累积值的敏感程度,微分项的系数决定了控制量对误差变化速度的敏感程度。

其次,要注意处理PID算法中的积分项和微分项的累积误差。

积分项的累积误差可能会导致系统出现超调或震荡,需要适当地进行限制或清零。

微分项的累积误差可能会导致系统出现噪声放大或不稳定,需要进行滤波或限制。

最后,要注意程序的效率和实时性。

PID算法通常需要以一定的频率进行计算和更新,要保证程序能够及时响应系统的变化。

除了基本的PID算法,还可以根据具体的应用需求进行算法的优化和改进。

例如,可以引入自适应调整PID参数的方法,使系统能够根据实时的工作条件自动调整PID参数。

还可以引入前馈控制或模糊控制等方法,进一步提高系统的控制性能和鲁棒性。

51单片机是一种常用的嵌入式系统开发平台,可以很方便地实现PID算法。

通过合理选择PID参数和优化算法,可以实现对系统的精确控制。

51单片机PID算法程序增量式PID控制算法

51单片机PID算法程序增量式PID控制算法

51单片机PID算法程序增量式PID控制算法增量式PID控制算法是一种常用的控制算法,可以应用于各种控制系统中。

该算法的原理是通过计算目标值与实际值之间的差异,来调整控制系统的输出,使其逐渐接近目标值。

增量式PID控制算法的核心思想是通过对目标值与实际值之间的差异进行积分和微分计算,来调整控制系统的输出。

这样可以使得控制系统对误差的响应更加敏感,从而实现更精确的控制效果。

在51单片机中实现增量式PID控制算法,可以按照以下步骤进行:1.参数设置:首先需要设置PID控制算法的参数,包括比例系数Kp、积分系数Ki和微分系数Kd。

这些参数可以根据实际控制系统的需求进行调整。

2.变量定义:定义控制系统所需的变量,包括目标值、实际值、误差值、上一次的误差值、累积误差值等。

3.计算误差:将目标值与实际值之间的差异作为误差值进行计算。

4.计算增量输出:根据误差值以及上一次的误差值和累积误差值,计算控制系统的增量输出。

增量输出的计算公式为:增量输出=Kp*(当前误差-上一次误差)+Ki*当前误差+Kd*(当前误差-上一次误差)5.更新变量:更新控制系统所需的变量,包括上一次的误差值和累积误差值。

6.输出信号:将增量输出作为控制系统的输出信号,并进行相应的处理。

通过上述步骤,就可以实现51单片机的增量式PID控制算法。

在实际应用中,可以根据具体情况对算法进行优化和改进,以满足实际控制的需求。

总结起来,增量式PID控制算法是一种常用的控制算法,可以通过计算目标值与实际值之间的差异,调整控制系统的输出,从而实现精确的控制效果。

在51单片机中实现增量式PID控制算法,可以按照参数设置、变量定义、计算误差、计算增量输出、更新变量和输出信号等步骤进行。

根据具体情况可以对算法进行优化和改进,以满足实际控制的需求。

基于单片机的软件实现PID温度控制系统

基于单片机的软件实现PID温度控制系统

姓名:专业:学号:学科:基于单片机的软件实现PID温度控制系统引言随着控制理论和电子技术的发展,工业控制器的高精度性要求越来越高,其中以单片机为核心实现的数字控制器因其体积小,成本低,功能强,简便易行而得到广泛应用。

温度控制器作为一种重要的控制设备,在化工,食品等诸多工业生产过程和家用电器中得到了广泛的应用,本文主要讨论在家用电器电冰箱中得到广泛应用的数字PID控制,在单片机温度控制系统中的应用。

通过对实验数据的分析表明单片机的温度控制系统设计的合理性和有效性。

1硬件系统设计本文所研究的温度控制系统硬件部分按功能大致可以分为以下几个部分:单片机主控模块,输入通道输出通道等。

硬件总体结构框图如图所示。

图1中,温度控制系统以单片机为核心,并扩展外部存储器,构成主控模块零度保鲜箱的温度由铂Pt100电阻温度传感器检测并转换成微弱的电压信号,再通过位的转换器转换成数字量,此数字量经过数字滤波之后,一方面将零度保鲜箱的温度通过控制面板上的液晶显示器显示出来,另一方面将该温度值与设定的温度值进行比较,根据其偏差值的大小,采用控制算法进行运算,最后通过控制双向可控硅控制周期内的通断占空比,即控制零度保鲜箱制冷平均功率的大小,进而达到对零度保鲜箱温度进行控制的目的。

控制系统电路的核心器件是Atmel公司生产的单片机,图2所示.它是一种低功耗低电压高性能的位单片机片,内带有一个的可编程可擦除只读存储器,它采用的工艺是Atmel公司的高密度非易失存储器技术。

其输出引脚和指令系统都与MCS51兼容且价格低廉,性能可靠,抗干扰能力强,因此广泛应用于工业控制和嵌入式系统中。

为了节省成本和体积采用多路选择开关和AD7705模数转换器协同工作,组成多路数据采集系统.AT24C02是Atmel公司生产的EEPROM器件,存储容量256字节可擦写次数达100万次,主要用来存储设定温度。

2软件实现PID控制PID控制是最早发展起来的控制策略之一,在微机测控系统中,软件与硬件同样重要.硬件是系统的躯体,软件则是灵魂,当系统的硬件电路设计好之后,系统的主要功能还是要靠软件来实现,而且软件的设计在很大程度上决定了测控系统的性能,很多的单片机软件系统都是采用如图2所示的前后台系统也称超循环系统。

基于单片机模糊PID控制算法实验设计

基于单片机模糊PID控制算法实验设计

基于单片机模糊PID控制算法实验设计基于单片机的模糊PID控制算法是一种将模糊逻辑和PID控制相结合的控制方法。

模糊PID控制算法在许多工程和科学领域中具有广泛的应用,用于控制各种物理系统,例如机械系统、电子系统和化学系统等。

本文将介绍基于单片机的模糊PID控制算法的实验设计。

一、实验目的本实验旨在通过使用单片机实现模糊PID控制算法,控制一个虚拟物理系统的运动。

通过这个实验,我们可以了解模糊PID控制算法的原理和实现过程,并通过实验结果对其性能进行评估。

二、实验原理模糊PID控制算法是将模糊逻辑和传统的PID控制算法相结合而得到的一种控制方法。

PID控制算法是一种反馈控制方法,它通过测量和计算系统的误差,调整输出控制量,使得系统的运行状态能够接近期望状态。

模糊PID控制算法的原理是,在PID控制算法的基础上,使用模糊逻辑来处理模糊因素,使得控制系统能够对模糊因素有更好的适应性和鲁棒性。

模糊逻辑是对不确定性和模糊性进行建模和处理的一种方法,它能够通过模糊集合和模糊规则来描述和处理模糊因素。

在模糊PID控制算法中,首先使用一组模糊集合来表示误差和变化率的程度,然后建立一组模糊规则,通过模糊推理得到模糊控制量,最后将模糊控制量经过模糊解模糊化得到实际控制量。

这样,通过模糊逻辑的处理,能够使得控制系统对于模糊因素有更好的适应性和鲁棒性。

三、实验步骤1.设计一个虚拟物理系统,可以使用一个电机控制器和一个电机模拟器来模拟物理系统的运动。

2.根据虚拟物理系统的特性,确定控制系统的输入和输出变量,例如位置和速度。

3.设计一组模糊集合来表示位置和速度的程度,例如“远”、“近”、“大”、“小”等。

4.建立一组模糊规则,通过模糊推理得到模糊控制量。

5.设计一个PID控制算法,用于计算系统的误差和调整输出控制量。

6.将模糊控制量和PID控制量相结合,得到最终的实际控制量。

7.使用单片机编程语言,例如C语言,实现上述的模糊PID控制算法。

单片机PID算法程序精编版

单片机PID算法程序精编版

单片机P I D算法程序公司内部编号:(GOOD-TMMT-MMUT-UUPTY-UUYY-DTTI-51单片机P I D算法程序(二)位置式P I D控制算法由51单片机组成的数字控制系统控制中,PID控制器是通过PID控制算法实现的。

51单片机通过AD对信号进行采集,变成数字信号,再在单片机中通过算法实现PID运算,再通过DA把控制量反馈回控制源。

从而实现对系统的伺服控制。

位置式PID控制算法位置式PID控制算法的简化示意图上图的传递函数为:(2-1)在时域的传递函数表达式(2-2)对上式中的微分和积分进行近似(2-3)式中n是离散点的个数。

于是传递函数可以简化为:(2-4)其中u(n)——第k个采样时刻的控制;KP——比例放大系数;Ki——积分放大系数;Kd——微分放大系数;T ——采样周期。

如果采样周期足够小,则(2-4)的近似计算可以获得足够精确的结果,离散控制过程与连续过程十分接近。

(2-4)表示的控制算法直接按(2-1)所给出的PID控制规律定义进行计算的,所以它给出了全部控制量的大小,因此被称为全量式或位置式PID控制算法。

缺点:1)由于全量输出,所以每次输出均与过去状态有关,计算时要对e(k)(k=0,1,…n)进行累加,工作量大。

2)因为计算机输出的u(n)对应的是执行机构的实际位置,如果计算机出现故障,输出u(n)将大幅度变化,会引起执行机构的大幅度变化,有可能因此造成严重的生产事故,这在实际生产中是不允许的。

位置式PID控制算法C51程序具体的PID参数必须由具体对象通过实验确定。

由于单片机的处理速度和ram资源的限制,一般不采用浮点数运算,而将所有参数全部用整数,运算到最后再除以一个2的N次方数据(相当于移位),作类似定点数运算,可大大提高运算速度,根据控制精度的不同要求,当精度要求很高时,注意保留移位引起的“余数”,做好余数补偿。

这个程序只是一般常用pid算法的基本架构,没有包含输入输出处理部分。

51单片机PID控制直流电机实验报告

51单片机PID控制直流电机实验报告
char code table[] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, //0~7 对应数码 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71}; //8~F 对应数码 long int n=num; P0 = 0; P2 =0x7f; P0 = table[n % 1000/100]; delayms(2);//百位 加小数点 P0 = 0; P2 =0xbf; P0 = table[n % 100 / 10]; delayms(2);//十位
iError = sptr->SetPoint - NextPoint; //计算增加量
iIncpid = sptr->Proportion * iError //E[k]项
- sptr->Integral * sptr->LastError //E[k-1]项
+ sptr->Derivative * sptr->PrevError; //E[k-2]项
static PID *sptr = &sPID;
void IncPIDInit()
{
sptr->SumError = 0;
sptr->LastError =0; //Error[-1]
sptr->PrevError =0; //Error[-2]
sptr->Proportion =0.5; //比例系数
sptr->Integral =0.3; //积分系数
sptr->Derivative = 0.3; //微分系数
sptr->SetPoint =sudu_lilun; Nhomakorabea}
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Jesse Rei 的51 温度PID经典算法#include<reg51.h>#include<intrins.h>#include<math.h>#include<string.h>struct PID {unsigned int SetPoint; // 设定目标Desired Valueunsigned int Proportion; // 比例常数Proportional Constunsigned int Integral; // 积分常数Integral Constunsigned int Derivative; // 微分常数Derivative Constunsigned int LastError; // Error[-1] unsigned int PrevError; // Error[-2] unsigned int SumError; // Sums of Errors };struct PID spid; // PID Control Structure unsigned int rout; // PID Response (Output) unsigned int rin; // PID Feedback (Input)sbit data1=P1^0;sbit clk=P1^1;sbit plus=P2^0;sbit subs=P2^1;sbit stop=P2^2;sbit output=P3^4;sbit DQ=P3^3;unsigned char flag,flag_1=0;unsigned char high_time,low_time,count=0;//占空比调节参数unsigned char set_temper=35;unsigned char temper;unsigned char i;unsigned char j=0;unsigned int s;void delay(unsigned char time){unsigned char m,n;for(n=0;n<time;n++)for(m=0;m<2;m++){}} void write_bit(unsigned char bitval) {EA=0;DQ=0;if(bitval==1){_nop_();DQ=1;}delay(5);DQ=1;_nop_();_nop_();EA=1;}void write_byte(unsigned char val) {unsigned char i;unsigned char temp;EA=0;TR0=0;for(i=0;i<8;i++){temp=val>>i;temp=temp&1;write_bit(temp);}delay(7);// TR0=1;EA=1;}unsigned char read_bit(){unsigned char i,value_bit;EA=0;DQ=0;_nop_();_nop_();DQ=1;for(i=0;i<2;i++){}value_bit=DQ;EA=1;return(value_bit);}unsigned char read_byte() {unsigned char i,value=0; EA=0;for(i=0;i<8;i++){if(read_bit())value|=0x01<<i;delay(4);}EA=1;return(value);}unsigned char reset() {unsigned char presence; EA=0;DQ=0;delay(30);DQ=1;delay(3);presence=DQ;delay(28);EA=1;return(presence);}void get_temper(){unsigned char i,j;do{i=reset();} while(i!=0);i=0xcc;write_byte(i);i=0x44;write_byte(i);delay(180);do {i=reset();} while(i!=0);i=0xcc;write_byte(i);i=0xbe;write_byte(i);j=read_byte();i=read_byte();i=(i<<4)&0x7f;s=(unsigned int)(j&0x0f); //得到小数部分s=(s*100)/16;j=j>>4;temper=i|j;}void PIDInit (struct PID *pp){memset ( pp,0,sizeof(struct PID)); //全部初始化为0}unsigned int PIDCalc( struct PID *pp, unsigned int NextPoint ){unsigned int dError,Error;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); // 微分项}void compare_temper(){unsigned char i;if(set_temper>temper) //是否设置的温度大于实际温度{if(set_temper-temper>1) //设置的温度比实际的温度是否是大于1度{high_time=100; //如果是,则全速加热low_time=0;}else //如果是在1度范围内,则运行PID计算{for(i=0;i<10;i++){get_temper(); //获取温度rin = s; // Read Inputrout = PIDCalc ( &spid,rin ); // Perform PID Interation}if (high_time<=100)high_time=(unsigned char)(rout/800);elsehigh_time=100;low_time= (100-high_time);}}else if(set_temper<=temper){if(temper-set_temper>0){high_time=0;low_time=100;}else{for(i=0;i<10;i++){get_temper();rin = s; // Read Inputrout = PIDCalc ( &spid,rin ); // Perform PID Interation}if (high_time<100)high_time=(unsignedchar)(rout/10000);elsehigh_time=0;low_time= (100-high_time);}}// else// {}}void serve_T0() interrupt 1 using 1{if(++count<=(high_time))output=1;else if(count<=100){output=0;}elsecount=0;TH0=0x2f;TL0=0xe0;}void serve_sio() interrupt 4 using 2{}void disp_1(unsigned char disp_num1[6]) {unsigned char n,a,m;for(n=0;n<6;n++){// k=disp_num1[n];for(a=0;a<8;a++){clk=0;m=(disp_num1[n]&1);disp_num1[n]=disp_num1[n]>>1;if(m==1)data1=1;elsedata1=0;_nop_();clk=1;_nop_();}}}void display(){unsigned char code number[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0 xbe,0xe0,0xfe,0xf6};unsigned char disp_num[6];unsigned int k,k1;k=high_time;k=k%1000;k1=k/100;if(k1==0)disp_num[0]=0;elsedisp_num[0]=0x60;k=k%100;disp_num[1]=number[k/10];disp_num[2]=number[k%10];k=temper;k=k%100;disp_num[3]=number[k/10];disp_num[4]=number[k%10]+1;disp_num[5]=number[s/10];disp_1(disp_num);}void main(){unsigned char z;unsigned char a,b,flag_2=1,count1=0; unsigned char phil[]={2,0xce,0x6e,0x60,0x1c,2};TMOD=0x21;TH0=0x2f;TL0=0x40;SCON=0x50; PCON=0x00;TH1=0xfd;TL1=0xfd;PS=1;EA=1;EX1=0;ET0=1;ES=1;TR0=1;TR1=1;high_time=50;low_time=50;PIDInit ( &spid ); // Initialize Structure spid.Proportion = 10; // Set PID Coefficients 比例常数Proportional Constspid.Integral = 8; //积分常数Integral Constspid.Derivative =6; //微分常数Derivative Constspid.SetPoint = 100; // Set PID Setpoint 设定目标Desired Valuewhile(1){if(plus==0){EA=0;for(a=0;a<5;a++)for(b=0;b<102;b++){}if(plus==0){set_temper++;flag=0;}}else if(subs==0){for(a=0;a<5;a++)for(b=0;a<102;b++){}if(subs==0){set_temper--;flag=0;}}else if(stop==0){for(a=0;a<5;a++)for(b=0;b<102;b++){}if(stop==0){flag=0;break;}EA=1;}get_temper();b=temper;if(flag_2==1)a=b;if((abs(a-b))>5)temper=a;elsetemper=b;a=temper;flag_2=0;if(++count1>30){display();count1=0;}compare_temper();}TR0=0;z=1;while(1){EA=0;if(stop==0){for(a=0;a<5;a++)for(b=0;b<102;b++){}if(stop==0)disp_1(phil);// break;}EA=1;}}。

相关文档
最新文档