您好!
我使用的 PI 算法是 CNTL_2P2Z_IQ.H 文件。 代码如下:
/**
*使用具有可编程输出饱和的 IIR 滤波器结构的二阶控制律。
*此宏使用 CNTL_2P2Z_IQ_C 结构来存储系数和内部值。
*应使用提供的 CNTL_2P2Z_IQ_C_init 宏初始化结构。
*在结构内,Max & Min 参数是输出范围,其中作为 Imin 参数
*用于在保持内部历史记录的同时使下限饱和。 IMIN 参数
*不应低于-0.9。
*
#ifndef CNTL_2P2Z_IQ_C_H_
#define CNTL_2P2Z_IQ_C_H_
#include "IQmathLib.h"
/**
*双极双零点控制器结构。
*
typedef 结构{
//系数
长 COEFF_B2;
长 COEFF_B1;
长 COEFF_B0;
长 COEFF_A2;
长 COEFF_A1;
//输出饱和限制
最大长整型;
Long Imin;
长最小值;
} CNTL_2P2Z_IQ_C_Coeffs;
typedef 结构{
//输入
长基准;
长 Fdbk;
//内部值
长勘误表;
长勘误表1;
long 勘误表2;
//输出值
超长;
Long Out1;
Long Out2;
Long OutPresat;
} CNTL_2P2Z_IQ_C_Vars;
/**
*使用 IIR 滤波器和可编程输出饱和计算二阶控制律。
*@具有适当系数值的 param CNTL_2P2Z_IQ_C_Coeffs 结构。
*@带内部和输出值的 param CNTL_2P2Z_IQ_C_Vars 结构。
*@返回 CNTL_2P2Z_IQ_C_Vars OUT 参数。
*
#define CNTL_2P2Z_IQ_C (v、k)\
/*计算误差*/\
K.Errn = k.Ref - k.Fdbk;\
K.OutPresat =_IQ24mpy (v.COEFF_A2、k.Out2)+_IQ24mpy (v.COEFF_A1、k.Out1)+_IQ24mpy (v.COEFF_B2、k.Errn2)\
+_IQ24mpy (v.COEFF_B1、k.Errn1)+_IQ24mpy (v.COEFF_B0、k.Errn);\
\
/*更新错误值*/\
K.Errn2 = k.Errn1;\
K.Errn1 = k.Errn;\
\
/*确定新输出*/\
K.out = K.OutPresat;\
K.out =(k.out < v.Max)? K.out:v.Max;\
K.out =(k.out > v.imin)? K.out:v.imin;\
\
/*存储输出*/\
K.Out2 = k.Out1;\
K.Out1 = k.out;\
/*饱和输出*/\
K.out =(((k.out > v.min)? K.out:v.min);
/*
* CNTL_2P2Z_IQ_C 结构的初始值。
*
#define CNTL_2P2Z_IQ_C_VAR_INIT (k)\
/*初始化变量*/\
K.Ref = 0;\
K.Fdbk = 0;\
K.Errn = 0;\
K.Errn1 = 0;\
K.Errn2=0;\
K.out = 0;\
K.Out1 = 0;\
K.Out2 = 0;\
K.OutPresat = 0;
#define CNTL_2P2Z_IQ_C_COEFF_INIT (v)\
/*初始化系数*/\
V.COEFF_B2 = 0;\
V.COEFF_B1 = 0;\
V.COEFF_B0 = 0;\
V.COEFF_A2 = 0;\
V.COEFF_A1 = 0;\
/* IMIN 不能低于-0.9 */\
V.IMIN =_IQ24 (-0.9);\
V.Max =_IQ24 (1.0);\
V.min =(0)
#endif /* CNTL_2P2Z_IQ_C_H_*/
即、y (n)=y (n-1)+KP*(e (n)-e (n-1))+ki (e (n)+e (n-1))、
在调试过程中、在某些时候、我看到 e (n)的值始终等于 e (n-1)、e (n-2)的值是上一时刻的值。 为什么是这样?
2.我无法始终找到此 Kp 和 Ki 值的正确参数、这会导致输出 y (n)不变、是否有好的方法来确定此系数?
谢谢你。