1239|16

75

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

BUCK电路二阶IIR滤波的算法 [复制链接]

 
 

大家好!

最近在学习数字电源方面的知识,使用的是TI的TMS320F28377S系列控制一个BUCK电路,在示例代码里遇到了一个二阶IIR滤波的算法,大概是根据输出电压来进行环路补偿,最终的产生一个PWM的占空比,对这个二阶IIR算法不理解,特别是那个宏CNTL_2P2Z_F_C,麻烦大家帮忙看下以下代码的思路,谢谢了!

/**
 * Second order control law using an IIR filter structure with programmable output saturation.
 * This macro uses CNTL_2P2Z_F_C structures to store coefficients & internal values.
 * The structures should be initialized with the supplied CNTL_2P2Z_F_C_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.
 */
//================================================================================
// Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/
//  ALL RIGHTS RESERVED
//================================================================================

#ifndef CNTL_2P2Z_F_C_H_
#define CNTL_2P2Z_F_C_H_

#include "DPlib.h"

/**
 * Two-pole two-zero controller structures.
 */
typedef struct {
	// Coefficients
	float Coeff_B2;
	float Coeff_B1;
	float Coeff_B0;
	float Coeff_A2;
	float Coeff_A1;

	// Output saturation limits
	float Max;
	float IMin;
	float Min;
} CNTL_2P2Z_F_C_Coeffs;

typedef struct {
	// Inputs
	float Ref;
	float Fdbk;

	// Internal values
	float Errn;
	float Errn1;
	float Errn2;

	// Output values
	float Out;
	float Out1;
	float Out2;
	float OutPresat;
} CNTL_2P2Z_F_C_Vars;

/**
 * Calculates a second order control law with IIR filter and programmable output saturation.
 * @param CNTL_2P2Z_F_C_Coeffs structure with proper coefficient values.
 * @param CNTL_2P2Z_F_C_Vars structure with internal & output values.
 * [url=home.php?mod=space&uid=784970]@return[/url] CNTL_2P2Z_F_C_Vars Out parameter.
 */
#define CNTL_2P2Z_F_C(v, k)																	\
		/* Calculate error */																	\
		k.Errn = k.Ref - k.Fdbk;																\
		k.OutPresat = (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.OutPresat;																	\
		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);

/*
 * Initial values for CNTL_2P2Z_F_C structures.
 */
#define CNTL_2P2Z_F_C_VAR_INIT(k)				\
		/* Initialize variables */				\
		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_F_C_COEFF_INIT(v)			\
		/* Initialize coefficients */			\
		v.Coeff_B2 = 0;							\
		v.Coeff_B1 = 0;							\
		v.Coeff_B0 = 0;							\
		v.Coeff_A2 = 0;							\
		v.Coeff_A1 = 0;							\
		/* IMin cannot be lower than -0.9 */	\
		v.IMin = -0.9;							\
		v.Max = 1;								\
		v.Min = (0);

#endif /* CNTL_2P2Z_F_C_H_ */

 

最新回复

在那里找的这个TI的环路补偿器工具,TI 一定有这个工具使用说明 从图看,是可以通过图形用户界面GUI直接输入零点和极点的位置,或者通过调整预定义的补偿器参数来间接改变零点和极点的位置。 如何确实需要分析硬件电路的输出与输入传递函数来确定零点和极点的位置,TI官方有很多官方文档和应用指南可以参考,可以到TI 官网找一下   详情 回复 发表于 2024-5-7 06:40
点赞 关注
 
 

回复
举报

1万

帖子

203

TA的资源

管理员

沙发
 

帮你手动@下几位大侠~@maychang  @chunyang   @qwqwqw2088   @蓝色天使   

加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
个人签名玩板看这里:
https://bbs.eeworld.com.cn/elecplay.html
EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!
 
 
 

回复

2万

帖子

340

TA的资源

版主

板凳
 
本帖最后由 qwqwqw2088 于 2024-4-30 18:33 编辑

算法是通过IIR滤波器实现了对Buck电路输出电压的精确控制

在数字电源管中,IIR滤波器是为了某种形式的环路补偿或控制。

在BUCK电路中,这通常涉及到根据反馈电压调整PWM占空比以控制输出电压。

点评

你好!另外,想请教下这个宏用到的零点和极点系数一般通过什么样的方式来获取?是要分析电路的输出与输入传递函数吗?零点和极点的位置一般怎样确定?  详情 回复 发表于 2024-5-6 08:56
 
 
 

回复

6856

帖子

0

TA的资源

五彩晶圆(高级)

4
 

CNTL_2P2Z_F_C_Coeffs 结构体用于存储滤波器系数,包括两个零点系数 Coeff_B2、Coeff_B1 和 Coeff_B0,以及两个极点系数 Coeff_A2、Coeff_A1。这些系数决定了滤波器的频率响应特性。

CNTL_2P2Z_F_C_Vars 结构体包含了滤波器运行所需的输入、内部状态值和输出值。其中:

Ref 是参考电压(期望的输出电压)。
Fdbk 是反馈电压(实际的输出电压测量值)。
Errn, Errn1, Errn2 分别是当前误差、上一次误差和上上一次误差。
Out, Out1, Out2 分别是当前输出、上一次输出和上上一次输出。
OutPresat 是预饱和输出,即在进行输出饱和处理之前的计算结果。
 

 
 
 

回复

6856

帖子

0

TA的资源

五彩晶圆(高级)

5
 

算法是这样

宏 CNTL_2P2Z_F_C(v, k) 实现了二阶IIR滤波器的核心算法逻辑:

