Zeruns's Blog - STM32G474
type: channel
link: https://blog.zeruns.com/tag/STM32G474/
items: 基于STM32的同步整流Buck-Boost数字电源 开源
items: 基于STM32G4的0.96寸OLED显示屏驱动程序（HAL库），支持硬件/软件I2C

基于STM32的同步整流Buck-Boost数字电源 开源
type: item
date: 2024-06-05T01:35:00+08:00
description: AI摘要 一款基于STM32G474的四开关Buck-Boost数字电源，支持TypeC接口PD诱骗输入和DC5.5接口输入，输入/输出最高48V10A。通过PID算法实现输出控制与保护，含原理图、PCB、源码等开源资料。 此内容根据文章生成，仅用于文章内容的解释与总结 一款基于STM32G474的四开关Buck-Boost数字电源，支持TypeC接口PD诱骗输入和DC5.5接口输入，输入/输出最高48V10A，这是我的毕业设计，现在开源出来，含原理图、PCB、程序源码、外壳3D模型等资料。做得一般，勿喷，欢迎友好交流。作品演示视频：https://www.bilibili.com/video/BV1Ui421y7ip/基于CH32V307的智能电子负载开源，嵌入式大赛作品开源：https://blog.zeruns.com/archives/785.html本项目的立创开源平台开源链接：https://url.zeruns.com/noGf0电子/单片机技术交流QQ群：2169025065资料下载地址在文章末尾。硬件电路使用的嘉立创EDA软件来设计，这款软件真的很好用。简介​ 本文设计基于STM32的同步整流Buck-Boost数字电源，该电源电路由MOSFET驱动电路、4开关Buck-Boost电路、信号调理电路、PD快充协议电路、辅助电源电路、单片机控制电路等部分组成。​ 该电源可通过DC接口或Type-C接口供电，而且Type-C接口支持与充电器通过PD快充协议通讯，自动请求并获取最高20V的工作电压。该电源使用STM32G474单片机对输入输出的电压和电流实时监测，并通过PID控制算法来调整输出的PWM占空比，以及实现过压过流保护，还可采样主板温度来实现过温保护。此外可通过OLED屏实时查看电源的参数，并通过旋转编码器和按钮来设置输出电压和电流，还可以通过另一个Type-C接口与上位机通信，通过上位机软件可实时查看电源的各项参数和波形。设计性能参数​ 电源设计性能参数如下表：项目参数指标输入电压范围12Vdc~48Vdc输入电流范围0~10A输出最大功率450W输出电压范围0.5Vdc~48Vdc输出电流范围0~10A输出电压纹波峰峰值≤200mV开关频率181.333kHz实物图使用VOFA+作为上位机软件，可实时查看电源各项参数（输入电压和电流、输出电压和电流、主板温度、MCU温度、电源转换效率等）和波形变化。如下图所示。系统框架图硬件电路设计器件选型计算电感计算​ 在同步BUCK-BOOST电源中，电感的计算需要考虑BUCK模式和BOOST模式下的工作情况，以确保在两种模式下都能满足电路的工作要求。通常，电感的选择会基于两种模式中对电感要求更高的那个模式来进行。​ 当电源工作于BUCK降压模式时，假设输入电压最大为48V，输出电压最小为5V，计算最小的PWM占空比：$$ D_{min} = \frac{V_{out\_min}}{V_{in\_max}} = \frac{5V}{48V} = 10.417\% $$​ 定义电感电流波动量(25%的最大额定电流脉动，设最大额定电流为10A)：$$ \Delta I_L = 25\% \cdot I_{out\_nom} = 25\% \times 10A = 2.5A $$​ 计算最小需要的BUCK电感：$$ L_{minBuck} = \frac{V_{out\_min} \cdot (1 - D_{min})}{\Delta I_L \cdot f_{switch}} = \frac{5V}{2.5A \times 181333Hz} \times (1 - 10.417\%) \approx 9.88\mu H $$​ 当电源工作于BOOST升压模式时，以输入额定电压24V为计算点，计算PWM占空比：$$ D_{Bo} = 1 - \frac{V_{in\_nom}}{V_{out\_max}} = 1 - \frac{24V}{48V} = 50\% $$​ Boost 模式下，取1A（ $I_{minb}$ ）时Boost进入连续模式（CCM），计算电感：$$ L_{minBoost} = \frac{V_{out\_max} \cdot D_{Bo}(1-D_{Bo})^2}{2 \cdot I_{minb} \cdot f_{switch}} = \frac{48V \times 50\% \times (1 - 50\%)^2}{2 \times 1A \times 181333Hz} = 16.544\mu H $$​ 基于公式得出的计算结果，确定了为满足预定纹波电流要求所需的最小电感值。为了确保满足这一条件，应选用一个电感值略高于计算值的电感元…

