此帖出自微控制器 MCU论坛
最新回复
#ifndef CNTL_2P2Z_F_H_
#define CNTL_2P2Z_F_H_
//*********** Structure Definition ********//
// Second order control law using an IIR filter structure with programmable output saturation.
// This macro uses CNTL_2P2Z_F structures to store coefficients & internal values.
// The structures should be initialized with the supplied CNTL_2P2Z_F_INIT macro.
// Within the structure the Max & Min parameters are the output bounds where as the IMin parameter
// is used for saturating the lower bound while keeping an internal history. The IMin parameter
// should not be lower than -0.9.
typedef struct {
// Coefficients
float32 Coeff_B2;
float32 Coeff_B1;
float32 Coeff_B0;
float32 Coeff_A2;
float32 Coeff_A1;
// Output saturation limits
float32 Max;
float32 IMin;
float32 Min;
} CNTL_2P2Z_F_COEFFS;
typedef struct {
float32 Out1;
float32 Out2;
// Internal values
float32 Errn;
float32 Errn1;
float32 Errn2;
// Inputs
float32 Ref;
float32 Fdbk;
// Output values
float32 Out;
} CNTL_2P2Z_F_VARS;
//*********** Macro Definition ***********//
#define CNTL_2P2Z_F_MACRO(v, k) \
/* Calculate error */ \
k.Errn = k.Ref - k.Fdbk; \
k.Out = (v.Coeff_A2*k.Out2) + (v.Coeff_A1 *k.Out1) + (v.Coeff_B2 *k.Errn2) \
+ (v.Coeff_B1 * k.Errn1) + (v.Coeff_B0 * k.Errn); \
/* Update error values */ \
k.Errn2 = k.Errn1; \
k.Errn1 = k.Errn; \
/* Determine new output */ \
k.Out = (k.Out < v.Max) ? k.Out : v.Max; \
k.Out = (k.Out > v.IMin) ? k.Out : v.IMin; \
/* Store outputs */ \
k.Out2 = k.Out1; \
k.Out1 = k.Out; \
/* Saturated output */ \
k.Out = ((k.Out > v.Min) ? k.Out : v.Min);
#endif /* CNTL_2P2Z_F_H_ */
复制代码我用的代码是这样的,来自TI的control SUITE的Solar LIB。
用下面的宏定义函数就可以了。两个结构体一个放了波波器的值一个放滤波参数。用之前记得两个结构体都初始化一下。
然后滤波器参数用MATLAB的fdatool生成一下就可以了。楼主可以试试看。
详情
回复
发表于 2015-12-22 16:54
| ||
|
||
| |
|
|
此帖出自微控制器 MCU论坛
| ||
|
||
此帖出自微控制器 MCU论坛
| ||
|
||
曾经的版主且威望大于2000,或对EEWORLD论坛有突出贡献的坛友
EEWorld Datasheet 技术支持