单片机PID算法实现
- 格式:doc
- 大小:36.00 KB
- 文档页数:5
基于单片机的PID恒温控制系统设计1. 引言恒温控制系统在现代工业生产中起着至关重要的作用,它能够确保生产过程中的温度稳定,从而保证产品质量和生产效率。
而PID控制器作为一种常用的控制器,具有简单易实现、稳定可靠等优点,被广泛应用于恒温控制系统中。
本文基于单片机的PID恒温控制系统设计,旨在研究和实现一种高效、精确的恒温控制方案。
2. 系统设计原理2.1 PID控制原理PID控制器是由比例项(P项)、积分项(I项)和微分项(D项)组成的。
比例项根据当前误差与设定值之间的差距来调整输出;积分项根据误差累积来调整输出;微分项根据误差变化率来调整输出。
PID控制器通过不断调整输出值与设定值之间的差距,使得系统能够快速、稳定地达到设定值。
2.2 单片机原理单片机是一种高度集成化、功能强大的微处理器芯片。
它具有处理能力强、可编程性好等特点,在工业控制领域得到广泛应用。
单片机可以通过输入输出端口与外部设备进行信息交互,通过控制算法调整输出信号,实现对恒温控制系统的精确控制。
3. 系统硬件设计3.1 传感器恒温控制系统中的传感器用于实时监测温度值,并将其转化为电信号输入给单片机。
常用的温度传感器有热电偶、热敏电阻等。
本设计中选择热敏电阻作为温度传感器。
3.2 控制器本设计中选择常用的STC89C52单片机作为控制器,它具有丰富的外设接口和高性能的处理能力,能够满足恒温控制系统的需求。
3.3 作动器作动器是恒温控制系统中负责调节环境参数(如加热、冷却等)以实现恒温目标的设备。
本设计中选择继电器作为作动器,它可以根据单片机输出信号来切换加热和冷却设备。
4. 系统软件设计4.1 温度采集与处理单片机通过模拟输入端口采集到来自传感器的模拟信号,然后通过模数转换器将其转化为数字信号。
接下来,通过算法对采集到的温度值进行处理,得到误差值。
4.2 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算法。
PID算法是一种经典的控制算法,它能够根据系统的反馈信息,自动调整控制量,使系统的输出接近期望值。
PID算法由比例项(P 项)、积分项(I项)和微分项(D项)组成。
比例项用来根据当前误差大小调整控制量,积分项用来根据过去误差的累积值调整控制量,微分项用来根据误差的变化速度调整控制量。
在51单片机上实现PID算法,首先需要编写程序来读取系统的反馈信息和期望值。
例如,可以通过ADC模块读取传感器的信号,然后通过计算得到当前误差。
接下来,根据比例项、积分项和微分项的系数,计算PID控制量。
最后,将PID控制量输出到执行机构,例如电机或舵机,来控制系统的输出。
在编写PID算法程序时,需要注意一些细节。
首先,要根据实际系统的特点和要求来选择合适的PID参数。
比例项的系数决定了控制量对误差的敏感程度,积分项的系数决定了控制量对误差累积值的敏感程度,微分项的系数决定了控制量对误差变化速度的敏感程度。
其次,要注意处理PID算法中的积分项和微分项的累积误差。
积分项的累积误差可能会导致系统出现超调或震荡,需要适当地进行限制或清零。
微分项的累积误差可能会导致系统出现噪声放大或不稳定,需要进行滤波或限制。
最后,要注意程序的效率和实时性。
PID算法通常需要以一定的频率进行计算和更新,要保证程序能够及时响应系统的变化。
除了基本的PID算法,还可以根据具体的应用需求进行算法的优化和改进。
例如,可以引入自适应调整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控制,在单片机温度控制系统中的应用。
通过对实验数据的分析表明单片机的温度控制系统设计的合理性和有效性。
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控制算法中,首先使用一组模糊集合来表示误差和变化率的程度,然后建立一组模糊规则,通过模糊推理得到模糊控制量,最后将模糊控制量经过模糊解模糊化得到实际控制量。
这样,通过模糊逻辑的处理,能够使得控制系统对于模糊因素有更好的适应性和鲁棒性。
三、实验步骤1.设计一个虚拟物理系统,可以使用一个电机控制器和一个电机模拟器来模拟物理系统的运动。
2.根据虚拟物理系统的特性,确定控制系统的输入和输出变量,例如位置和速度。
3.设计一组模糊集合来表示位置和速度的程度,例如“远”、“近”、“大”、“小”等。
4.建立一组模糊规则,通过模糊推理得到模糊控制量。
5.设计一个PID控制算法,用于计算系统的误差和调整输出控制量。
6.将模糊控制量和PID控制量相结合,得到最终的实际控制量。
7.使用单片机编程语言,例如C语言,实现上述的模糊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算法的基本架构,没有包含输入输出处理部分。
基于单片机pid算法的直流电机速度控制方法基于单片机PID算法的直流电机速度控制方法是一种常用的技术,其基本原理是通过调节PWM(脉宽调制)信号的占空比来控制电机的输入电压,从而实现电机的速度控制。
以下是基于单片机PID算法的直流电机速度控制方法的基本步骤:1.设定目标速度:首先,需要设定电机的目标速度。
这可以通过按键或其他输入设备来实现。
2.采集实际速度:为了实现精确的控制,需要实时获取电机的实际速度。
这可以通过在电机转轴上安装光电编码器或霍尔传感器来实现,这些传感器可以实时检测电机的转速并将其转换为电信号。
3.计算偏差:单片机通过比较目标速度和实际速度,计算出速度偏差。
如果实际速度小于目标速度,偏差为负;反之,偏差为正。
4.应用PID算法:单片机使用PID算法来处理速度偏差。
PID控制器通过比例、积分和微分三个环节来计算控制量,以尽可能消除偏差。
具体的PID参数(如Kp、Ki、Kd)可以根据实际情况进行调整,以获得最佳的控制效果。
5.生成PWM信号:基于PID控制器的输出,单片机生成PWM信号来调节电机的输入电压。
占空比决定了电机输入电压的大小,进而影响电机的转速。
6.实时调整:在整个控制过程中,单片机不断采集电机的实际速度,计算偏差,并调整PWM信号的占空比,以使电机尽可能接近目标速度。
7.显示和保存数据:为了方便调试和观察,可以通过单片机的显示屏实时显示电机的实际速度和偏差。
此外,也可以将重要的数据保存在单片机的内部或外部存储器中。
8.安全保护:为了防止电机过载或意外事故,单片机应具备安全保护功能。
例如,当电机实际速度超过设定速度一定时间时,单片机应自动切断电源或发出报警信号。
基于单片机PID算法的直流电机速度控制方法具有精度高、稳定性好、适应性强等优点,广泛应用于各种需要精确控制电机速度的场合。
pid 算法原理及c51应用
PID(Proportional-Integral-Derivative)是一种经典的控制算法,它结合了比例、积分和微分三种控制方式,用于控制系统的稳定性和精度。
PID控制器根据系统的当前状态和期望状态之间的偏差来调整输出,以使系统的响应更快速、更稳定。
PID控制器的工作原理如下:
1. 比例(P)控制,根据偏差的大小来调整输出,偏差越大,输出调节量越大。
这种控制方式能够快速地减小偏差,但可能会导致系统的超调和震荡。
2. 积分(I)控制,根据偏差的累积量来调整输出,用于消除系统的静态误差,提高系统的稳定性和精度。
3. 微分(D)控制,根据偏差的变化率来调整输出,用于抑制系统的振荡和减小超调。
在C51单片机上应用PID算法,首先需要将PID控制器的数学模型转化为C语言代码。
通常,可以使用定时器中断来周期性地计
算PID控制器的输出,并通过数字输出口来控制被控对象。
在C51单片机上实现PID算法需要考虑计算精度、定时器中断的设置、输出口的控制等方面。
在实际应用中,PID控制器可以用于温度控制、速度控制、位置控制等各种控制系统中。
通过调节PID参数,可以使系统快速、稳定地达到期望状态,并且对于不同的被控对象,可以根据实际情况调整PID参数以获得最佳的控制效果。
总之,PID算法结合了比例、积分和微分三种控制方式,通过调节输出来使系统稳定并快速响应。
在C51单片机上应用PID算法需要将其数学模型转化为C语言代码,并考虑各种实际应用中的因素。
51单片机PID算法程序(三)增量式PID控制算法前言在之前的两篇文章中,我们分别介绍了基础PID算法和位置式PID控制算法。
在本文中,我们将介绍另一种常见的PID算法——增量式PID控制算法,以及如何在51单片机上实现增量式PID控制算法。
增量式PID控制算法简介增量式PID控制算法与位置式PID控制算法最大的区别在于输出控制量的计算方式不同。
位置式PID算法的输出控制量是与目标值的误差和历史误差之和的积分和误差的比例和微分,而增量式PID算法的输出控制量只与误差和历史误差的差值有关。
在增量式PID控制算法中,输出控制量的计算方式如下:$$ OutPut=K_p \\cdot Err+K_i \\cdot \\Delta Err+K_d \\cdot \\Delta^2 Err $$ 其中,K p、K i和K d分别是比例、积分和微分系数。
增量式PID控制算法的优点在于可以避免积分饱和、能够快速响应控制量变化,因此在某些要求高响应速度的应用中,常选择使用增量式PID控制算法。
51单片机上的增量式PID控制算法相比较于位置式PID控制算法,增量式PID控制算法的实现更加复杂,需要考虑历史误差的存储、误差的差值计算等问题。
因此,在51单片机上实现增量式PID控制算法需要一些特殊的处理方式。
我们可以通过以下三个步骤来实现增量式PID控制算法:步骤一:初始化变量在增量式PID控制算法中,需要定义一些变量,如上一次的误差值和输出控制量等。
因此,在使用增量式PID控制算法之前,需要先初始化这些变量。
//定义变量double set_point=0; //目标值double process_pv=0; //实际值double Kp=1,Ki=1,Kd=1; //PID参数double last_error=0,prev_error=0; //历史误差double output=0, dInput=0; //输出控制量和误差的差值double output_max=100.0,output_min=-100.0; //控制量范围//初始化变量void PID_Init(){last_error = 0;prev_error = 0;dInput = 0;output = 0;}步骤二:控制量计算根据增量式PID控制算法的公式,我们可以计算控制量的值。
单片机PID算法实现2007-06-07 23:05/*/////////////////////////////////////////////////////////////*//* initial interrupter *//*/////////////////////////////////////////////////////////////*/ void init_interrupter(void) /**/{TMOD=0x21; /* 设置计时器0工作于模式1,设置计时器1工作于模式2*/TL0=0x00; /* T0=0000定时时间为71.1ms;71.1ms*15=1.066s*/TH0=0xdc; /*T0=DC00定时时间为10ms;10ms*100=1s*/ /*T0=FC66定时时间为1ms;10ms*1000=1s*/TL1=0xfd; /* 设置串口通信速率9600bps*/TH1=0xfd;PCON=0x00; /* SMOD=0, 速率不倍增*/SCON=0x50; /* 8位数据通信,串行通信方式1,允许单片机接收数据*/IP=0x10; /*serial com is preferential*/IE=0x92; /* 定时器0, 串口中断允许;定时器1中断禁止*/rs485_receive=0;rs485_transmitte=0;TR0=1; /* 启动定时器0*/TR1=1; /* 启动定时器1*/}void timer0_server(void) interrupt 1 using 1 /**/{TL0=0x00; TH0=0xdc;/*T0=DC00 timing interval is 10ms;10ms*100=1s*/ /*T0=FC66 timing interval is 1ms;10ms*1000=1s*/if (flag_serial==1){timer0_counter_3++;if (timer0_counter_3>11){timer0_counter_3=0;flag_serial=0;pointer_serial_com_data=serial_com_data;counter_serial_com_data=0;}}dog=!dog;/*Timer0 is full(10ms), feed dog*/if (timing_interval==0) {timing_interval=1;} /*timing_interval is lost then set it to 1 second*/timer0_counter_1++;/*timer0_counter_1 is software timer. when timer0 interrupt is full, it increase automatically*/if ((unsigned char) (timer0_counter_1/100)==timing_interval)/*timing_interval arrives*/out_flag=1;/*indexing 占空比 high level begin*//*-scan 0809 to get current equipment's temperature-*/scan_current_Temperature();origina_address=0x82;display1_Temperature(current_Temperature,origina_address);/*-calculate out_value-*/PID_algorithm_function(PID_mode,PP,II,DD,BB,current_Temperature, seted_temperature);//out_value=0.5;if (out_value>0.0) /*out_value=0.0, then 占空比 is zero*/{control_0=1;ledctrl_address=0x8c;leddata_address=0xff;}//reset timer0_counter_1 and timer0_counter_2,timer0_counter_1=0; //indexing timing_interval's timingtimer0_counter_2=0; //indexing 占空比's timing}if(out_flag==1){timer0_counter_2++;if (out_value<1.0){if( (unsigned char) (timer0_counter_2/out_value/100) >= timing_interval){timer0_counter_2=0;control_0=0;ledctrl_address=0x8c;leddata_address=0x00;out_flag=0;}}}}float PID_algorithm_function(uchar PID_mode_2,floatP_2,I_2,D_2,B_2,current_Temperature_2,seted_temperature_2){float idata delta;switch (PID_mode_2)case 1: break;/*PID mode*/case 2: D_2=0; break;/*PI mode*/case 3: I_2=0; break;/*PD mode*/case 4: I_2=0; D_2=0; break;/*P mode*/}if (PID_mode_2<5)/*PID algorithm*/ek=(seted_temperature_2-current_Temperature_2)/99.9;delta=P_2*(ek-ek1)+I_2*ek+D_2*(ek-2.0*ek1+ek2);out_value=out_value+delta;ek2=ek1;ek1=ek;if (out_value>1.0){out_value=1;}else if (out_value<=0){out_value=0.0;}if (PID_mode_2==5) /*BB algorithm*/{if (current_Temperature_2-seted_temperature_2>=B_2){out_value=0.0;}if (seted_temperature_2-current_Temperature_2>=B_2){out_value=1.0;}}return (out_value);}比较典型的PID算法控制程序源代码2007-06-07 22:37/*=================================================================== =================================这是一个比较典型的PID处理程序,在使用单片机作为控制cpu时,请稍作简化,具体的PID参数必须由具体对象通过实验确定。
由于单片机的处理速度和ram资源的限制,一般不采用浮点数运算,而将所有参数全部用整数,运算到最后再除以一个2的N次方数据(相当于移位),作类似定点数运算,可大大提高运算速度,根据控制精度的不同要求,当精度要求很高时,注意保留移位引起的“余数”,做好余数补偿。
这个程序只是一般常用pid算法的基本架构,没有包含输入输出处理部分。
===================================================================== ================================*/#include#include/*=================================================================== =================================PID FunctionThe PID (比例、积分、微分) function is used in mainlycontrol applications. PIDCalc performs one iteration of the PID algorithm.While the PID function works, main is just a dummy program showing a typical usage.===================================================================== ================================*/typedef struct PID {double SetPoint; // 设定目标Desired valuedouble Proportion; // 比例常数Proportional Constdouble Integral; // 积分常数Integral Constdouble Derivative; // 微分常数Derivative Constdouble LastError; // Error[-1]double PrevError; // Error[-2]double SumError; // Sums of Errors} PID;/*=================================================================== =================================PID计算部分===================================================================== ================================*/double PIDCalc( PID *pp, double NextPoint ){double 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 // 微分项);}/*=================================================================== =================================Initialize PID Structure===================================================================== ================================*/void PIDInit (PID *pp){memset ( pp,0,sizeof(PID));}/*=================================================================== =================================Main Program===================================================================== ================================*double sensor (void) // Dummy Sensor Function{return 100.0;}void actuator(double rDelta) // Dummy Actuator Function{}void main(void){PID sPID; // PID Control Structuredouble rOut; // PID Response (Output)double rIn; // PID Feedback (Input)PIDInit ( &sPID ); // Initialize StructuresPID.Proportion = 0.5; // Set PID CoefficientssPID.Integral = 0.5;sPID.Derivative = 0.0;sPID.SetPoint = 100.0; // Set PID Setpointfor (;;) { // Mock Up of PID ProcessingrIn = sensor (); // Read InputrOut = PIDCalc ( &sPID,rIn ); // Perform PID Interationactuator ( rOut ); // Effect Needed Changes}。