#include<stdio.h>
#include<stdlib.h>
struct PID_VARS
{
float Kp;
float Ki;
float Kd;
//float K; //电流环增益
float T; //离散化系统的采样周期
float a0; //输入:对应式(15-58)中的a0
float a1; //输入:对应式(15-58)中的a1
float a2; //输入:对应式(15-58)中的a2
float Ek; //中间变量:对应式(15-58)中的e(k)
float Ek_1; //中间变量:对应式(15-58)中的e(k-1)
float Ek_2; //中间变量:对应式(15-58)中的e(k-2)
float OutMax; //输入:PID调节器的最大输出限幅
float OutMin; //输入:PID调节器的最小输出限幅
float Output; //输出:PID调节器的输出,对应式(15-58)中的u(k)
float LastOutput; //中间变量:PID上一周期的输出值,对应式(15-58)中的u(k-1)
};
float ActualSpeed=1.7,FeedbackV=1.75;
float incrementout;
pid.Output=ActualSpeed;
pid.Ek=FeedbackV-pid->Output;
pid->a0 = pid->Kp + pid->Ki * pid->T + pid->Kd / pid->T; //调试用
pid->a1 = pid->Kp + 2 * pid->Kd / pid->T;
pid->a2 = pid->Kd / pid->T;
pid->Output = pid->LastOutput + pid->a0 * pid->Ek - pid->a1 * pid->Ek_1 + pid->a2 * pid->Ek_2; //计算PID调节器的输出
if (pid->Output > pid->OutMax) //输出限幅
pid->Output = pid->OutMax;
if (pid->Output < pid->OutMin)
pid->Output = pid->OutMin;
pid->LastOutput = pid->Output; //保存上一周期的值
pid->Ek_1 = pid->Ek;
pid->Ek_2 = pid->Ek_1;
incrementout = pid->Output-pid->LastOutput ;
printf("%f\n",speed);
pid.zip_VC pid_简单pid算法
版权申诉
5星 · 超过95%的资源 17 浏览量
2022-09-19
23:04:04
上传
评论
收藏 1KB ZIP 举报
四散
- 粉丝: 52
- 资源: 1万+
最新资源
- (大赛作品)STM32实现的F072RB NUCLEO智能家居控制.zip
- STM32实现的数字示波器源码+数字信号处理教程、配套实例.zip
- 【cookie续续】【cookie续续】【cookie续续】
- 低功耗STM32实现的F411开发板(原理图+PCB源文件+官方例程+驱动等).zip
- 基于stm32实现的 nucleo-L476的智能灯(操作说明+源码).zip
- 基于STM32实现的 NUCLEO板设计彩色LED照明灯(纯cubeMX开发).zip
- 基于STM32实现的 的联合调试侦听设备解决方案(原理图、PCB源文件、调试工具、视频).zip
- 基于STM32实现的 人群定位、调速智能风扇设计(程序、设计报告、视频演示).zip
- 哔哩下载姬(DownKyi)
- 千纬认字app再次更新,增加部首、笔画动画功能
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