位置型PID的C语言实现

首先,再次给出位置型PID离散化公式:

根据位置型PID离散化公式编写C语言代码程序:

第一步,定义PID变量结构体代码如下:

struct _pid{

float SetSpeed; //定义设定值

float ActualSpeed;//定义实际值

float err; //定义偏差值

float err_last; //定义上一个偏差值

float err_past; //定义前一个偏差值

float Kp,Ki,Kd; //定义比例、积分、微分系数

float voltage; //定义电压值(控制执行器变量)

float integral; //定义积分值

int index; // 积分分离时的变量

float umax; //积分极限

float umin;

}pid;

第二步,初始化变量:

void PID_init() //pid变量初始化

{

printf("PID_init begin \n");

pid.SetSpeed = 0.0;

pid.ActualSpeed = 0.0;

pid.err = 0.0;

pid.err_last = 0.0;

pid.err_past = 0.0;

pid.voltage = 0.0;

pid.integral = 0.0;

pid.Kp = 0.4;

pid.Ki = 0.2;

pid.Kd = 0.2;

pid.umax = 400;

pid.umin = -200;

printf("PID_init end \n");

}

统一初始化变量,尤其是 Kp,Ki,Kd 三个参数,调试过程当中,对于要求的控制效果,可以通过调节这三个量直接进行调节。

第三步,编写控制算法:

/**********************************************************************************/

//PID算法 驱动代码

//对比例、微分、积分进行离散化处理之后

/*********************************************************************************/

//位置型PID算法

//PID算法最基本形式,未考虑死区问题,未定义上下限,对公式的直接实现

float PID_realize1(float speed)

{

pid.SetSpeed = speed;

pid.err = pid.SetSpeed - pid.ActualSpeed;

pid.integral += pid.err; //积分

pid.voltage = pid.Kp * pid.err + pid.Ki * pid.integral

+ pid.Kd * (pid.err - pid.err_last); //电压

pid.err_last = pid.err;

pid.ActualSpeed = pid.voltage * 1.0;

return pid.ActualSpeed;

}

注意:这里用了最基本的算法实现形式,没有考虑死区问题,没有设定上下限,只是对公式的一种直接的实现。

第四步,编写测试代码:

int main(void)

{

uart_init(115200);//串口初始化波特率为115200

delay_init(168);//初始化延时函数

LED_Init(); //初始化LED端口

PID_init();

int count = 0;

while(count<1000)

{

GPIO_ResetBits(GPIOC,GPIO_Pin_13);

delay_ms(50); //延时300ms

GPIO_SetBits(GPIOC,GPIO_Pin_13);

delay_ms(50); //延时300ms

float speed = PID_realize1(200.0);

printf("%f\n",speed);

count++;

}

return 0 ;

}

测试说明:测试代码中,初始化串口,奖PID的数据通过串口发送给电脑上位机,同时每传送一次数据,LED等闪烁一次,用以提                 示程序运行状况。

第四步,测试结果说明:

经过1000次调节后输出单片机1000个数据,其中一部分如下所示:

83.000001 11.555000 59.559675 28.175408 52.907421 38.944152 51.891699 46.141651

53.339054 51.509998 55.908450 55.944631 58.970680

199.999094 199.999115 199.999123 199.999135 199.999152 199.999161 199.999172

199.999183 199.999201 199.999203 199.999224 199.999232 199.999243 199.999261

199.999263 199.999284 199.999292 199.999304 199.999321 199.999323 199.999344

199.999352 199.999364 199.999381 199.999390 199.999401 199.999412 199.999430

199.999432 199.999453 199.999461 199.999473

由输出数据可知,PID的输出在一定时间内,会逐步稳定到期望值。

以上是我对位置型PID算法的简单代码表示,希望大家多多提出宝贵意见,我一定会及时改正。