基于STM32G4的0.96寸OLED显示屏驱动程序（HAL库），支持硬件/软件I2C
type: item
date: 2024-03-17T03:27:50+08:00
description: AI摘要 介绍了一款基于STM32G4的0.96寸OLED显示屏驱动程序，支持硬件/软件I2C，使用HAL库开发。该驱动功能丰富，支持多种内容显示与图形绘制，适用于英文、汉字、图像等展示，并提供了详细的配置与使用说明。 此内容根据文章生成，仅用于文章内容的解释与总结 基于STM32G474的0.96寸OLED(SSD1306)显示屏驱动程序（4针脚I2C接口），支持硬件IIC/软件IIC，HAL库版。这款驱动程序比较完善，可以实现 英文、整数、浮点数、汉字、图像、二进制数、十六进制数 等内容显示，可以画点、直线、矩形、圆、椭圆、三角形等，支持多种字体，差不多相当于一个简易版图形库了。该程序是基于江协科技的代码二次修改的，原版程序是基于STM32F103的，且只支持软件I2C，我修改后支持硬件I2C，也可以修改宏定义改成使用软件I2C。测试硬件为NUCLEO-G474RE开发板关于OLED的驱动原理，以及驱动程序的使用教程可以看江协科技的视频：https://url.zeruns.com/L7j6ySTM32使用硬件I2C读取SHTC3温湿度传感器：https://blog.zeruns.com/archives/692.html移植好U8g2图形库的STM32F407标准库工程模板：https://blog.zeruns.com/archives/722.html基于STM32F1的0.96寸OLED显示屏驱动程序，支持硬件/软件I2C：https://blog.zeruns.com/archives/769.html电子/单片机技术交流群：2169025065效果图I2C协议简介I2C 通讯协议(Inter－Integrated Circuit)是由 Phiilps 公司开发的，由于它引脚少，硬件实现简单，可扩展性强，不需要 USART、CAN 等通讯协议的外部收发设备（那些电平转化芯片），现在被广泛地使用在系统内多个集成电路(IC)间的通讯。I2C只有一跟数据总线 SDA(Serial Data Line)，串行数据总线，只能一位一位的发送数据，属于串行通信，采用半双工通信。半双工通信：可以实现双向的通信，但不能在两个方向上同时进行，必须轮流交替进行，其实也可以理解成一种可以切换方向的单工通信，同一时刻必须只能一个方向传输，只需一根数据线。对于I2C通讯协议把它分为物理层和协议层物理层规定通讯系统中具有机械、电子功能部分的特性（硬件部分），确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑，统一收发双方的数据打包、解包标准（软件层面）。I2C物理层I2C 通讯设备之间的常用连接方式(1) 它是一个支持多设备的总线。“总线”指多个设备共用的信号线。在一个 I2C 通讯总线中，可连接多个 I2C 通讯设备，支持多个通讯主机及多个通讯从机。(2) 一个 I2C 总线只使用两条总线线路，一条双向串行数据线SDA（Serial Data Line ），一条串行时钟线SCL（Serial Clock Line ）。数据线即用来表示数据，时钟线用于数据收发同步(3) 总线通过上拉电阻接到电源。当 I2C 设备空闲时会输出高阻态，而当所有设备都空闲，都输出高阻态时，由上拉电阻把总线拉成高电平。I2C通信时单片机GPIO口必须设置为开漏输出，否则可能会造成短路。关于更多STM32的I2C相关信息和使用方法可以看这篇文章：https://url.zeruns.com/JC0Ah还有江协科技的STM32入门教程：https://www.bilibili.com/video/BV1th411z7sn?p=31我这里就不详细讲解了。使用说明默认是使用硬件IIC的，用的I2C3，SCL是PA8，SDA是PC9。硬件I2CSTM32CubeMX配置，找到你要用的I2C外设的引脚，并设置引脚功能为SCL和SDA，如下图所示是I2C3的SCL。接着配置I2C外设，启用对应的I2C外设，速度模式设置为 Fast Mode Plus，速度改成 1000，其他默认就行。配置GPIO，上面设置完后会自动把那两个引脚配置为复用开漏输出模式，接着只需要把IO输出速度改成 Very High ，还有GPIO标签(User Label)定义分别改成I2C3_SCL和I2C3_SDA就行，如果是用的别的I2C也可以设置成别的值，代码对应处要修改一下。改完后点击生成代码。OLED.c文件里，将 #define OLED_USE_SW_I2C 注释掉，将 #define OLED_USE_HW_I2C 取消注释，如果你用的是别的引脚作为I2C引脚，并且定义了别的名字那就将代码里的 I2C3_SCL 和 I2C3_SDA 也改一下。软件I2CSTM32CubeMX配置，设置两个…