完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
|
|
相关推荐
2个回答
|
|
//====================================================
//PID.h文件 //==================================================== #ifndef PID_H #define PID_H #include "C28x_FPU_FastRTS.h" #define PID_DEBUG 1 //条件编译的判别条件 //----------------------------------------------------------------------------- //定义PID计算用到的结构体对象类型,在创建多个实例时,只需将变量声明为PID_FUNC类型即可 //----------------------------------------------------------------------------- typedef struct { float Give; //输入:系统待调节量的给定值 float Feedback; //输入:系统待调节量的反馈值 //PID调节器部分 float Kp; //输入:对应式(15-53)中的Kp float Ti; //输入:对应式(15-53)中的Ti float Td; //输入:对应式(15-53)中的Td 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) void (*calc)(); // 函数指针:指向计算过程 } PID_FUNC; //----------------------------------------------------------------------------- //声明PID_FUNC_handle为CLARKE指针类型 //----------------------------------------------------------------------------- typedef PID_FUNC *PID_FUNC_handle; //----------------------------------------------------------------------------- //定义PID调节器的初始值 //----------------------------------------------------------------------------- #define PID_FUNC_DEFAULTS {0,0, 0,0,0, 0.0002, 0,0,0, 0,0,0, 0,0,0,0 (void (*)(Uint32))PIDfunc_calc } //----------------------------------------------------------------------------- // 函数声明 //----------------------------------------------------------------------------- void PIDfunc_calc(PID_FUNC_handle); #endif //============================================================== //End of file. //============================================================== //============================================================== //PID.c文件 //============================================================== #include "DSP28x_Project.h" #include "C28x_FPU_FastRTS.h" #include #include "PID.h" //========函数定义 =========================== //********************************** /* @ Description: @ Param @ Return */ //********************************** void PIDfunc_calc(PID_FUNC *p) { //使用条件编译指令进行切换 #if PID_DEBUG //在校正PID参数时,使用宏定义将PID_DEBUG设为1,从而执行以下程序 float a0,a1,a2; //这里每次都要计算 a0、a1、a2的值 a0 = p->Kp*(1 + p->T/p->Ti + p->Td/p->T); a1 = p->Kp*(1 + 2*p->Td/p->T); a2 = p->Kp*p->Td/p->T; //计算PID调节器的输出 p->Output = p->LastOutput + a0*p->Ek - a1*p->Ek_1 + a2*p->Ek_2; #else //当参数校正完成后,那么得到固定的a0、a1、a2的值,使用宏定义将PID_DEBUG设为0,从而执行以下过程 //当参数校正完成后,初始化时直接为p->a0、p->a1、p->a2赋值,省去计算过程 p->Output = p->LastOutput + p->a0*p->Ek - p->a1*p->Ek_1 + p->a2*p->Ek_2; #endif //输出限幅 if(p->Output > p->OutMax) p->Output = p->OutMax; if(p->Output < p->OutMin) p->Output = p->OutMin; //保存上一周期的值 p->LastOutput = p->Output; p->Ek_1 = p->Ek; p->Ek_2 = p->Ek_1; } //============================================================== //End of file. //============================================================== //============================================================== //PID.c文件 //============================================================== #include "DSP28x_Project.h" #include "C28x_FPU_FastRTS.h" #include #include "PID.h" //========函数定义 =========================== //********************************** /* @ Description: @ Param @ Return */ //********************************** void PIDfunc_calc(PID_FUNC *p) { //使用条件编译指令进行切换 #if PID_DEBUG //在校正PID参数时,使用宏定义将PID_DEBUG设为1,从而执行以下程序 float a0,a1,a2; //这里每次都要计算 a0、a1、a2的值 a0 = p->Kp*(1 + p->T/p->Ti + p->Td/p->T); a1 = p->Kp*(1 + 2*p->Td/p->T); a2 = p->Kp*p->Td/p->T; //计算PID调节器的输出 p->Output = p->LastOutput + a0*p->Ek - a1*p->Ek_1 + a2*p->Ek_2; #else //当参数校正完成后,那么得到固定的a0、a1、a2的值,使用宏定义将PID_DEBUG设为0,从而执行以下过程 //当参数校正完成后,初始化时直接为p->a0、p->a1、p->a2赋值,省去计算过程 p->Output = p->LastOutput + p->a0*p->Ek - p->a1*p->Ek_1 + p->a2*p->Ek_2; #endif //输出限幅 if(p->Output > p->OutMax) p->Output = p->OutMax; if(p->Output < p->OutMin) p->Output = p->OutMin; //保存上一周期的值 p->LastOutput = p->Output; p->Ek_1 = p->Ek; p->Ek_2 = p->Ek_1; } //============================================================== //End of file. //============================================================== |
|
|
|
jinyi7016 发表于 2015-11-18 22:18 谢谢您的回复! |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-使用AHT20进行环境监测之AHT20传感器介绍
727 浏览 0 评论
815 浏览 0 评论
850 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
823 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
1274 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11816 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-29 00:19 , Processed in 0.544153 second(s), Total 78, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号