pid控制算法c语言,PID控制算法的C语言实现(三)相关推荐

  1. 四轴PID控制算法详解(单环PID、串级PID)

    正文开始:这篇文章分为三个部分: PID原理普及 常用四轴的两种PID算法讲解(单环PID.串级PID) 如何做到垂直起飞.四轴飞行时为何会飘.如何做到脱控? PID原理普及 1.  对自动控制系统的 ...

  2. C语言实现PID算法:位置式PID和增量式PID

    原创者微信公众号 PID算法可以说是在自动控制原理中比较经典的一套算法,在现实生活中应用的比较广泛. 大学参加过电子竞赛的朋友都应该玩过电机(或者说循迹小车),我们要控制电机按照设定的速度运转,PID ...

  3. c语言pID程序怎么设计,51单片机PID的算法实现程序C语言

    #include typedef unsigned char uint8; typedef unsigned int uint16; typedef unsigned long int uint32; ...

  4. java如何根据pid转tid_C语言编程中pid, tid以及真实pid的关系(转)

    add by zhj: 下面是我对pid,tgid,ppid的个人理解 对于ubuntu14.04操作系统,可以在/usr/src/linux-headers-4.4.0-31/include/lin ...

  5. C语言实现位置式pid与增量式pid

    //经典PID控制的c实现 //1.位置式PID实现 //1.位置式PID实现 typedef struct {float setValue;//设定值float actValue;//输出值floa ...

  6. 位置式PID与增量式PID区别浅析

    1PID控制算法 什么是PID PID 控制器以各种形式使用超过了 1 世纪,广泛应用在机械设备.气动设备 和电子设备.在工业应用中PID及其衍生算法是应用最广泛的算法之一,是当之无愧的万能算法 PI ...

  7. 位置式PID与增量式PID区别浅析(百度百科增量式PID讲解思路概念更明确清晰)

    位置式PID与增量式PID区别浅析 Z小旋 2019-04-26 08:55:12  59882  收藏 713 分类专栏: NXP智能车学习 文章标签: 位置式PID PID 增量式PID 版权 1 ...

  8. 搭建机器人电控系统——PID算法——什么是PID?

    PID算法 PID算法介绍,不同系数仿真,优缺点 位置式.增量式.模糊式PID 大林算法.史密斯算法和PID算法的区别 文章目录 PID算法 控制系统介绍 开环控制系统 前馈控制系统 单闭环控制系统 ...

  9. 入门智能车 | 带你认识PID闭环控制 - 增量式PID实现电机速度闭环

    带你认识PID闭环控制 - 增量式PID实现电机速度闭环 闭环控制是指控制论的一个基本概念.指作为被控的输出量以一定方式返回到作为控制的输入端,并对输入端施加控制影响的一种控制关系.带有反馈信息的系统 ...

  10. PID控制的深入探讨(位置式PID、增量式PID、PID的积分饱和)

    本文主要探讨PID算法在使用时的一些实际问题.处理技巧和方法,学习本节内容需要先对PID控制算法有基本的了解. 1)PID控制的基本原理 PID是一个二阶线性控制器,它具有不需要建立数学模型,控制效果 ...

最新文章

  1. 《中国人工智能学会通讯》——8.2 自然界中的鸽群导航行为
  2. 钉钉服务器端SDK PHP版
  3. 【Matlab 图像】 app designer
  4. 我写的第一本书《TypeScript 入门教程》
  5. Matlab | Matlab从入门到放弃(7)——struct结构体
  6. suse linux 安装oracle,SUSE Linux下安装Oracle 11g服务器
  7. 05 MapReduce应用案例03
  8. java实现两个字符串相连接_P005 实现两个字符串的连接 ★
  9. 【渝粤教育】国家开放大学2018年秋季 1141t工程经济与管理 参考试题
  10. 大数据 流式计算 apache storm 学习笔记 01 ---汪文君
  11. linux入门目录汇总
  12. 第十九周—c语言 电子词典项目
  13. 联想服务器自动关机_联想电脑老是自动关机怎么回事
  14. vue有纵向和横向表头表格
  15. python做一个登录注册界面_Python 实现简单的登录注册界面
  16. SyntaxError: Non-UTF-8 code starting with '\xca'
  17. script ‘D:\pycharm\Student‘ not found
  18. 什么是分布式数据存储
  19. ListView缓存机制小结
  20. 数据结构课程设计(十一)---关键路径问题

热门文章

  1. python匹配字符串以结尾_Python-字符串开头或结尾匹配
  2. Spring boot项目集成阿里云短信服务发送短信验证码
  3. 大文件怎样实现快速上传?
  4. Qt 二维码文件传输工具
  5. 美图秀秀拼接渐变过渡_如何使用Web组件创建渐变过渡
  6. 计算机 科研进度安排,研究计划进度安排及预期目标-浙江大学现代教务管理系统.doc...
  7. 利用python爬虫进行彼岸网图库图片的抓取(bs4)
  8. 2021年道路运输企业主要负责人和安全生产管理人员安全考核题型二[安考星]
  9. unity 安装踩坑
  10. Tool-图片压缩-腾讯智图:腾讯智图