This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CNTL_2P2Z_Iq.H

Guru**** 2599395 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/676247/cntl_2p2z_iq-h

您好!

我使用的 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)不变、是否有好的方法来确定此系数?

谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。


    1:控制器中的输入延迟线通过以下线路进行更新:
    /*更新错误值*/\
    K.Errn2 = k.Errn1;\
    K.Errn1 = k.Errn;\

    如果您要在这些行之后放置一个断点、您应该会看到您描述的值:
    第一条指令:e (n-2)由 e (n-1)改写
    第二条指令:e (n-1)由 e (n)改写


    2、PI 调整因每个控制问题而异、但通常会由于参数选择以外的原因而出现不稳定。 从您的其他帖子中、我可以看到您正在使用基于 F28035的 HVPSFB 套件。 如果您的问题与该套件有关、您是否要调整电压或电流环路?  如果没有、您能否提供一些有关您如何使用控制器的信息?

    此致、

    Richard