void PID(void)
{
//调差量 VW88 , 电压反馈量VW50,pid运算反馈量:VW10,pid给定:VW700
int VW700,VW50; //0-32768~+32768
int VW500,VW502,VW504,VW506;
long VW530,VW538;
int VW526,VW522,VW524;
uchar Kp=7; //P 取值0-20 书:20 PLC试验得3\1\7
uchar Ki=4; //I 取值0-20 书:01
uchar Kd=4 ; //D 取值0-10 书:18
VW700=GeiDin; //给定 最大1100
VW50=ADs[0]; //反馈 最大1024
VW500=(VW50-VW700)/2; //算出:ek ,缩小1倍 最大1024
VW506=VW504; //==算出:ek_2 移位保存 最大1024
VW504=VW502; //算出:ek_1 最大1024
VW502=VW500; //ek过渡 K1 最大1024
//算出KP
VW522=Kp*(VW500-VW504); // KP项=Kp*(ek-ek_1) <20*1024=20480<32768
//算出Ki
VW524=Ki*VW502; // Ki项=Ki*ek <20*1024=20480<32768
//算出Kd
VW526=Kd*(VW502-2*VW504+VW506); // K项=Kd*(ek-2ek_1+ek_2) <10*2*1024=20480<32768
//限幅VW526
if(VW526<(-100)) //限幅
VW526=(-100);
if(VW526>100) //限幅
VW526=100; //
//算出Kp+Ki+Kd
VW530=VW522+VW524+VW526; //KP+KI+KD =K10
//放大差值
//累计误差
VW538=VW538+VW530; // 累计 =0+10=K10 2\=K20
//限幅
if(VW538>36850) //7370=134 度
VW538=36850; //否则为限幅值输出
if(VW538<50) ////控制量输出为负数,则输出0
VW538=50;
//输出
A_num1=(uint)(VW538/5);
A=A_num1/55;
}
关键字:PID程序 C51 增量式PID
引用地址:
自己整的PID程序(C51,增量式PID)
推荐阅读最新更新时间:2024-03-16 15:20
【C51自学笔记】概述与准备
使用atmel公司:AT89S52 使用烧录工具:progisp 使用编写工具:Keil uVision 使用开发板:天狼星TLX-1C开发板 后续出现的代码已打包:https://download.csdn.net/download/f_zmmfs/10560847(侵删) 结构: 内部集成8位CPU,4K字节的ROM,128字节RAM,4个8位并行I/O口,一个全双工串行口,2个16位定时器/计数器,5个中断源。 CPU:由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器 RAM:用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;(非记忆性)
[单片机]
lcd液晶12232F的串口C51程序(ST7920)
由于12232F这个显示器用得比较平常,但平常见到的是一些并口的汇编程序,并且也没有对应于12232F的并口程序,串口的C51程序极少见,为了方便大家使用,所以本站把它调试了一个出来,大家多多指教! /******************************************************/ /* */ /* 12232F串口驱动程序C51,11.0592M晶振 */ /*使用这款LCD应该要注意的问题: */ /*一定要在VO与VDD及VSS这三个脚间接一个20K的电位器, */ /*电位器的中间脚接VO,其它二脚接VDD和VSS。 */ /*然后调节电位器的大小,直到有显示为止。若是不接的话,
[单片机]
C51单片机设计模拟I2C总线驱动程序
/********************************** I2C总线驱动 ************************************* 模块名:I2C总线驱动 型号:I2C 功能描述: 此模块包括发送数据及接收数据,应答位发送,并提供了几个直接面对器件的操作函数,能很 方便的与用户程序进行连接并扩展。 需要注意的是,函数是采用延时方法产生 SCL 脉冲,对高晶振频率要做一定的修改!! 在写E2PROM的时候一定要延时!!! 说明: 1us机器周期,晶振频率要小于12MHz 返回 1 则操作成功,返回 0 则操作失败。 sla 为器件从地址,suba 为器件子地址。 **
[单片机]
c51单片机中断函数
以串口中断为例: 如: void serial() interrupt 4 { } 和 void serial_uart() interrupt 4 { } 两个函数的功能都是定义串口中断函数。函数名字不一样不重要,重要的是函数名字后面的interrupt 4(中断向量表地址)要正确。
[单片机]
C51编程几个有用的模块-键盘扫描模块
键盘扫描模块有两种工作方式, 一种为自动的由时钟模块调用, 另一种是由程序员自行调用。 1) 由时钟模块自动调用的方式 将时钟模块实现文件(Timer.h)及键盘扫描模块的实现文件(KBScan。c)包含进工程, 在Config.h 文件中添加TIMER_KBSCANDELAY宏。 时钟模块自动对时钟中断进行计数, 当达到TIMER_KBSCANDELAY宏所定义的值后, 自动调用键盘扫描模块中的函数KBScanProcess()进行键盘扫描,也就是说,这个宏的值可以决定按键消抖动的时间。 用户应该提供两个回调函数OnKBScan()及onKeysPressed()。 在函数OnKBScan中进行键盘扫描, 并返回扫描
[单片机]
C51单片机延时时间的计算方法解析
C程序中可使用不同类型的变量来进行延时设计。经实验测试,使用unsignedchar类型具有比unsignedint更优化的代码,在使用时应该使用unsignedchar作为延时变量。以某晶振为12MHz的单片机为例,晶振为12MHz即一个机器周期为1us。 一.500ms延时子程序 程序: voiddelay500ms(void) { unsignedchari,j,k; for(i=15;i》0;i--) for(j=202;j》0;j--) for(k=81;k》0;k--); } 计算分析: 程序共有三层循环 一层循环n:R5*2=81*2=162usDJNZ2us 二层循环m:R6*(n+3)=202*165=333
[单片机]
C51的memset
刚才看51程序,发现了一个函数memset(),以前很少见到过,写在这里记下来。 这是F1帮助查到的memset的相关解释截图 这个函数是包含在 string.h 头文件里面的,功能就是将指定长度的一个字符复制到一个数组里面,返回的则是指向数组的指针。一般用来做某段内存的初始化工作。
[单片机]
C51固定ROM地址初始化数据方法
查了很多资料,要用KEIL C51在ROM(FLASH)中固定的位置写入一个初始化数据,网上有很多办法,感觉都不是很好,我最近因为要用,所以想了一个办法来实现,大家都知道在C51成立工程时都有一个扩展名为A51的源文件,这个文件其实就是程序的初始化文件,也就是在程序的开始对堆栈等东西做一个初始化;好了话不多说;下面介绍如何使用。 1、一般的工程可以不用此文件,把此文件删除就可以;但是我们要对ROM的固定地址填入数据,所以这个文件要加在工程内。 2、打开这个文件会有很长的篇幅,这些其实都是没有用的,删除就可以,只留下最后三行就可以,因为有这个文件后,编译器要知道如何转移到你的main()。看第5条。 3、在上面一个位置就可以写入如下
[单片机]