专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
请教!
2019-07-15 15:37
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
2362
2
1236
哪位大神会在dsp2812中编写pid程序,求教,谢谢!
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
2条回答
liujinyi016
2019-07-15 16:45
//====================================================
//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 <math.h>
#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 <math.h>
#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.
//==============================================================
加载中...
查看其它2个回答
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
//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 <math.h>
#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 <math.h>
#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.
//==============================================================
一周热门 更多>