C语言实现51单片机中的PID算法

发布者:甜美瞬间最新更新时间:2016-05-17 来源: eefocus关键字:C语言  51单片机  PID算法 手机看文章 扫描二维码
随时随地手机看文章
//pid.h
#ifndef __PID__
#define __PID__
/*PID = Uk + KP*[E(k)-E(k-1)]+KI*E(k)+KD*[E(k)-2E(k-1)+E(k-2)];(增量型PID算式)
函数入口: RK(设定值),CK(实际值),KP,KI,KD
函数出口: U(K)*/
typedef struct PIDValue
{
	int8 KP;
	int8 KI;
	int8 KD;
	int8 F;
	int8 BITMOV;
	int EK[3];
	
	int UK;
	int RK;
	int CK;
	int UK_REAL;

}pid_str;
//PIDValueStr  PID;
void    pid_exe(pid_str *PID)  ;
#endif

//pid.c
/*PID = PID->UK_REAL + PID->KP*[E(k)-E(k-1)]+PID->KI*E(k)+PID->KD*[E(k)-2E(k-1)+E(k-2)];(增量型PID算式)
函数入口: PID->RK(设定值),PID->CK(实际值),PID->KP,PID->KI,PID->KD
函数出口: U(K)*/
#include"defines.h"
#include"pid.h"
#define MAXOUT 0xff
//#define MAXGAP 100

void pid_exe(pid_str*PID)
{
	PID->EK[2]=PID->EK[1];
	PID->EK[1]=PID->EK[0];
	PID->EK[0]=PID->RK-PID->CK;
	PID->UK_REAL=PID->UK_REAL
		+PID->KP*(PID->EK[0]-PID->EK[1])//微分一次后积分即原数
		+(float)PID->KI*PID->EK[0]/PID->F//直接积分
		+(float)PID->KD*(PID->EK[0]-2*PID->EK[1]+PID->EK[2])*PID->F;//二阶微分后积分即一阶微分
	if((PID->UK_REAL>>PID->BITMOV)>=MAXOUT)
	{
		PID->UK=MAXOUT;
	}else if(PID->UK_REAL>>PID->BITMOV<=-MAXOUT)
	{
		PID->UK=-MAXOUT;
	}else
	{
		PID->UK=PID->UK_REAL>>PID->BITMOV;
	}
		
}

这里我写的代码用到的是增量型的PID(即UK_REAL + PID->KP*[E(k)-E(k-1)]+PID->KI*E(k)+PID->KD*[E(k)-2E(k-1)+E(k-2)];这句话所对应的是pid控制量在之前pid控制量的基础上增加的值,相当于求了一次导)。最终输出的结果将每一次运算的值累加输出就行了。

附上摘抄的位置型pid与增量型pid的区别来。。

(1)位置式PID控制的输出与整个过去的状态有关,用到了误差的累加值;而增量式PID的输出只与当前拍和前两拍的误差有关,因此位置式PID控制的累积误差相对更大;

(2)增量式PID控制输出的是控制量增量,并无积分作用,因此该方法适用于执行机构带积分部件的对象,如步进电机等,而位置式PID适用于执行机构不带积分部件的对象,如电液伺服阀。

(3)由于增量式PID输出的是控制量增量,如果计算机出现故障,误动作影响较小,而执行机构本身有记忆功能,可仍保持原位,不会严重影响系统的工作,而位置式的输出直接对应对象的输出,因此对系统影响较大。

关键字:C语言  51单片机  PID算法 引用地址:C语言实现51单片机中的PID算法

上一篇:51单片机中的串口中断模式
下一篇:51 单片机UART 串口通信 方式1 实现

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

