基于STM32控制的数字BUCK电路及程序编写

2023-11-15

本文芯片采用STM32G474CBT6,采用STM32cubeMX进行程序生成。

BUCK电路拓扑结构:

 如图所示,BUCK变换器主要由电源VDC、场效应管MOSFET、续流二极管VD、电感L以及滤波电容C和负载RES组成。当MOSFET开通时,电流通过MOSFET给电感L储能,同时给负载供电;当MOSFET关闭时,电感L释放能量,电流从电感L经过负载再通过续流二极管VD流回电感L。通过改变MOSFET的开关时间,即改变MOSFET的占空比D可以控制输出电压的大小,其中D=Vo/Vi,该公式只适用于BUCK变换器中的CCM模式。

控制方式:

模拟控制:

传统的模拟控制方式通常采用电源控制芯片控制电路,如常用的UC3842。该控制方式通常将输出电压通过反馈电路产生一个电压与电源芯片内部的基准进行比较,再将比较的得到的值与芯片的锯齿波进行比较产生PWM波,通过这样的一个控制回路调节占空比,最终与芯片内部基准相等,从而进行稳压的目的。        

数字控制:

图1为数字控制的流程图,输出电压通过电压采样电路进入MCU的AD模块,AD模块在一定的周期内对AD的值进行采样与MCU设置的基准进行比较产生误差,(图1中VDC2可看为MCU设置的基准)产生的误差进入PID算法中进行一个误差运算,再将运算出来的值进行一个限幅,防止PWM过大或者过小对电路造成不稳定。控制量再经过MCU内部定时器的预分频器的值进行除运算得出相对应的占空比值赋给定时器更新占空比对MOSFET进行控制。其中PID需要每个周期进行一次运算。

 图1        

程序编写:

得知数字控制的流程之后我们就可以将其转换为程序放入MCU中,其中最重要的是AD采样的位置和PID算法。

如图2所示,在一个周期的中点对ADC进行采样是最好的,这样可以避免开关噪声所带来的误差。程序中采用HRTIM1的TimerA的寄存器1产生PWM波,寄存器3进行触发AD采用。

 图2

接下来开始编写程序。

以下程序为定时器寄存器3的中断回调函数,用同一个定时器的好处就是可以方便确定AD采样的点,该程序主要进行ADC的采样和PID的计算,其中将采样回来的值进行换算成实际电压后放入PID程序中进行计算。电压是否要放大根据自己的实际采样电路进行取舍,也可自行加入滤波程序。

void HAL_HRTIM_Compare3EventCallback(HRTIM_HandleTypeDef * hhrtim, uint32_t timerA)
{
	uint32_t sum = 0;								//循环总和
	uint32_t value_sum = 0;							//滤波后电压
	
	Vout = ADC_Value[1]*3.3f/4095;			        //计算采样出来的实际电压
	Value = Vout * 1000;							//电压放大一千倍
	PID_Incremental(Value,251);			            //PID计算
}

