1.什么是PID

PID控制是一种经典的控制算法,它被广泛应用于工业、机械、电子、自动化等领域中的控制系统中。PID控制是指通过对系统输出值与期望值之间的误差进行实时反馈,调节控制器的输出值,以达到控制系统稳定工作的目的。

PID控制算法由三个控制元素组成:比例控制(P)、积分控制(I)和微分控制(D)。比例控制用于直接根据误差大小来调节控制器输出,使输出与误差成比例关系;积分控制则用于累积误差,以降低误差累积导致的系统偏差;微分控制则用于预测误差变化趋势,以抑制系统的过冲现象。

PID控制算法的优点在于可以对系统误差进行实时反馈调整,同时具有简单易懂、易于实现的特点。然而,PID控制算法的缺点是它无法对非线性、时变、不确定性等问题进行很好的控制,需要根据实际控制情况进行调整和优化。

2.PID的实现

2.1 结构体定义

typedef struct {/* Controller gains */float Kp;float Ki;float Kd;/* Derivative low-pass filter time constant */float tau;/* Output limits */float limMin;float limMax;/* Integrator limits */float limMinInt;float limMaxInt;/* Sample time (in seconds) */float T;/* Controller "memory" */float integrator;float prevError;          /* Required for integrator */float differentiator;float prevMeasurement;        /* Required for differentiator *//* Controller output */float out;} PIDController;

2.2 PID函数实现

void vPIDControllerInit(PIDController *pid)
{/* Clear controller variables */pid->integrator = 0.0f;pid->prevError  = 0.0f;pid->differentiator  = 0.0f;pid->prevMeasurement = 0.0f;pid->out = 0.0f;
}float vPIDControllerUpdate(PIDController *pid, float setpoint, float measurement)
{/** Error signal*/float error = setpoint - measurement;/** Proportional*/float proportional = pid->Kp * error;/** Integral*/pid->integrator = pid->integrator + 0.5f * pid->Ki * pid->T * (error + pid->prevError);/* Anti-wind-up via integrator clamping */if (pid->integrator > pid->limMaxInt) {pid->integrator = pid->limMaxInt;} else if (pid->integrator < pid->limMinInt) {pid->integrator = pid->limMinInt;}/*Derivative (band-limited differentiator) */pid->differentiator = -(2.0f * pid->Kd * (measurement - pid->prevMeasurement)   /* Note: derivative on measurement, therefore minus sign in front of equation! */+ (2.0f * pid->tau - pid->T) * pid->differentiator)/ (2.0f * pid->tau + pid->T);/*Compute output and apply limits */pid->out = proportional + pid->integrator + pid->differentiator;if (pid->out > pid->limMax) {pid->out = pid->limMax;} else if (pid->out < pid->limMin) {pid->out = pid->limMin;}/* Store error and measurement for later use */pid->prevError       = error;pid->prevMeasurement = measurement;/* Return controller output */return pid->out;}

2.3 主线程调用