单片机C语言C51程序中的基本结构
一.顺序结构 顺序结构是最基本、最简单的结构,在这种结构中,程序由低地址到高地址依次执行,如图给出顺序结构流程图,程序先执行A操作,然后再执行B操作。 二.选择结构 选择结构可使程序根据不同的情况,选择执行不同的分支,在选择结构中,程序先都对一个条件进行判断。当条件成立,即条件语句为“真”时,执行一个分支,当条件不成立时,即条件语句为“假”时,执行另一个分支。如图:当条件S成立时,执行分支A,当条件P不成立时,执行分支B。 在C51中,实现选择结构的语句为if/else,if/else if语句。另外在C51中还支持多分支结构,多分支结构既可以通过if和else if语句嵌套实现,可用swith/case语句实现。
[单片机]
单片机<font color='red'>C语言</font>C51程序中的基本结构
交换指令(5条)举例——mcs51单片机汇编语言
交换 指令 (5条) 这5条指令的功能是把累加器A中的内容与源操作数所指的数据相互交换。 XCH A,Rn ;(A)←→(Rn)累加器与工作寄存器Rn中的内容互换 XCH A,@Ri ;(A)←→((Ri))累加器与工作寄存器Ri所指的存储单元中的内容互换 XCH A,data ;(A)←→(data)累加器与直接地址单元中的内容互换 XCHD A,@Ri ;(A3-0)←→((Ri)3-0)累加器与工作寄存器Ri所指的存储单元中的内容低半字节互换 SWAP A ;(A3-0)←→(A7-4)累加器中的内容高低半字节互换
[单片机]
51单片机的头文件究竟该如何写?
众里寻他千百度,默然回首还是看不懂你的代码! 我相信,对于初学单片机编程或其他语言编程的朋友来说,刚开始我们编程时总喜欢把所有的代码都写在一个文件中。 (当然如果你是绝世天才那就另当别论了,哈哈)。其实我也如此,刚开始我就想,将所有的代码都写在一个文件中那该多 方便,打开一个文件都可以看清。当然,起初我们很容易看明白,因为你我都知道,咱写的代码只有那寥寥几行,倒着背都 能背下来。但当后来我们写的代码越来越多时,我们往往苦于阅读自己的代码。 因此,我们可以将一个程序写在多个文件中(即以.c为后缀的文件中)。这时聪明的你就会问了,那么我写了了这么多文件,最后只通过一个按钮编译,生成HEX这个家伙,那么各文件又是怎样
[单片机]
51单片机设计的电子密码锁
该程序是基于51单片机设计的电子密码锁,功能较为简单,目前仅有修改密码和检测这一功能,以下是操作过程 运行仿真的初始界面 左边矩阵按键从左边第一行第一列起为0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f 按下按键后界面如下,当四位数码管都显示后,按下矩阵键盘上任意按键确认密码 密码错误D1红灯亮起,密码正确D2绿灯亮起 当按下独立按键时,中断触发,进入密码修改,此时界面如同初始界面,输入原始密码,原始密码正确,绿灯亮起,等待输入新密码,此时界面显示原始密码。原始密码错误红灯亮起,退出修改,返回初始状态。 新密码输入会将原始密码覆盖,输入完成红绿灯同时亮起。 1s后返回初始界面,
[单片机]
<font color='red'>51单片机</font>设计的电子密码锁
51单片机串口通讯设计
通信协议: 第1字节,MSB为1,为第1字节标志,第2字节,MSB为0,为非第一字节标志,其余类推……,最后一个字节为前几个字节后7位的异或校验和。 测试方法:可以将串口调试助手的发送框写上 95 10 20 25,并选上16进制发送,接收框选上16进制显示,如果每发送一次就接收到95 10 20 25,说明测试成功。 //这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收 //和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的 #include reg51.h #include string.h #define INBUF_LEN 4 //数据长度 unsign
[单片机]
51单片机实现生日快乐歌
电路 代码 #include reg51.h #define u8 unsigned char #define u16 unsigned int sbit BEEP=P2^3; void delay_ms(u16 x)//毫秒延时函数 {u16 i,j; for(i=0;i x;i++) for(j=0;j 115;j++); } //生日快乐歌的音符频率表,不同频率由不同的延时来决定 u8 code SONG_TONE ={212,212,190,212,159,169,212,212,190,212,142,159,212,212,106,126,159,169,190,119,119,126,159,1
[单片机]
<font color='red'>51单片机</font>实现生日快乐歌
51单片机开发板程序----LED流水点亮(C语言
//实例6:使用P0口流水点亮8位LED #include reg51.h //包含单片机寄存器的头文件 /**************************************** 函数功能:延时一段时间 *****************************************/ void delay(void) { unsigned char i,j; for(i=0;i 250;i++) for(j=0;j 250;j++) ; } /******************************************************* 函数功能:主函数 *****
[单片机]
基于8051单片机的频率测量技术
0 引言 随着无线电技术的发展与普及,"频率"已经成为广大群众所熟悉的物理量。而单片机的出现,更是对包括测频在内的各种测量技术带来了许多重大的飞跃,然而,小体积、价廉、功能强等优势也在电子领域占有非常重要的地位。为此.本文给出了一种以单片机为核心的频率测量系统的设计方法。 1 测频系统的硬件结构 测量频率的方法一般分为无源测频法、有源测频法及电子计数法三种。无源测频法(又可分为谐振法和电桥法),常用于频率粗测,精度在1%左右。有源比较法可分为拍频法和差频法,前者是利用两个信号线性叠加以产生拍频现象,再通过检测零拍现象进行测频,常用于低频测量,误差在零点几Hz;后者则利用两个非线性信号叠加来产生差频现象,然后通过检测零差现象进
[测试测量]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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