单片机PID算法实现

发布者:码字狂徒最新更新时间:2015-05-26 来源: 51hei关键字:单片机  PID算法 手机看文章 扫描二维码
随时随地手机看文章
在avr单片机上实现的100%通过测试,用单片机调的倒立摆非常稳定.
#include
#include

 
struct _pid
{
int pv; //integer that contains the process value 过程量
int sp; //*integer that contains the set point   设定值
float integral; // 积分值
float pgain;
float igain;
float dgain;
int deadband;    //死区
int last_error;
};

 
struct _pid warm,*pid;
int process_point, set_point,dead_band;
float p_gain, i_gain, d_gain, integral_val,new_integ;;

 
void pid_init(struct _pid *warm, int process_point, int set_point)
{
struct _pid *pid;
pid = warm;
pid->pv = process_point;
pid->sp = set_point;
}

 

 
void pid_tune(struct _pid *pid, float p_gain, float i_gain, float d_gain, int dead_band)
{
pid->pgain = p_gain;
pid->igain = i_gain;
pid->dgain = d_gain;
pid->deadband = dead_band;
pid->integral= integral_val;
pid->last_error=0;
}

 

 

 
void pid_setinteg(struct _pid *pid,float new_integ)
{
pid->integral = new_integ;
pid->last_error = 0;
}

 

 
void pid_bumpless(struct _pid *pid)
{
pid->last_error = (pid->sp)-(pid->pv);  //设定值与反馈值偏差
}

 

 

 

 
float pid_calc(struct _pid *pid)
int err;
float pterm, dterm, result, ferror;

 
// 计算偏差
err = (pid->sp) - (pid->pv);

 
// 判断是否大于死区
if (abs(err) > pid->deadband)
{
ferror = (float) err;   //do integer to float conversion only once 数据类型转换
[page]
 
// 比例项
pterm = pid->pgain * ferror;

 
if (pterm > 100 || pterm < -100)
{
pid->integral = 0.0;
}
else
{
// 积分项
pid->integral += pid->igain * ferror;

 

 
if (pid->integral > 100.0)
{
pid->integral = 100.0;
}

 
else if (pid->integral < 0.0)
pid->integral = 0.0;

 
}

 
// 微分项
dterm = ((float)(err - pid->last_error)) * pid->dgain;

 
result = pterm + pid->integral + dterm;
}
else
result = pid->integral; // 在死区范围内,保持现有输出

 
// 保存上次偏差
pid->last_error = err;

 
return (result);
}
 
//----------------------------------------------
参数说明:
p_gain = (float)(5.2);//比例系数
i_gain = (float)(0.77);//积分系数
d_gain = (float)(0.18);//微分系数
process_point为设定的稳定值
display_value为系统输出值
process_point为传感器传入当前值


 
函数调用示例:
float display_value;
int count=0;
pid = &warm;

 
process_point = 30;
set_point = 40;

 
dead_band = 2;

 
integral_val =(float)(0.01);
scanf("%d",&process_point);
// 设定PV,SP值
pid_init(&warm, process_point, set_point);

 
// 初始化PID参数值
pid_tune(&warm, p_gain,i_gain,d_gain,dead_band);

 
// 初始化PID输出值
pid_setinteg(&warm,0.0);
//pid_setinteg(&warm,30.0);

 
pid_bumpless(&warm);

 
display_value = pid_calc(&warm);

 
printf("%f ", display_value);
关键字:单片机  PID算法 引用地址:单片机PID算法实现

上一篇:atmega16串口通信
下一篇:Atmega16单片机实用程序

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

单片机+1602液晶显示设计
忙了一天做了一个1602 显示的仿真电路和程序 经过调试正常运行!!Success的感觉真好 哈哈......... 现在就把成果分享给大家 本电路程序如下: #include reg51.h #include stdio.h #define uint unsigned int #define uchar unsigned char uchar code tab ="Hello Jary!"; uchar code tab1 ="I Love You!"; uchar num,len,len1; sbit RS=P2^5; sbit RW=P2^6; sbit EN=P2^7; void delay(uint x) {
[单片机]
<font color='red'>单片机</font>+1602液晶显示设计
车规MCU功能安全如何落地?杰发科技打造安全可靠产品矩阵
在2023年2月21日,由盖世汽车主办的2023第二届汽车芯片产业大会上,杰发科技高级产品经理涂超平阐释了功能安全的定义,即“不存在由电子电气系统的功能异常表现引起的危害而导致不合理的风险”。他表示,功能安全虽已是耳熟能详的概念,但具体应该如何落地,无论是对于芯片公司还是整车厂和Tier1而言都是很有挑战性的话题。 而车规级芯片的质量管控是杰发科技的关注重点。从2013年成立发展至今,杰发科技已有四条产品线走向量产:座舱IVI SOC、AMP功率芯片、MCU车身控制芯片、TPMS 胎压监测芯片。截至去年,杰发科技的首款功能安全MCU AC7840x已陆续送样,其中部分客户已进入产品验证阶段。这款基于ARM Cortex-M4F
[汽车电子]
车规<font color='red'>MCU</font>功能安全如何落地?杰发科技打造安全可靠产品矩阵
STM32F0单片机快速入门九 用 I2C HAL 库读写24C02
1.24C02介绍 24C02 现在基本是开发板的标配,对于需要掉电存储的应用来说确是不二选择。现在单片机因为内部集成了Flash存储器,一般也都支持数据的掉电保存,但相对于 24C02 这种 EEPROM 来说,使用单片机内部的 Flash 有一些需要注意的问题: Flash 写入数据之前需要先执行擦除操作,而且擦除以扇区为单位。 Flash读写次数比 EEPROM 少很多。 容易误操作,把 Flash 内部的代码擦除掉。 影响中断的响应时间。 24C02 有 256 字节的数据,一般说来也够用了。它的地址是可以通过引脚配置的,这样一条 I2C 总线上就可以挂多个 24C02。如下: 我们把 A2,A1
[单片机]
基于CPLD与单片机的双向通信控制器设计
  在传统的控制系统中,人们常常采用单片机作为控制核心。但这种方法硬件连线复杂,可靠性差,且单片机的端口数目、内部定时器和中断源的个数都有限,在实际应用中往往需要外加扩展芯片。这无疑对系统的设计带来诸多不便。   现在有很多系统采用可编程逻辑器件CPLD作为控制核心。它与传统设计相比较,不仅简化了接口和控制,提高了系统的整体性能及工作可靠性,也为系统集成创造了条件。但可编程逻辑器件的D触发器资源非常有限,而且可编程逻辑器件在控制时序方面不如单片机那样方便,很多不熟悉的应用者往往感到应用起来非常的困难。利用可编程逻辑器件和单片机构成的双向通信控制器克服了两者的缺点,且把二者的长处最大限度地发挥出来。   1 CPLD与单片机AT