/* Controller parameters */
#define PID_KP                      (10.0f)
#define PID_KI                      (0.35f)
#define PID_KD                      (0)
#define PID_TAU                     (0.02f)
#define PID_LIM_MIN                 (10.0f)
#define PID_LIM_MAX                 (1000.0f)
#define PID_LIM_MIN_INT             (-500.0f)
#define PID_LIM_MAX_INT             (500.0f)
#define SAMPLE_TIME_S               (1.0f)PIDController pid;void main(void)
{for(;;){if(HAL_GetTick()-uiTick >= 1*1000)//每隔一秒,对应上面的SAMPLE_TIME_S{float flow = vGetSystemFLow();//这里是获取流量传感器的读数 vPIDControllerUpdate(&pid,5.0, fFlow);   vTMC5160Rotate((uint16_t)pid.out,CCW);//根据PID的计算结果设定步进电机转速}}
}

3.总结

对于惯量较大的闭环控制系统,需要特别注意PID参数的调节。以下是一些可能有用的步骤:

  1. 确定系统的开环传递函数,也就是没有控制器时输入信号到输出信号的传递函数。这可以通过实验或建模得到。

  2. 选择合适的控制器类型,比如PID控制器。PID控制器有三个参数:比例增益Kp,积分时间Ti和微分时间Td。

  3. 首先尝试根据经验法则调节控制器参数。例如,对于惯量较大的系统,可以先将Kp设定为一个较小的值,逐渐增加到满意的水平,以避免产生过大的振荡。然后逐步增加Ti以提高系统的稳定性,最后再考虑Td以改善响应速度。

  4. 进行实验,评估控制器性能。可以通过观察系统响应曲线、计算系统性能指标(如稳态误差、超调量、调整时间等)来评估控制器性能,并根据需要调整控制器参数。

  5. 可以使用现代控制技术,例如自适应控制或模型预测控制,来进一步优化控制器性能。

  6. 如果系统过于复杂或难以建模,可以考虑使用智能控制技术,例如模糊控制或神经网络控制,来设计控制器。这些方法可能需要更多的试验和调整。

总之,调节PID控制器参数需要经验和实验结合,以满足系统要求并优化性能。

STM32基于流量传感器对步进电机转速进行PID闭环控制相关推荐

  1. cubemx stm32 基于uln2003模块的步进电机驱动代码

    cubemx配置 开4个GPIO口 硬件连接 使用的是野火的指南者,型号是stm32f103ve 代码 uln2003.c #include "uln2003.h" #includ ...

  2. 基于STM32的光敏传感器数据采集系统-嵌入式系统与设计课程设计

    目录 1 项目概述 1.1 项目介绍 1.2 项目开发环境 1.3 小组人员及分工 2 需求分析 2.1 系统需求分析 2.2 可行性分析 2.3 项目实施安排 3 系统硬件设计 3.1 系统整体硬件 ...

  3. STM32使用模拟I2C读取硒翔30mL流量传感器

    使用模拟I2C读取硒翔30mL/min流量传感器 该工程使用某些采样次数和时间不同会采集到的报文有问题. 我建议是可以换个次数和时间调下. 如果报文有问题的话 就修改延时就好了,延时指的是I2C每发送 ...

  4. K_A13_001 基于STM32驱动霍尔开关传感器 串口与OLED0.96双显示

    K_A13_001 基于STM32驱动霍尔开关传感器 串口与OLED0.96双显示 一.资源说明 二.基本参数 参数 引脚说明 三.驱动说明 对应程序: 四.部分代码说明 1.接线引脚定义 STM32 ...

  5. 单片机控制两个步进电机画圆_基于单片机的步进电机转速控制设计详解(附程序)...

    步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件.在非超载的情况下,电机的转速.停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角.这 ...

  6. 基于matlab的步进电机转速控制仿真,基于matlab的步进电机转速控制仿真

    基于matlab的步进电机转速控制仿真 摘 要 一般电动机都是连续旋转,而步进电动却是一步一步转动的,故叫步进电动机.每输入一个冲信号,该电动机就转过一定的角度(有的步进电动机可以直接输出线位移,称为 ...

  7. STM32与PC串口通信 实现步进电机转速可调 程序及调试过程分享

    在读书期间,需要用到步进电机.用STM32F103ZET6作为下位机,采用计时器产生PWM波,通过改变改变ARR的值,改变PWM波的频率,实现步进电机调速,LCD屏幕显示串口收到的数值. PC作为上位 ...

  8. 单片机涡轮流量传感器_基于单片机的智能涡轮流量计显示仪的设计

    基于单片机的智能涡轮流量计显示仪的设计 前言 基于单片机的智能涡轮流量计, 以轴向型涡轮流量计作为测量系 统, 采用智能流量显示仪并利用汽车电源供电. 阐述流量显示仪表的 设计,在硬件设计方面,采用了 ...

  9. 基于matlab的步进电机转速控制仿真,matlab步进电机转速控制仿真(课程设计).doc

    matlab步进电机转速控制仿真(课程设计) 摘 要 一般电动机都是连续旋转,而步进电动却是一步一步转动的,故叫步进电动机.每输入一个冲信号,该电动机就转过一定的角度(有的步进电动机可以直接输出线位移 ...

最新文章

  1. SQL SERVER特殊行转列案列一则
  2. idea中链接mysql查询_在Idea中编写Java程序连接查询Sqlite数据库
  3. red hat enterprise 6.3 change to chinese
  4. php接收arduino向服务器发来的请求
  5. 光纤交换机的配置 光纤交换机的由来是什么
  6. IT餐馆—第十六回 驱动
  7. [多线程] Thread
  8. Mybatis中Mapper映射文件详解(默认值)
  9. 基于JAVA+Servlet+JSP+MYSQL的高校社团管理系统
  10. celery 实例进阶
  11. python GUI打开文本文件代码
  12. pycharm主题设置
  13. Java并发(三),孔浩java视频百度云盘
  14. 【ASP.NET】ASP.NET入门
  15. EPLAN小知识——如何在费斯托(FESTO)官网下载EPLAN部件
  16. 工程点点app爬虫和sign算法破解
  17. CentOS 6.6安装命令行 Web 浏览器 links
  18. 张小龙的30条产品法则
  19. Android应用开发实战-保活组件
  20. Java使用GZIP进行压缩和解压缩(GZIPOutputStream,GZIPInputStream)

热门文章

  1. 装载机工作机构的设计,手机充电器的模具设计,牛头刨床执行机构及部件设计,轮式移动机器人设计,智能车刀刃磨机机械结构设计,螺纹轴车削加工及数控车削机床仿真的研究,关节型机械手设计……
  2. 制造业的工业互联网套餐:2019汉诺威工博会 SAP 展区预览
  3. Hex-Rays: 十步杀一人,两步秒OLLVM-BCF
  4. 网页修改linux命令行,linux中文本修改操作命令linux网页制作 -电脑资料
  5. JMeter类比loadrunner断言、参数化、集合点、关联、事务——学习笔记
  6. 超越一切的爱——《白夜行》
  7. ENVI Classic:如何进行图像融合(HSV变换/Brovey变换/PC变换)?
  8. MT6169射频开关RF_Switch对照资料表
  9. 用户关注模型设计_一文带你读懂PKPMPC如何实现协同设计
  10. 用计算机设计软件,计算机平面设计软件的应用