误差计算:计算参考电压与反馈电压之差作为误差 Errn。
滤波计算:使用前一次和前两次的误差及输出值,以及滤波器系数,计算出新的输出预饱和值 OutPresat。
误差更新:将误差历史值向后移动一位,为下一次迭代做准备。
输出处理:首先直接将预饱和输出赋给 k.Out,然后进行饱和限制处理,确保输出在 v.Min 到 v.Max 之间,并且通过 IMin 参数来保护积分器不致于饱和到过低的值,避免积分 wind-up现象。
输出存储:更新输出的历史值,供下一次迭代使用。


初始化宏

CNTL_2P2Z_F_C_VAR_INIT(k) 初始化 CNTL_2P2Z_F_C_Vars 结构体的所有变量为0。
CNTL_2P2Z_F_C_COEFF_INIT(v) 初始化 CNTL_2P2Z_F_C_Coeffs 结构体的系数为0,并设置了默认的输出饱和界限和最小积分下限(IMin),以避免数值问题。

点评

你好!另外,想请教下这个宏用到的零点和极点系数一般通过什么样的方式来获取?是要分析电路的输出与输入传递函数吗?零点和极点的位置一般怎样确定?  详情 回复 发表于 2024-5-6 08:57
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(中级)

6
 

非常谢谢各位的解答!

 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(中级)

7
 
qwqwqw2088 发表于 2024-4-30 18:10 算法是通过IIR滤波器实现了对Buck电路输出电压的精确控制 在数字电源管中,IIR滤波器是为了某种形式的环 ...

你好!另外,想请教下这个宏用到的零点和极点系数一般通过什么样的方式来获取?是要分析电路的输出与输入传递函数吗?零点和极点的位置一般怎样确定?

 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(中级)

8
 
Jacktang 发表于 2024-4-30 20:41 算法是这样 宏 CNTL_2P2Z_F_C(v, k) 实现了二阶IIR滤波器的核心算法逻辑: 误差计算:计算参考电压与 ...

你好!另外,想请教下这个宏用到的零点和极点系数一般通过什么样的方式来获取?是要分析电路的输出与输入传递函数吗?零点和极点的位置一般怎样确定?

点评

零点和极点的确切位置需要通过仿真和实验来确定    详情 回复 发表于 2024-5-6 09:27
 
 
 

回复

6856

帖子

0

TA的资源

五彩晶圆(高级)

9
 
power_wong921 发表于 2024-5-6 08:57 你好!另外,想请教下这个宏用到的零点和极点系数一般通过什么样的方式来获取?是要分析电路的输出与输入 ...

零点和极点的确切位置需要通过仿真和实验来确定

 

点评

下图是TI的环路补偿器工具,能麻烦帮忙看下各个值的作用吗?特别是上部,Kdc, 两极点两原点的相关内容,我试着改了零点的位置,最右边的系统会跟着改动,请问下系统在什么条件才是稳定的环路呢?三路颜色的线条要怎  详情 回复 发表于 2024-5-6 16:53
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(中级)

10
 
Jacktang 发表于 2024-5-6 09:27 零点和极点的确切位置需要通过仿真和实验来确定  

下图是TI的环路补偿器工具,能麻烦帮忙看下各个值的作用吗?特别是上部,Kdc, 两极点两原点的相关内容,我试着改了零点的位置,最右边的系统会跟着改动,请问下系统在什么条件才是稳定的环路呢?三路颜色的线条要怎么样才是稳定的系统呢?谢谢了!

 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(中级)

11
 

 

点评

这个图,标的是在C200补偿器设计工具中产生的, 零点和极点的添加确实是通过软件界面来完成的。好好研究一下TI 的这个工具就能明白,三条线图上有标识    详情 回复 发表于 2024-5-7 06:32
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(中级)

12
 

这个零点和极点的添加是通过软件吗?是不是要计算硬件的相关参数后才能确定如何添加这些零极点呢?那个Kdc是什么?

点评

在那里找的这个TI的环路补偿器工具,TI 一定有这个工具使用说明 从图看,是可以通过图形用户界面GUI直接输入零点和极点的位置,或者通过调整预定义的补偿器参数来间接改变零点和极点的位置。 如何确实需要分析  详情 回复 发表于 2024-5-7 06:40
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(中级)

13
 

@chunyang    @qwqwqw2088    @蓝色天使    

 
 
 

回复

2万

帖子

340

TA的资源

版主

14
 

Kdc是直流增益值,可以查有关资料一下,在电源控制系统中,适当的直流增益值的作用就理解一些了

 

 
 
 

回复

6856

帖子

0

TA的资源

五彩晶圆(高级)

15
 

这个图,标的是在C200补偿器设计工具中产生的,

零点和极点的添加确实是通过软件界面来完成的。好好研究一下TI 的这个工具就能明白,三条线图上有标识

 

 
 
 

回复

6856

帖子

0

TA的资源

五彩晶圆(高级)

16
 
power_wong921 发表于 2024-5-6 16:58 这个零点和极点的添加是通过软件吗?是不是要计算硬件的相关参数后才能确定如何添加这些零极点呢?那个Kdc ...

在那里找的这个TI的环路补偿器工具,TI 一定有这个工具使用说明

从图看,是可以通过图形用户界面GUI直接输入零点和极点的位置,或者通过调整预定义的补偿器参数来间接改变零点和极点的位置。

如何确实需要分析硬件电路的输出与输入传递函数来确定零点和极点的位置,TI官方有很多官方文档和应用指南可以参考,可以到TI 官网找一下

点评

谢谢了!  详情 回复 发表于 2024-5-7 08:29
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(中级)

17
 
Jacktang 发表于 2024-5-7 06:40 在那里找的这个TI的环路补偿器工具,TI 一定有这个工具使用说明 从图看,是可以通过图形用户界面GUI直 ...

谢谢了!

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表