以下程序为PID程序,首先定义需要用到的变量,再将这些变量进行初始化赋值,其次就进入PID的主要程序。该程序有两个变量,一个是AD采样得到的值,一个是自己设置的一个值,(设置值主要根据自己想要的输出电压进行设置)首先计算出设置值和当前采样值的误差(若采样电压有放大则需要除一个放大倍数,若采样时没有放大,则不需要),求得多几次的误差,得到误差后就可以放入PID的程序中进行计算出ERROR_Increase_V。(PID的公式为∆u= Kp * [e- ek-1 + Ki * e+ Kd * [e- 2ek-1 + e(k-2)])计算完PID后将误差进行移位,留给下一次计算做准备。将计算得到的ERROR_Increase_V进行占空比的限幅,防止没有设置合适的PID参数时得到的结果过大对电路造成损坏。用得到的ERROR_Increase_V计算出实际电压计算出占空比赋值给定时器的寄存器1更新占空比,将计算出的占空比的一半的值赋值给寄存器3进行更新ADC的采样点。其中PID的参数对电路的稳定性有决定性的影响,调试PID参数时可采用串口的方式进行调试,但是调整好参数之后要将串口程序进行屏蔽,否则输出电压会跳动。

float  Kp_V;             //比例系数
float  Ki_V;             //积分系数
float  Kd_V;             //微分系数
float  error1_V;         //当前输出和设定值误差
float  error2_V;         //当前输出和设定值误差
float  e1_V;             //上次输出和设定值误差
float  e2_V;             //上上次输出和设定值误差

float  Duty;			 //占空比
float  ERROR_Increase_V; //占空比增加量

uint32_t Pulse_width = 0;		 //占空比宽度
 
void PID_init(void)              //PID初始化
{	
	Kp_V = 0.3f;                 //比例系数
	Ki_V = 0.001f;               //积分系数
	Kd_V = 0.8;                  //微分系数

	error1_V = 0.0;              //当前输出和设定值误差
	error2_V = 0.0;              //当前输出和设定值误差
	e1_V = 0.0;                  //上次输出和设定值误差
	e2_V = 0.0;                  //上上次输出和设定值误差

	ERROR_Increase_V = 0.0; 	 //占空比增加量
	Duty = 0.0;
}

void PID_Incremental(uint16_t Vout_actual,uint16_t Vset_target) //当前电压和设置电压
{
	error1_V = (Vset_target - Vout_actual) * 0.001f;		    //当前误差
	e1_V = error1_V - error2_V;									//上上次误差
	ERROR_Increase_V += Kp_V * e1_V + Ki_V * error1_V + Kd_V * (e1_V - e2_V);	//PID算法
	error2_V = error1_V;								        //移位
	e2_V = e1_V;												//移位
	
	if(ERROR_Increase_V >= 2.706f)		    //限制最大占空比82% 	
	{
		ERROR_Increase_V = 2.706f;
	}
	if(ERROR_Increase_V <= 0.33f)	        //限制最小占空比10%		
	{
		ERROR_Increase_V = 0.33f;
	}
	
	Duty = ERROR_Increase_V * 0.303030303f;				           //计算电压
	Pulse_width = Duty * 27200;									   //计算占空比
		
	hhrtim1.Instance->sTimerxRegs[0].CMP1xR = Pulse_width;         //修改占空比
	hhrtim1.Instance->sTimerxRegs[0].CMP3xR = Pulse_width >> 1;    //修改AD的采样点
	
}

BUCK电路改为同步整流只需要将续流二极管改为MOSFET即可,程序只需要将PWM波改为互补的PWM即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于STM32控制的数字BUCK电路及程序编写 的相关文章

随机推荐

  • $nextTick的作用和使用场景

    nextTick的作用和使用场景 vue中的nextTick主要用于处理数据动态变化后 DOM还未及时更新的问题 用nextTick就可以获取数据更新后最新DOM的变化 适用场景 第一种 有时需要根据数据动态的为页面某些dom元素添加事件
  • 解决延迟有 Wi-Fi 6 就够了!

    最近二狗子家里的路由器坏了 而家里的数据网络信号又非常差 失去了路由器基本上就等于和世界隔离 所以二狗子打算去附近商城随便买一个新的路由器 结果售货员张口就问 买 Wi Fi 6 的路由器吗 Wi Fi 6 这直接把二狗子问懵了 Wi Fi
  • Serverless Kubernetes 应用部署及扩缩容

    作者 邓青琳 轻零 阿里云技术专家 导读 本文分为三个部分 首先给大家演示 Serverless Kubernetes 集群的创建和业务应用的部署 其次介绍 Serverless Kubernetes 的常用功能 最后对应用扩缩容的操作进行
  • 医学图像分割研究思路

    医学图像分割的主流方法之一是基于水平集 Level Set 的分割方法 目前针对主流的分割方法 我们主体研究思路如下图 在模型凸化以及形状先验两个方面 未开展相关工作 参考文献 部分演示代码 参数随图像需要调整 7 Xiaomeng Xin
  • 重新生成一堆rpm目录的repo库步骤

    createrepo c repo2module s stable modules yaml modifyrepo c mdtype modules modules yaml repodata
  • IntelliJ IDEA插件搜索下载缓慢

    我用的版本是2019 2 1 搜索插件特别慢 有时候加载不出来 看到别人说是用 Setting Appearance Behavior Syetem Setting Updates 将Use secure connection 的勾选去掉
  • java----面向对象和面向过程

    1 面向对象思想 面向对象四星思想就是把关注点放在一件事或一个活动中设计的人或事物上的思想 2 面向过程思想 面向过程思想就是把关注点放在一件事或一个活动中设计的人或事物所涉及的步骤上的思想 3 面向过程关键字 步骤 过程 4 面向对象关键
  • 一周 8k Star 的 Notion 开源替代品 AppFlowy 诞生

    近日 Notion 的开源替代品 AppFlowy 正式发布了 一经发布 在短短一周就获得了近 8k Star 这个成绩对于一个开源项目来说是非常不错的 那么为什么有了 Notion AppFlowy 团队却要从头开始开发一个类似的产品呢
  • 框架--SpringWeb

    文章目录 一 springweb 1 概述 2 springWeb层搭建 3 请求中的地址如何定义 4 如何接收请求中的数据 5 直接使用对象接收 6 post请求中文乱码处理 7 Ajax 返回 JSON 8 跨域问题 9 拦截器 10
  • string头文件常用方法(C++)

    string 定义字符串 如果未赋初值 则默认是 即空字符串 结尾也没有结束标志 0 include
  • 排序算法-希尔排序

    属性 1 希尔排序是对直接插入排序的优化 2 当gap gt 1时都是预排序 目的是让数组更接近于有序 当gap 1时 数组已经接近有序的了 这样就会很 快 这样整体而言 可以达到优化的效果 我们实现后可以进行性能测试的对比 3 希尔排序的
  • C++ 异常处理 入门

    C 异常处理 入门 异常 程序执行期间 可检测到的不正常情况 例如 0作除数 数组下标越界 打开不存在的文件 远程机器连接超时 malloc失败等等 程序的两种状态 正常状态和异常状态 发生不正常情况后 进入异常状态 从当前函数开始 按调用
  • Flex和Bison协同工作(下)

    Flex和Bison协同工作 下 上一篇文章我们写了一个稍微复杂一点点的词法解析器 这篇我们开始搞定语法分析器 文法与语法分析 语法分析器的任务其实就是找出输入记号之间的关系 通常使用语法分析树 parse tree 例如 算术表达式12
  • [4G&5G专题-62]:架构 - 开放的网络自动化平台ONAP(Open Network Automation Platform)

    目录 第1章 什么是开放的网络自动化平台ONAP 1 1 什么是ONAP 1 2 什么是的网络自动化平台 1 3 ONAP的动机与背景 1 4 ONAP的底层支撑技术 1 5 ONAP的前世 1 6 5G与ONAP 第2章 5G RAN的自
  • 你真的会用read()读【普通文件】吗?

    原型如下 include
  • 如何将json字符串写入table表格中

    JSON JavaScript Object Notation 是一种轻量级的数据交换格式 可以方便的将后台复杂的数据带回到前台进行展示 那么如何把json字符串写入到table表格之中呢 json简单说就是javascript中的对象和数
  • 美通企业日报

    今日看点 2019时尚育儿
  • java 常见错误合集

    java lang NullPointerException 这个异常都是因为调用null对象的方法 就是一个对象还没有没有正常初始化 就先调用它的方法比如 Object obj null obj toString 这就会抛出 这个异常
  • java中strictfp么意思_java中的strictfp的作用

    自Java2以来 Java语言增加了一个关键字strictfp 虽然这个关键字在大多数场合比较少用 但是还是有必要了解一下 strictfp 的意思是FP strict 也就是说精确浮点的意思 在Java虚拟机进行浮点运算时 如果没有指定s
  • 基于STM32控制的数字BUCK电路及程序编写

    本文芯片采用STM32G474CBT6 采用STM32cubeMX进行程序生成 BUCK电路拓扑结构 如图所示 BUCK变换器主要由电源VDC 场效应管MOSFET 续流二极管VD 电感L以及滤波电容C和负载RES组成 当MOSFET开通时