PID公式的推导过程及实现代码

发布者:SparklingSoul最新更新时间:2015-05-06 来源: 51hei关键字:PID公式  推导过程  实现代码 手机看文章 扫描二维码
随时随地手机看文章
一、PID框图: 







n0(t)是要稳定的值
n(t)是当前输出值
e(t) = n0(t) - n(t)


一、模拟PID控制原理
 
这个公式网络上很好找:

 

 

 

 二、数字PID控制
由于模拟的微积分运算对应计算机来说是不太好写代码的,所以要利用采样将数据离散化

于是公式就可以转换为:


 


 其中T为采样时间,由于T之类的参数是常量,所以将Kp乘入公式中可以转换成另一种写法
这个公式叫位置式算法

由于要不断的累加ej,增加了计算量,所以这个公式又可以转换为增量式算法:




然后u(k) = u(k-1) + u

三、参数的整定
先将Ti设置为无穷大,Td设置为0,调节Kp
然后再调节Ti,最后是Td

四、实现代码

typedef struct PID
{
    int  SetPoint;     //设定目标 Desired Value
    long SumError;                //误差累计
    double  Proportion;         //比例常数 Proportional Cons
    double  Integral;           //积分常数 Integral Const
    double  Derivative;         //微分常数 Derivative Const
    int LastError;               //Error[-1]
    int PrevError;               //Error[-2]
} PID;

/*******************************************************************************
* 函数名称 : IncPIDCalc
* 函数描述 : 增量式 PID 控制计算
* 函数输入 : int 当前位置
* 函数输出 : 无
* 函数返回 : 增量式PID结果
*******************************************************************************/
int IncPIDCalc(int NextPoint)
{
    int iError, iIncpid;
    //当前误差
    iError = sptr->SetPoint - NextPoint;
    //增量计算
    iIncpid = sptr->Proportion * iError               //E[k]项
              - sptr->Integral   * sptr->LastError     //E[k-1]项
              + sptr->Derivative * sptr->PrevError;   //E[k-2]项
    //存储误差,用于下次计算
    sptr->PrevError = sptr->LastError;
    sptr->LastError = iError;
    //返回增量值
    return(iIncpid);
}
/*******************************************************************************
* 函数名称 : LocPIDCalc
* 函数描述 : 位置式 PID 控制计算
* 函数输入 : int 当前位置
* 函数输出 : 无
* 函数返回 : 位置式PID结果
*******************************************************************************/
int LocPIDCalc(int NextPoint)
{
    int  iError,dError;
    iError = sptr->SetPoint - NextPoint;       //偏差
    sptr->SumError += iError;       //积分
    dError = iError - sptr->LastError;     //微分
    sptr->LastError = iError;
    return(sptr->Proportion * iError            //比例项
           + sptr->Integral * sptr->SumError   //积分项
           + sptr->Derivative * dError);        //微分项
}
关键字:PID公式  推导过程  实现代码 引用地址:PID公式的推导过程及实现代码

上一篇:嵌入式offsetof的使用
下一篇:学习ucosii操作系统的一点心得

推荐阅读最新更新时间:2024-03-16 14:00

利用多内核处理器的并行编程能实现视频代码转换
视频代码转换是指从一种压缩视频格式转换为另一种压缩视频格式,通常先要把某种格式解码为原始视频帧,然后用新的格式重新编码。在许多应用中高效的代码转换至关重要。例如,为了支持视频点播数据流,视频数据要以某种主流格式存储起来以节省空间,但必须支持众多不同的观看设备和解码器。为了做到这一点,需要在数据发送前以实时或者快于实时的速度进行代码转换。在视频节目制作阶段进行视频编辑时,也必须对视频数据进行解码、修改和重新编码。在普通家庭,为了能在家用视频服务器上使用视频,视频数据可能也需要转换才能适应服务器支持的格式。 支持高清视频点播要求高性能的代码转换。RapidMind公司开发的软件开发平台利用统一的并行编程模型充分发挥
[电源管理]
利用多内核处理器的并行编程能<font color='red'>实现</font>视频<font color='red'>代码</font>转换
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved