请教!

2019-07-15 15:37发布

哪位大神会在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.
//==============================================================

一周热门 更多>