[单片机]
基于CPLD与<font color='red'>单片机</font>的双向通信控制器设计
单片机控制的双路有源滤波器设计
    摘要: 用单片机对可编程滤波器芯片MAX262进行程序控制,可以同时对两路输入信号进行二阶低通、高通、带通、带阻以及全通滤波处理,滤波器的中心频率在15kHz~50kHz频率范围内实现64级程控调节,其Q值在0.5~64范围实现128级程控调节。     关键词: MAX262 单片机 滤波器 在工业自动化的许多领域都要使用滤波器。一般有源滤波器均由运算放大器和RC元件组成,对元器件的参数精度要求比较高,设计和调试都比较麻烦。美信公司(MAXIM)生产垢可编程滤波器芯片MAX262可以通过编程对各种低频信号实现低通、高通、带通、带阻以及全通滤波处理,而且滤波的特性参数如中心频率、品质因数等也可以通过编
[应用]
AT89S52单片机与CF卡的接口电路设计
1 前言 随着计算机应用技术的飞速发展,移动存储设备得到了广泛的应用。其中CF(Compact Flash)卡以其价格低廉、体积小、存储容量大、高速等优点在众多移动存储设备中被广泛地应用于数码相机、PDA和笔记本电脑等当前十分热门的消费类电子产品中。并且CF卡在其他领域中也得到了广泛的应用。本文所述内容就是通过8051单片机对CF卡进行读写。 2.CF卡的操作方式 CF卡的操作方式与计算机的硬盘操作方式类似,其扇区的寻址也有两种方式:物理寻址(CHS)和逻辑寻址(LBA),物理寻址使用柱面、磁头和扇区号表示一个特定的扇区,起始扇区是0道、0头、1区,接下来是2区等等,逻辑寻址将整个CF卡统一寻址。逻辑块寻址和物理寻址的关系为:L
[单片机]
AT89S52<font color='red'>单片机</font>与CF卡的接口电路设计
TI宣布其Hercules MCU已经过TÜV SÜD的认证
经TÜV SÜD认证,此类MCU可支持汽车、工业及通用功能安全相关应用的严格功能安全标准。 全新LaunchPad开发套件可简化业经认证的MCU的开发工作。 2014年12月15日,北京讯---汽车和工业系统正变得日趋复杂,这无疑增加了原始设备制造商(OEM)确保自己系统功能安全的负担。为帮助客户应对这一挑战,日前,德州仪器(TI)宣布其Hercules™ TMS570LS12x/11x与RM46x微控制器(MCU)已经过TÜV SÜD的认证,符合ISO 26262(2011版)与IEC 61508(2010版)对ASIL D和SIL 3安全完整性等级的功能安全标准的相关要求。这有助于OEM花费较少的时间和精力即可使自
[单片机]
详解STM32单片机堆栈
学习STM32单片机的时候,总是能遇到“堆栈”这个概念。分享本文,希望对你理解堆栈有帮助。 对于了解一点汇编编程的人,就可以知道,堆栈是内存中一段连续的存储区域,用来保存一些临时数据。堆栈操作由PUSH、POP两条指令来完成。而程序内存可以分为几个区: 栈区(stack) 堆区(Heap) 全局区(static) 文字常亮区程序代码区 程序编译之后,全局变量,静态变量已经分配好内存空间,在函数运行时,程序需要为局部变量分配栈空间,当中断来时,也需要将函数指针入栈,保护现场,以便于中断处理完之后再回到之前执行的函数。 栈是从高到低分配,堆是从低到高分配。 普通单片机与STM32单片机中堆栈的区别 普通单片机启动时,不需要用b
[单片机]
详解STM32<font color='red'>单片机</font>堆栈
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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