LLC软件代码分析
LLC硬件框架与底层软件架构深度解析
LLC硬件框架与底层软件架构深度解析
在现代大功率数字开关电源设计中,LLC 谐振变换器因其高效率、高功率密度以及优异的软开关特性而被广泛应用。本章将以 TMS320F28034 微控制器为核心,详细拆解全桥 LLC 变换器的底层硬件信号连接拓扑与中断驱动式的软件工程架构。
硬件框架与端口配置说明
数字电源的核心在于通过 DSP(数字信号处理器)对模拟电路进行高频采样与精准的脉冲控制。基于 TMS320F28034 控制的全桥 LLC 整体硬件框架及其信号连接关系如下图所示。
如上图所示,图中清晰标出了 TMS320F28034 控制器与全桥 LLC 主功率电路、以及辅助电路(如与 PFC 级的信息交互逻辑)的信号物理连接定义。为了方便软件底层配置,我们将控制板上 TMS320F28034 控制器的端口复用功能进行了详细梳理,具体分配情况如下表所示:
| 信号名称 | 内容定义 | 控制板信号引脚 | 硬件说明与功能解析 |
|---|---|---|---|
| ADC_VOUT | 输出电压信号 | ADCINA0 | ADCA0通道:用于电压闭环控制的高频反馈采样。 |
| ADC_IOUT | 输出电流信号 | ADCINB0 | ADCB0通道:用于电流闭环及限流保护的反馈采样。 |
| ADC_VADJ | 调压/调流电位器信号 | ADCINA1 | ADCA1通道:读取外部模拟旋钮或电位器,设定输出基准。 |
| DC_MOS_T | 散热器温度信号1 | ADCINB1 | ADCB1通道:监控一次侧 MOSFET 散热器温度,用于过温降额或保护。 |
| DC_DIO_T | 散热器温度信号2 | ADCINA3 | ADCA3通道:监控二次侧整流二极管散热器温度。 |
| OCP | LLC电流信号(过流保护) | ADCINA2 | ADCA2通道:连接内部比较器,实现微秒级硬件快速过流封波保护。 |
| PWM1A | MOS驱动PWM信号 | PWM1A | ePWM模块1A通道:驱动全桥 LLC 桥臂功率管(如 Q1/Q4)。 |
| PWM1B | MOS驱动PWM信号 | PWM1B | ePWM模块1B通道:驱动全桥 LLC 桥臂功率管(如 Q2/Q3),与 1A 呈互补带死区输出。 |
| LED_G | 显示灯-绿灯控制信号 | GPIO32 | GPIO32口:用于指示系统正常运行状态。 |
| LED_Y | 显示灯-黄灯控制信号 | GPIO22 | GPIO22口:用于指示系统待机或警告状态。 |
| LED_R | 显示灯-红灯控制信号 | GPIO33 | GPIO33口:用于指示系统触发严重故障状态。 |
| I2C_SDA | I2C数据信号-OLED控制 | I2C1_SDA | I2C通信数据口:驱动外部液晶屏幕显示实时电压电流。 |
| I2C_SCL | I2C时钟信号-OLED控制 | I2C1_SCL | I2C通信时钟口:提供屏幕通信的同步时钟。 |
| CANRXA | CAN通信接收端 | CANRXA | CAN通信接收口:接入工业总线,接收上位机或其他模块指令。 |
| CANTXA | CAN通信发送端 | CANTXA | CAN通信发送口:向上位机广播 LLC 的实时运行状态与遥测数据。 |
| D_SCI_RXD | SCI通信接收信号 | SCIARXD | SCIA通信接收口:主要用于与前级 PFC 控制板进行数据与状态握手。 |
| D_SCI_TXD | SCI通信发送信号 | SCIATXD | SCIA通信发送口:向 PFC 控制板发送 LLC 侧的负载与状态数据。 |
| PFC_OK | PFC状态IO口信号 | GPIO24 | GPIO24口:硬线握手信号。仅当 PFC 侧母线电压建立并稳定后,才允许 LLC 启动抽电。 |
整体软件架构与中断嵌套机制说明
为了极大简化系统软件架构的时间轴管理,同时增加软件系统的可维护性与可移植性,本系统摒弃了低效的前后台轮询模式,转而采用了以中断事件触发为核心思想的高实时性软件设计方案。
整体 LLC 的软件系统架构与中断优先级分布如下图 1.2 所示:
系统运行总览与多任务机制:
- 系统初始化与主循环: LLC 控制器在初次上电或硬件复位后,首先集中执行 DSP 所有底层硬件外设的初始化,并配置打开各组模块功能所需的中断使能。随后,程序跳转并陷入一个无尽的
for死循环中。这个主循环专门用于处理那些时间资源占比大但对实时性要求不高的后台程序,例如 OLED 液晶显示屏的点阵刷新程序与 CAN 报文的主体打包程序。 - 四大核心中断(按优先级由高到低):
- 50kHz 中断 (核心环路):承担微秒级的闭环控制,优先级绝对最高。
- 200Hz 中断 (状态机与慢保护):承担毫秒级的全局状态调度。
- SCI 接收中断:负责 PFC 级间通信的字节接收。
- CAN 接收中断:负责总线数据的底层拦截。
- 中断嵌套机制(Interrupt Nesting): 整个软件系统在运行过程中均开启了中断嵌套功能。这意味着,优先级最高的中断(如 50kHz 控制环路)可以在任意时刻强势打断正在执行的低优先级中断(如 200Hz 状态机或通信中断),确保电源的高频发波控制不会因为串口通信等杂务而产生致命的延迟失控。
- 通信中断的减负设计: 值得特别注意的是,为了合理珍惜宝贵的高频中断 CPU 资源,在 SCI 接收中断和 CAN 接收中断内,程序仅仅只对硬件接收到的数据字节进行快速转存(Buffer 缓存)处理,绝对不在此处进行复杂的数据解析与操作。真正的数据校验与逻辑处理全部下放回主函数的
for循环或慢速中断中执行。
工程文件拆解与核心函数全景图
优秀的软件架构不仅体现在运行逻辑上,也体现在工程文件的模块化解耦设计上。本设计遵循了规范简易原则,将不同频率、不同功能的操作严格封装在对应的源文件中。下表为整个 LLC 控制工程的文件划分定义与功能速览:
核心源文件与头文件清单
| 文件名 | 核心使命与功能说明 |
|---|---|
| main.c | 主函数文件:负责硬件初始化配置,并持有主函数无限循环(调度 OLED 刷新与 CAN 通信等非时敏任务)。 |
| ISR1.c / ISR1.h | 50kHz 核心中断文件:这是电源的灵魂。包含高速采样数据获取、电压/电流环路运算、Burst (打嗝) 模式控制、参考指令计算、PWM 寄存器底层刷新以及致命错误的快速保护函数。头文件包含相关高频宏定义。 |
| ISR2.c / ISR2.h | 200Hz 慢速中断文件:统筹大局。包含系统的慢速保护判别、LLC 主运行状态机(FSM)、输出参考电压的爬坡与计算、SCI 发送调度以及状态指示灯的点亮逻辑。 |
| SCIcom.c / SCIcom.h | SCI 通信模块:处理与前级 PFC 控制器的交互,包含硬件接收中断、通信状态机处理、数据打包与发送。 |
| CANcom.c / CANcom.h | CAN 总线通信模块:包含 CAN 底层初始化、邮箱接收中断、CAN 主业务流程序及报文发送。 |
| Function.c / .h | 多功能工具函数合集:包含细化的状态机各分支处理函数、电流底层偏置校准函数、以及各种保护逻辑(OVP过压、OCP过流、OTP过温等)的具体实现。 |
重点模块函数功能详细定义
为了后续代码分析的连贯性,以下将对各个文件中的关键函数 API 及其控制论功能进行深度解析说明:
【系统总控与配置:main.c】
main():工程总入口,串联所有初始化并启动系统大循环。SysCtrlInit():配置 DSP 内部 PLL、看门狗及高速系统时钟。Timer0Init():配置硬件 CPU 定时器 0,以 20us 为周期触发 50kHz 的核心闭环控制中断。Timer1Init():配置硬件 CPU 定时器 1,以 5ms 为周期触发 200Hz 的全局状态机中断。GPIOInit()/ePWMInit()/ADCInit():底层片上外设引脚与功能模块的初始化映射。ePWMDebugInit():特殊的调试配置,利用 ePWM 的 4A 通道经过 RC 滤波模拟 DAC 输出,便于在示波器上实时观察系统内部环路变量。TZInit():Trip-Zone(错误联锁)事件初始化。极其关键的底层硬件保护配置,利用比较器捕捉过流毛刺,能在不经过 CPU 运算的情况下直接物理封锁 PWM 脉冲。
【极速控制环路:ISR1.c (50kHz)】
ISR_20US():20us 中断服务程序的总入口。ADCSample():从 ADC 结果寄存器中提取电压、电流及温度的原始数字量并做一次滤波整理。VILoopCtl()/IloopCtl():执行数字 PI/PID 差分方程,完成恒压(CV)或恒流(CC)模式的闭环频率计算。BurstCtl():轻载打嗝模式控制。当系统空载时,为防止 LLC 频率跑飞引发失控,间歇性地关闭和开启发波以维持极低的输出能量。RegReflash():将环路计算得出的开关周期变量,换算并写入真实的 ePWM 周期寄存器中。FastProtection():快速软件保护。针对无需等待滤波确认的恶劣过流/过压,执行即刻关机。
【全局状态调度:ISR2.c (200Hz)】
ISR_200Hz():5ms 定时中断总入口。StateM():有限状态机枢纽,调度电源的软启动、空闲、运行与故障跳转。VrefGet():慢速参考基准生成。例如在恒流/恒压切换,或者接收到上位机调压指令时,对目标参考值进行渐变限制,避免阶跃扰动。SlowP():慢速保护判定。例如温度保护等需要长时间滤波防抖的故障捕捉。
【核心业务与保护实现:Function.c】
StateMInit()/StateMWait()/StateMRise()/StateMRun()/StateMErr():分别对应状态机中的五大核心节点:上电初始化、待机等 PFC 就绪、闭环软启动爬坡、稳态输出、以及故障死锁封波。ValInit():清空所有历史积分与运行标志。HwOpp()/SwOCP()/ShortOff():谐振电流过大、软件过流及深度短路的三级阶梯式保护实现。SwUVP()/SwOVP()/SwOTP():电压跌落、输出过充与散热器过温的判定逻辑。CANLost():通讯超时看门狗。若长时间未收到上位机心跳包,系统将自动降额或安全停机。
【内外层通信:SCIcom.c & CANcom.c】
ISR_SCI()/sMailboxISR():纯粹的字节或数据帧拦截转存中断,剥离复杂运算。MesStore()/CANMessage():在后台大循环或慢速中断中被调用,对收集到的原始缓冲数据进行解包、校验(Checksum/CRC)、以及指令意图翻译。SetCmdUpdate():将校验通过的上位机设定值(如目标电压、限流点)安全地更新进入 LLC 主控内存。FrameBuild()/SciCom()/CANTx():将电源自身的温度、电压、电流状态打包为标准帧格式,向网络主动广播或应答。
LLC初始化-中断,时钟,定时器配置
LLC初始化-中断,时钟,定时器配置
DSP 的所有高级数字控制功能均基于控制器内部的各类硬件外设模块运行。因此,在系统上电或硬件复位的情况下,首要任务就是先对 DSP 的全局时钟、中断向量表以及底层外设进行严格的初始化配置。
需要特别指出的是,TMS320F28034 芯片在上电后,看门狗(Watchdog)默认是关闭的状态。这就为我们从容地进行各项复杂的初始化赢得了时间,而无需在初始化早期频繁地去“喂狗”。
本章将详细拆解 LLC 程序的初始化主流程、60MHz 核心时钟的倍频与锁存过程,以及产生 50kHz 和 200Hz 核心调度时基的定时器配置。
初始化配置流程与系统主循环
LLC 程序整体初始化函数配置逻辑如下图所示:
在完成了繁杂的底层硬件寄存器配置后,主函数 main() 会进入一个死循环(for(;;))。
值得注意的是,主程序中的这个 for 循环,主要用以处理那些耗时资源比较多的后台程序。例如,每 300 毫秒去刷新一次 OLED 液晶显示屏、处理 CAN 总线接收到的海量数据、以及定时发送模块的状态信息等非时间敏感型任务。
主函数与核心中断代码展示
1 |
|
高速环路与慢速状态机中断的入口函数定义如下:
1 | /** =================================================================== |
核心系统时钟初始化 (SysCtrlInit)
配置 TMS320F28034 的时钟功能,是为了给芯片内部对应的高速与低速模块提供精准、同步对应的时钟信号。这也是 DSP 能够以 60MHz 狂飙运行的基础。
控制器的晶振与时钟功能配置过程极为严谨,步骤如下:
- 时钟预矫正: 调用厂家固化的矫正时钟信号函数,在这之前必须先使能 ADC 时钟信号,矫正完成后再安全关闭 ADC 时钟。
- 源时钟选择: 禁用外部时钟输出功能;使用片内的内部晶振 1(INTOSC1)作为系统时钟 1 源;系统时钟 2 使用外部时钟(实际在本板上不起作用)。
- 看门狗与定时器配置: 看门狗使用内部时钟 1;CPU 定时器 2 同样使用内部时钟 1 且配置为 CPU 定时器 2 不分频。
- 振荡器启停管理: 彻底使能内部晶振 1(时钟 1);在仿真器暂停(Debug)时,配置为时钟 1 信号暂停;主动关闭内部晶振 2 及禁止外部晶振和外部时钟输入功能以降低功耗并提高抗干扰能力;暂停时,看门狗时钟信号暂停(实际项目中并未开启看门狗复位功能)。
- 安全保护: 时钟丢失时,配置为立即无延时复位(默认安全策略)。
- PLL(锁相环)倍频设置: 这是提速的关键步骤。
- 先确认系统时钟正常,如果检测到系统时钟丢失将停止 PLL 设置,直接陷入急停保护。
- 确保 PLL 分频为 0,如果非 0 则将其写 0。
- 关闭丢失时钟检测,防止在 PLL 切换频率的瞬间被硬件误判为时钟丢失而报错。
- 配置系统时钟为 60MHz:已知内部基础时钟 $CLKIN = 10\text{MHz}$,将其进行 6 倍频设置:$CLKIN \times 6 = 60\text{MHz}$。
- CPU 原地一直等待,直到 PLL 时钟锁定(Lock)标志位置位。
- 重新开启丢失时钟检测。
- 设置分频器为 1(DIVSEL=3 对应不分频),最终输出核心频率:$\frac{CLKIN \times 6}{1} = 60\text{MHz}$,即 $SYSCLKOUT = 60\text{MHz}$。
- 外设时钟精细化裁剪: 开启所需外设时钟(开启 ADC、ePWM1、ePWM4、定时器0、定时器1、比较器1、CAN 通信及 SCI 通信时钟);对于其余不需要的时钟信号全部予以关闭,以减少内部开关噪声并降低芯片发热。
1 | void SysCtrlInit(void) |
定时器(时基)模块初始化配置
DSP 内部集成了 3 个 32 位的 CPU 级硬件定时器(Timer0, Timer1, Timer2)。本 LLC 框架利用 Timer0 生成高速采样环路,利用 Timer1 生成低速状态机。
定时器 0 初始化 (Timer0Init)
定时器 0 被配置为执行超高优先级的系统控制中断。代码逻辑设定其产生 50kHz(周期为 20us)的中断。
其底层寄存器装载推导与配置过程如下:
- 先关闭定时器 0 并清除其积压的中断标志位。
- 将其基础预分频配置为不分频(分频系数 1,即 0x1),时钟分频等于
TPR+1;此时TDDR寄存器置为 0。 - 以 $60\text{MHz}$ 为时基,欲产生 $50\text{kHz}$ 的溢出中断,计算周期重载值寄存器(
PRD)的数学公式如下:将 1200 转换为十六进制即为0x4B0。 - 将
PRD数据载入定时模块(TIM),将TDDR数据载入预分频计数器(PSC),最后将 Timer0 的硬件中断使能正式开启。
定时器 1 初始化 (Timer1Init)
定时器 1 用以产生 200Hz(周期为 5mS)的慢速状态机中断。
其配置过程如下:
- 同样先关闭定时器 1 并清除其中断标志位。
- 为了获得更长的定时时间,将其底层配置为分频 30。时钟分频等于
TPR+1,因此将TDDR寄存器配置为 29(十六进制0x1D)。 - 以 $60\text{MHz}$ 经过 30 分频后,欲产生 $200\text{Hz}$ 的中断,计算重载值
PRD如下:将 10000 转换为十六进制即为0x2710。 - 将数据重载入底层寄存器,并开启 Timer1 的中断使能。
1 | /***************************************************************************** |
LLC初始化-PWM初始化与发波机制
LLC初始化-PWM初始化与发波机制
在 LLC 谐振变换器的数字控制系统中,PWM(脉宽调制)的配置是整个电源驱动的核心。与传统的定频调宽控制不同,LLC 控制为变频控制方式(PFM)。在闭环调节的过程中,PWM 频率时刻变化,即定时器的周期值时刻变化,而占空比必须时刻保持 50% 以保证变压器的磁通平衡。
本章将详细解析如何配置 ePWM 模块来满足 LLC 的发波需求,并重点介绍如何通过中心点对齐技术实现无噪声的 ADC 采样触发。
PWM发波方式与 ADC 无噪触发机制
系统配置了 ePWM1 的 1A 和 1B 互补通道,用以控制输出全桥 LLC 的 PWM 波形产生。
为了实现 50% 占空比并灵活调节频率,配置 ePWM1 发波计数使用上升下降载波模式(Up-Down Count Mode)。在该模式下,计数器从 0 开始向上计数至周期寄存器(PRD)的值,然后再向下倒数回 0。通过调整对应的周期量大小即可实现不同输出 PWM 频率,同时保证占空比完美锁定在 50%。
ADC 采样触发的艺术:
在大功率高频开关电源中,MOS 管开通和关断的瞬间会产生极大的开关噪声。为了获取最纯净的反馈信号,系统配置在每个 ePWM 开关周期的中心点(即计数器达到顶点 PRD 时)触发 ADC 采样输出电压电流等参数。此时 MOS 管处于稳定的导通或关断状态,从而完美避免 PWM 开通关断的瞬间干扰影响采样精准性。
发波方式与 ADC 触发逻辑的波形对应关系如下图所示:
ePWM 初始化具体配置逻辑解析
根据 LLC 的控制要求,EPWMInit() 函数完成了从引脚复用到死区注入的全流程配置。其具体配置方式与设计意图如下:
- 引脚安全初始化:
- GPIO0-EPWM1A-预先设置为普通IO。
- GPIO1-EPWM1B-预先设置为普通IO。
- GPIO0-EPWM1A-预先设置为输出。
- GPIO1-EPWM1B-预先设置为输出。
- GPIO0-EPWM1A-拉低。
- GPIO1-EPWM1B-拉低。
- 解释:在 PWM 模块完全配置好之前,先将引脚作为普通 GPIO 并强行拉低,防止在上电瞬间输出不可控的随机脉冲导致桥臂直通短路。
- 时基与频率设定:
- 配置周期值,初始设定为 150kHz,计数上升下降方式计算公式为:
EPwm1Regs.TBPRD=60M/150K/2=200。 - 不相移,计数器与时钟信号同步。
- 计数采用上升下降模式。
- 禁用相移功能,配置为 Master 方式。
- 周期寄存器使用镜像寄存器(Shadow),不立即使用,防止变频时波形错乱。
- 同步模式,同步信号来自系统时钟,且在计数器为 0 时同步。
- 相移后,Count UP 模式。
- 使用系统时钟作为 TB 信号时钟,不分频。
- 配置周期值,初始设定为 150kHz,计数上升下降方式计算公式为:
- 占空比与动作限定(Action Qualifier):
- CMPA 寄存器使用镜像模式。
- CMPB 寄存器使用镜像模式。
- 当 CTR = 0 时,将 CMPA 镜像中的数据加载到 CMPA 执行寄存器中。
- 当 CTR = 0 时,将 CMPB 镜像中的数据加载到 CMPA (CMPB) 执行寄存器中。
- 向上计数时,当计数器=CMPA 时,Epwm1A 置高电平。
- 向下计数时,当计数器=CMPA 时,Epwm1A 置低电平。
- 配置 CMPA 初始值为 100,由于 TBPRD 为 200,刚好实现占空比为 50%。
- 死区时间(Dead-Band)配置:
- 使能死区功能。
- 上升沿延迟器输出端口不翻转,下升沿延迟器输出端口翻转,形成标准的互补驱动。
- 初始化下降沿延时 150 个时钟周期。
- 初始化上升沿延时 150 个时钟周期。
- ADC 采样触发配置:
- 使能 SOCA 触发功能。
- 当计数器等于周期值(CTR=PRD,即周期中心点)时触发 ADC 采样。
- 配置为单次触发模式。
对应的 C 语言实现代码
1 | /***************************************************************************** |
PWM 安全使能与硬核截断机制
在控制逻辑中,电源的启动与保护停机不仅需要停止软件的 PID 运算,更需要在物理引脚层面进行发波的开启与硬核截断。本代码通过操作 GPIO 的复用开关(MUX)来实现这一点,这种方式比单纯修改占空比更为安全可靠。
1 | /* |
LLC初始化-ADC初始化、TZ硬件保护与通信配置
LLC初始化-ADC初始化、TZ硬件保护与通信配置
在数字 LLC 谐振变换器中,软件的运算速度再快也存在执行周期的延迟。为了应对极其恶劣的短路或过流工况,必须依赖片上比较器构成的纯硬件联锁保护(Trip-Zone, TZ)来实现纳秒级的封波响应。
同时,精准的高频 ADC 采样、与前级 PFC 通信的 SCI 串口,以及用于调试监测的 PWM-DAC 外设,都是支撑系统稳健运行的重要基石。本章将对这些模块的底层初始化过程与核心计算原理进行深度解析。
TZ(Trip-Zone)硬件过流保护初始化
LLC 控制具有卸载电流硬件过流快速关闭 PWM 的功能。这种保护机制完全绕过 CPU 软件运算,通过底层的事件触发 TZ 模块直接关闭 PWM 脉冲输出,从而最大限度保护功率器件。
TZ 与比较器硬件协同机制
LLC 的原边谐振电流经过互感器或采样电阻变换并经过 RC 滤波后,直接送入 DSP 内置的模拟比较器(COMP1)的正相端,与内部 DAC 产生的基准电压进行实时比较。
当电流转换量(尖峰瞬态)大于 DAC 设定的基准电压门限时,比较器输出状态瞬间翻转,该电平变化直接产生 TZ 事件信号,立刻切断 ePWM 发波。
其底层硬件信号的配合逻辑如下图所示:
核心参数:DACVAL 保护点计算的物理推导
在代码中,有一行极其关键的初始化赋值:Comp1Regs.DACVAL.bit.DACVAL = 500;。这个 500 是如何映射到物理原边谐振电流的保护点呢?
DSP 内部的 DAC 为 10 位精度,其最大数字量为 $1024$(对应 $2^{10}$),满量程基准电压为 $3.3\text{V}$。
外部电流采样调理电路中,等效的电流-电压转换放大比可以推导为一个乘除系数(即除以 100 再乘以 300,代表外围互感变比与采样电阻运放增益的综合)。
因此,当 DACVAL = 500 时,对应的原边电流初始保护点计算公式如下:
即系统的初始硬件限流点被设定为 4.834A。
若需要将保护点提升至硬件允许的最大极限值,可以将设定值改为 672,代入相同的换算公式:
这里的 6.497A 就是物理硬件层面允许通过的绝对保护电流最大值,而程序中初始化的 500(即 4.834A)是一个保守、安全的初始设定保护值,后续可根据工况动态调整。
TZInit 代码逐行精析
根据系统设计,比较器 1 与 PWM TZ 的初始化配置流程被严格落实于代码中:
1 | /***************************************************************************** |
调试用 PWM-DAC 初始化 (ePWMDebugInit)
在复杂的数字环路调试中,通过 CCS 观察变量往往不够直观。工程中巧妙地将未使用的 ePWM4A 配置为 200kHz 的高频 PWM 输出,并经外部两级 RC 滤波后,将其转化为平滑的模拟电压,用以模拟 DAC 输出,非常方便在示波器上实时观察系统内部隐变量的变化轨迹。
1 | /***************************************************************************** |
ADC 初始化与同步采样配置 (ADCInit)
为了精确控制 LLC 的恒压与恒流,必须配合 EPWM1 模块中心对齐触发 ADC 采样,并在采样完成后触发高频控制中断进行数据处理。
ADC 配置的核心难点在于多通道数据的同步性。为此,程序采用了双通道同时采样模式(Simultaneous Sampling),一次触发获取两路相互绑定的关联数据。
1 | /***************************************************************************** |
这些采样完成的数据最终在定时触发的高频控制中断 ISR_20US 中被集中调用和处理,如下所示,采样函数直接供给后续的 PI 闭环运算:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
__interrupt void ISR_20US(void)
{
PWMDAC(SADC.IoutOffset); // 刷新调试 DAC
// ADC采样函数,读取刚才配置好的各个 SOC 通道结果寄存器信息
ADCSample();
VLoopCtlPI(); // PI电压环环路计算
BurstCtl(); // 空载或轻载情况的 Burst 打嗝控制
RegReflash(); // PWM 频率与周期更新
FastProtection();// 模块快速保护函数检测
CpuTimer0Regs.TCR.bit.TIF = 1; // 清除中断标志位
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
1 | __interrupt void ISR_20US(void) |
SCI(串口通信)初始化配置 (SCIInit)
作为一个协同工作的系统,LLC 控制级往往需要与前级 PFC 通信交互(如接收 PFC 的母线电压建立信号,并上报 LLC 的工作状态)。系统选用了 SCI(串行通信接口)来进行内部级联。
波特率的计算公式为:
已知系统时钟为 60MHz,低速外设预分频(LOSPCP)默认为 4(即 15MHz LSPCLK),配置 BRR(即 SCIHBAUD 与 SCILBAUD 组成的 16位 寄存器)为 0x0186 (十进制 390),则波特率为:
1 | /***************************************************************************** |
ADC数据采集和数字量转换
ADC数据采集和数字量转换
在数字控制系统中,DSP 必须通过模数转换器(ADC)将外部的模拟电压、电流及温度等物理量转化为内部可运算的数字标幺值。为了保证实时控制的高速性与稳定性,整个 LLC 系统的核心计算全部分布在最高优先级的 20μs 定时中断中。
本章将详细解析 20μs 高频中断的调度逻辑、采样数据的滤波处理、底层 Q 格式的数据重定标机制,以及关键的输出电压、输出电流外围硬件转换电路和数字推导过程。
20μs 中断核心控制流 (ISR_20US)
程序运行含有定时 20μs 中断和 5ms 中断。其中 20μs 中断优先级最高,主要对模块相关参数采样、电压电流环路计算及 PWM 寄存器更新、Burst 控制、快速保护功能等核心操作进行调度;而 5ms 中断优先级为较低,主要执行状态机运行和一些辅助保护功能。
20μs 整体中断程序流程图如下图所示:
在 20μs 中断中,软件依次对输出电压、输出电流、滑动变阻器电压,散热器温度数据进行采样和求平均。根据所采样的电流电压值进行环路计算得到对应 PWM 周期量(控制频率),并更新 PWM 周期寄存器。在空载或轻载的情况下使用 Burst 控制(打嗝控制)。同时比较器检测原边电流,当原边谐振电流较大时,比较器翻转,通过 TZ 信号快速关闭 PWM,保护机器。
对应的代码实现如下:
1 | /** =================================================================== |
ADC 采样数据结构体与转换函数
采样数据结构定义
为了对全系统的模拟量进行统一的高效管理,代码中定义了一个集中存储 ADC 采样值及滤波结果的结构体 _ADI:
1 | struct _ADI |
采样与标幺化处理 (ADCSample)
该函数主要在 50kHz 发生中断后执行,从 ADC 采样结果寄存器中转存数据至对应定义的结构体变量中(ADC自动在 PWM 周期值处触发采样并将结果保存于 ADC 结果寄存器中)。
在数据处理过程中,有两个极为关键的工程优化:
- Q 格式精度的统一提升:由于 DSP 内部的 ADC 是 12 位的硬件模块(满量程为 4096),而控制环路为了保证极高的调节精度,统一采用 Q15 格式计算。因此,为了统一计算标量,程序将所有 Q12 的采样值均左移 3 位(
<<3)转换成 Q15 位数据。即原先 3.3V 对应数字量 4096,变换成了 3.3V 对应 32767。 - 零偏消除与滑动滤波:SADC.Iout 为输出电流采样值,同时减去 SADC.IoutOffset 为输出电流偏置值,对应硬件电路上的 0.877V,同时对处理后的电流采样值进行小于零限制(抗负漂移)。最后,对输出电压采样值和输出电流采样值进行滑动求平均值以熨平电磁噪声。
1 | /* |
LLC 工作参数与常规数字量定义
在代码计算之前,我们需要确定系统的基础频率和电压电流基准。相关的全局数学参数定义如下:
常规数字量(Q格式缩放倍数)定义:
LLC 工作整体参数定义:
- 定义 LLC 的输出最高电压与最低电压为:
- 定义 LLC 的输出最大电流为:
- 定义 LLC 的工作开关频率的谐振频率,最高频率,最低频率为:
- 定义控制器的核心主频为:
由于 PWM 采用上升下降(Up-Down)计数方式,开关频率与定时器周期寄存器 Period 的映射关系公式为:
根据此公式,可求得各极限频率对应的开关周期数字量:
- 谐振频率对应周期:
- 最低频率对应最大周期:
- 最高频率对应最小周期:
- 举例,当频率为 $100kHz$ 时,对应的开关周期数字量为:
输出电压转换与标幺化计算
由于高压无法直接送入 DSP 的 ADC 端口,必须经过硬件分压电阻网络进行衰减。输出电压采样调理电路如下:
定义输出电压取样电路的硬件分压电阻分别为:
定义 DSP 能够采集到的最高基准电压为:
根据串联分压原理可知,当 ADC 端口电压达到满量程 $3.3V$ 时,反推 DSP 能够采集到系统输出的最高极值电压为:
在代码中,我们以 Q15 格式(放大 32768 倍)来表示模拟小数。则任意时刻真实的物理输出电压 $V_o$ 对应的 DSP 数字量函数关系为:
举例说明,当系统真实输出电压为 $40V$ 时,经过分压和转换后,DSP 内部读取并转为 Q15 格式的数字量为:
输出电流转换与标幺化计算
对于负载大电流,系统使用锰铜微欧电阻进行检流,并送入高精密运算放大器构建零偏置差分放大网络,最终送入 ADC。由于单端 ADC 无法采集负电流,且存在硬件底噪,硬件设计时特意引入了一个正向偏置。
电流采样调理电路如下:
设计使用运放的 1 通道构建零偏置电压,定义偏置电路的电阻参数为:
根据分压公式,计算硬件强制抬升的基准偏置电压为:
(注:根据元器件离散公差,部分批次硬件的实际量测偏置值在0.767V至0.877V附近,软件中最终对应的 IoutOffset 就是在扣除此固定的直流垫底偏置。)
定义主干路串联的输出电流取样检流电阻为:
定义输出电流差分放大电路的反馈与输入电阻为:
则核心差分电流变换的运放闭环放大增益为:
根据差分变换电路增益、采样电阻,以及 DSP 满量程标定电压 $3.3V$,则可推算出电路不溢出的输出电流最大硬件物理采样值为:
定义 Q15 数据为 DSP 最大量程电压数字量(对应 $3.3V$ 满偏),则剥离掉偏置后,任意负载电流 $I_o$ 转换到 DSP 内部的纯电流数字量函数关系为:
举例说明,当系统实际带载输出电流为 $5A$ 时,其对应的 DSP 内部数字量计算值为:
LLC输出限流环路与电压环路解析
LLC输出限流环路与电压环路解析
在 LLC 谐振变换器的数字控制中,为了保证电源在各种极端负载条件下的安全运行,闭环控制策略不仅需要精确调节输出电压,还需要对输出电流进行严格的限制。通常而言,电源均具有合理的输出电流范围,电源应当控制电源模块输出电流在合理的范围内,确保不过流或者因电流过大损坏模块。
本章将详细解析 LLC 闭环控制中“电压内环 + 限流外环”的双环架构,并对相关的 PI 控制代码进行深度的逐行剖析。
LLC 双环闭环控制逻辑架构
在分析限流环之前,我们首先定义整个 LLC 输出控制逻辑功能的宏观架构。整体 LLC 闭环控制由电压环(内环)与限流环(外环)组成,其中电压环内环为快速环,限流环外环为慢速环。
在单电压环运行情况下,参考电压与输出电压相减得到电压误差量,经电压环路计算后得到 LLC 控制量(周期值)。然而,若电源检测到输出电流过大时,限流环需动作用以限制输出电流。
由于对于特定情况下的输出电流与输出电压均成正比相关的情况,即可以通过控制使得输出电压降低的方式去限制输出电流,因此,若输出电流过大,可通过降低电压环参考电压值去减小模块输出电流。
其整体控制逻辑结构如下图所示:
正如上图所示,系统的初始参考电压值与限流环的输出相减,得到电压环的总参考电压:
- 未限流状态(正常带载):当模块输出电流小于参考电流时,配置限流环的输出限制为0,即此时限流环不起作用,系统表现为纯粹的恒压源。
- 限流状态(过载保护):当模块输出电流大于限流值时,限流环输出正值,即强制将电压环的参考电压降低,系统自动切换为恒流下垂特性。
为了要想系统具有稳定,限流环调节速度应当小于电压环调节速度,避免参考电压变化过快引起整体输出不稳定,程序中使用位置式 PI 控制方式设置限流环。
限流外环控制程序精析 (ILimitCtlPI)
限流环(外环)通过位置式 PI 算法计算出需要从参考电压中扣除的惩罚量(即限流压降)。其程序流程图如下:
下面是限流环 C 语言代码的深度解析:
1 | /* |
电压内环控制程序精析 (VLoopCtlPI)
电压内环是整个 LLC 调频发波的直接驱动者。它接收原始的参考电压,并主动扣除限流环传来的 Ilimit 惩罚量。
需要特别注意的是 LLC 的调频特性:频率越低,增益越高,输出能量越大。因此,当输出电压偏低需要增加能量时,程序实际上是在减小频率,也就是增加 PWM 的周期寄存器(Period)值。
下面是电压环 C 语言代码的深度解析:
1 | /* |
LLC未补偿前波特图获取与自制环路扫描仪设计
LLC未补偿前波特图获取与自制环路扫描仪设计
在设计 LLC 谐振变换器的闭环控制系统时,获取精确的被控对象传递函数(即未补偿前的系统模型)是设计补偿器 $G_c(s)$ 的大前提。
传统电源拓扑(如 BUCK、BOOST、反激、移相全桥等定频调宽的拓扑电路)由于是占空比控制,其小信号理论推导比较成熟,计算得到的模型也较为准确。但对于 LLC 拓扑而言,其控制量为频率,系统为变频系统(PFM),其小信号数学特性极难通过纯理论推导获得,且理论模型往往存在极大的误差和不准确度。
由于理论推导的传递函数不太准,所以在工程实践中,我们通常直接通过扫频实测的方法获取电源实际的伯德图(Bode Plot),然后再据此制作补偿器。
然而,市面上专业的环路扫频设备动辄十几万甚至几十万。因为买不起十几万的扫描仪,我们自己设计并搭建了这套低成本的“环路扫描仪”,利用普通的信号发生器和示波器,完美模拟了专业设备的扫频特性。
闭环控制主电路说明
首先,我们需要梳理清楚在闭环系统中,哪些环节属于“被控对象”,哪些环节属于“补偿器”。数字控制 LLC 闭环控制整体系统架构如下图 1 所示:
在上图的控制闭环中:
- 输入与输出:LLC 主电路的输入为前级提供的 $380\text{V}$ 直流母线,经 LLC 谐振主电路后,输出我们需要精准控制的直流电压 $V_o$。
- 信号采样调理:输出电压 $V_o$ 经分压转换网络 $H(s)$ 后,得到适合 DSP 采样的低压信号,该信号再经由 $R_1$ 和 $C_1$ 构成的 RC 低通滤波电路,滤除高频开关干扰后,送入 DSP 的 ADC 采样端口。
- 数字补偿器:$G_c(s)$ 为 DSP 内部我们需要专门设计的电压环补偿传递函数。经过 $G_c(s)$ 的 PI 计算后,得到 LLC 电路所需控制频率的开关周期量 $P_{ctl}$。
- 驱动发波:数字量 $P_{ctl}$ 经 DSP 内的 ePWM 模块后,生成 LLC 对应的特定频率 PWM 波形,驱动 LLC 主功率电路的 MOS 管运转。
核心思路:上图中的 $G_c(s)$ 为 DSP 内部需要设计的电压环补偿传递函数。设计和计算 $G_c(s)$ 必须对 LLC 主电路、分压转换电路、DSP 内部 ADC 采集模块和 ePWM 发波模块的整体综合特性进行分析。换句话说,我们需要获取除 $G_c(s)$ 以外的所有电路的开环传递函数特性,然后根据这根“未补偿曲线”,逆向设计出合理的 $G_c(s)$ 进行对消与补偿。
自制扫频结构与小信号注入原理
根据扫频获得传递函数特性的工作原理,我们可以使用一台普通的示波器和信号发生器,来模拟昂贵的扫频设备以获得 LLC 电路的传递函数特性。应用于该场合的整体扫频特性电路结构如下图 2 所示:
注入点的物理断开与信号合成
如上图所示,为了测试系统的响应,我们需要将闭环“打断”。操作方法是:将输出电压的分压转换电路 $H(s)$ 和 ADC 采样模块前端的 RC 滤波电路断开,并于 RC 滤波器的输入端手动注入人工控制信号。
此时,注入的控制信号必须由两部分叠加组成:
- 直流分量(DC 偏置):用以使得 LLC 主功率输出稳定在我们所需要测试的工作点(例如 $40\text{V}$ / $10\text{A}$ 稳态)。
- 交流分量(AC 扰动):通常为不同频率的纯正弦波输入,作为扫频的动态输入激励量。
直流偏置与数字基准换算
在本应用中,假设信号发生器注入信号中的直流分量设置为 $2\text{V}$,并期望此时 LLC 的输出电压恰好为 $40\text{V}$。
则注入的 $2\text{V}$ 电压进入 DSP 的 ADC 后,对应的内部数字量(以 Q15 格式,满量程 $3.3\text{V}$ 对应 $32768$)为:
根据先期设计的 LLC 宏观特性,当输出为 $40\text{V}$ 稳态时,其对应的 LLC 工作谐振频率刚好为 $50\text{kHz}$。此时 DSP 的定时器(主频 $60\text{MHz}$,上下计数模式)对应的控制量周期值 $P_{ctl}$ 为:
为了让注入的电压数字量与周期的数字量对应起来,我们在 DSP 内部人为串入一个比例系数 $K$。对应的 $K$ 值为(使用 Q15 代替小数运算):
即在 DSP 内部,开环映射的控制量(开关周期)表达式固定为:
通过这样的线性映射,我们只需调节注入控制信号中直流分量的大小,就等同于调整 $P_{ctl}$ 控制量,进而调整 LLC 所需要的输出电压。如上述描述:当调整直流分量为 $2\text{V}$ 时,$P_{ctl}$ 自动计算为 600,开关频率锁定为 $50\text{kHz}$,输出电压即稳定在 $40\text{V}$。
数据处理与波特图绘制
扫频法的本质是通过向待测试系统注入不同频率的小信号(交流分量),同时用示波器抓取待测试系统输出信号的动态响应(交流分量)。
通过计算不同频率下,注入小信号和系统输出小信号的幅值变比和相位时差,即可得到待测试系统的幅频特性和相频特性。
如上图所示,注入信号由信号发生器产生,并经过运放构成的信号跟随电路增强驱动能力。我们使用示波器的 CH1 和 CH2 通道,分别测量注入信号的交流分量和系统输出的交流分量(示波器必须设置为交流耦合采样方式,以忽略庞大的直流量)。
增益与相位计算实战验证
以某一特定频率点为例进行说明:将信号发生器输出的直流分量(偏置)设置为 $2\text{V}$,交流分量设置为纯正弦波,频率为 $2\text{kHz}$,峰峰值为 $400\text{mV}$,如下图 3 中 CH1(黄色波形)所示。
此时,LLC 电路在直流分量的作用下稳定工作于 $40\text{V}$ / $10\text{A}$ 的输出状态,但由于存在交流扰动的注入,输出电压也必然包含同频率的交流扰动分量,如下图 CH2(蓝色波形)所示。
从示波器中读取 CH1 和 CH2 的幅值和时间信息,我们可以开始进行波特图的数据核算:
增益曲线计算(Gain):
增益就是根据该频率点下,输出交流幅值对输入交流幅值的变比,再取以 10 为底的对数并乘以 20。根据测得数据,输出峰峰值为 $830\text{mV}$,输入峰峰值为 $400\text{mV}$,则系统的开环增益为:相位曲线计算(Phase):
相位曲线代表输出正弦波对输入正弦波的时间滞后角度。根据测得数据,CH1 和 CH2 波形之间的时间延时差为 $\Delta t = 210\mu\text{s}$。
因为测试频率为 $2\text{kHz}$,其完整周期为 $T = \frac{1}{2000}\text{s} = 500\mu\text{s}$,则对应的滞后相位角度为:
闭环模型还原注意事项
通过改变信号发生器的频率,依次调节需要注入小信号的不同频率点(如从 $10\text{Hz}$ 扫到 $10\text{kHz}$),重复上述计算,可得到 LLC 在不同频率注入信号下的增益和相位散点数据。将其连线,即可绘制出 LLC 被控对象的开环增益曲线与相位曲线(波特图),然后再根据这段曲线设计和计算 PI 或 补偿器 $G_c(s)$。
工程排坑注意:
本次手动注入测试得到的开环增益曲线与相位曲线,其物理路径仅仅是从 RC 滤波器前端到最终的输出电压。
这意味着,该测量模型并未包含输出端的分压转换网络 $H(s)$ 的衰减系数;同时,在 DSP 内部计算开关周期值时,我们人为加入了一个放大系数 $K$ 值。
因此,在最终推导真实的系统开环特性曲线用于补偿设计时,必须从测量结果中人工加上分压转换 $H(s)$ 的衰减,并除以系数 $K$ 值,方可还原出纯正的主功率级真实波特图。
闭环模型还原注意事项与多工况恶劣点补偿
在掌握了上述小信号注入与单点频率的计算方法后,我们只需通过改变信号发生器的频率,依次调节需要注入小信号的不同频率点(通常建议进行对数扫频,例如从 10Hz 扫到 10kHz),并重复上述的增益与相位计算,即可得到 LLC 在不同频率注入信号下的增益和相位散点数据。
将这些散点数据在半对数坐标系中连线,即可初步绘制出 LLC 被控对象的开环增益曲线与相位曲线(即初步的波特图)。随后,我们将根据这段曲线的穿越频率和相位裕度,来设计和计算 PI 或是更高级的补偿器 $G_c(s)$。
环路测量数据记录与实测展示
为了清晰地记录和处理庞大的扫频数据,工程上通常会建立如下的数据分析表。表格中详细记录了不同频率下的注入信号峰峰值(CH1)、输出扰动峰峰值(CH2)以及两者的时间延时,并利用公式自动计算出相位滞后与 dB 增益。
以下为我们实测的两组极限工况扫频数据完整记录:
工况一:额定输入380V,满载输出 40V/10A
| 运行工况 | 小信号频率f(Hz) | 小信号峰峰值/mV | CH1(mV) | CH2(mV) | 延时/us | 对应示波器图 | 相位计算 | 增益计算 | 增益(db) |
|---|---|---|---|---|---|---|---|---|---|
| 额定输入380V 输出40V/10A | 50 | 400 | 400 | 5640 | 1 | tek00000 | 0.018 | 14.1 | 22.98 |
| 100 | 400 | 400 | 5520 | 1 | tek00001 | 0.036 | 13.8 | 22.80 | |
| 200 | 400 | 400 | 5760 | 110 | tek00002 | 7.92 | 14.4 | 23.17 | |
| 400 | 400 | 400 | 5800 | 284 | tek00015 | 40.896 | 14.5 | 23.23 | |
| 600 | 400 | 400 | 3760 | 364 | tek00014 | 78.624 | 9.4 | 19.46 | |
| 800 | 400 | 400 | 3440 | 380 | tek00013 | 109.44 | 8.6 | 18.69 | |
| 1000 | 400 | 400 | 3120 | 356 | tek00003 | 128.16 | 7.8 | 17.84 | |
| 2000 | 400 | 400 | 830 | 210 | tek00004 | 151.2 | 2.075 | 6.34 | |
| 3000 | 400 | 400 | 368 | 114 | tek00005 | 123.12 | 0.92 | -0.72 | |
| 4000 | 400 | 400 | 372 | 136 | tek00006 | 195.84 | 0.93 | -0.63 | |
| 5000 | 400 | 400 | 404 | 125 | tek00007 | 225 | 1.01 | 0.09 | |
| 6000 | 400 | 400 | 164 | 92 | tek00008 | 198.72 | 0.41 | -7.74 | |
| 7000 | 400 | 400 | 154 | 98 | tek00009 | 246.96 | 0.385 | -8.29 | |
| 8000 | 400 | 400 | 112 | 84 | tek00010 | 241.92 | 0.28 | -11.06 | |
| 9000 | 400 | 400 | 146 | 92.8 | tek00011 | 300.672 | 0.365 | -8.75 | |
| 10000 | 400 | 400 | 72 | 74.8 | tek00012 | 269.28 | 0.18 | -14.89 |
工况二:额定输入380V,轻载/降压输出 25V/10A
| 运行工况 | 小信号频率f(Hz) | 小信号峰峰值/mV | CH1(mV) | CH2(mV) | 延时/us | 对应示波器图 | 相位计算 | 增益计算 | 增益(db) |
|---|---|---|---|---|---|---|---|---|---|
| 额定输入380V 输出25V/10A | 50 | 400 | 400 | 7440 | 2120 | tek00016 | 38.16 | 18.6 | 25.39 |
| 100 | 400 | 400 | 4440 | 1600 | tek00017 | 57.6 | 11.1 | 20.91 | |
| 200 | 400 | 400 | 2340 | 900 | tek00018 | 64.8 | 5.85 | 15.34 | |
| 400 | 400 | 400 | 1200 | 500 | tek00019 | 72 | 3 | 9.54 | |
| 600 | 400 | 400 | 800 | 324 | tek00020 | 69.984 | 2 | 6.02 | |
| 800 | 400 | 400 | 640 | 272 | tek00021 | 78.336 | 1.6 | 4.08 | |
| 1000 | 400 | 400 | 488 | 200 | tek00022 | 72 | 1.22 | 1.73 | |
| 2000 | 400 | 400 | 280 | 107 | tek00023 | 77.04 | 0.7 | -3.10 | |
| 3000 | 400 | 400 | 180 | 62 | tek00024 | 66.96 | 0.45 | -6.94 | |
| 4000 | 400 | 400 | 166 | 64 | tek00025 | 92.16 | 0.415 | -7.64 | |
| 5000 | 400 | 400 | 114 | 59 | tek00026 | 106.2 | 0.285 | -10.90 |
工程排坑核心:真实主功率模型的还原
【工程排坑注意】:这是无数新手在第一次做数字电源环路设计时最容易栽跟头的地方!
本次通过手动注入测试得到的开环增益曲线与相位曲线,其物理信号流转路径仅仅是从 RC 滤波器前端到最终的输出电压。
这意味着,该测量模型在物理与软件逻辑上存在两个致命的“偏差”:
- 缺失了输出电压采样网络的衰减:由于注入点在 RC 滤波器前,测量模型并未包含输出端实际存在的分压转换网络 $H(s)$ 的衰减系数。
- 混入了人为的软件放大倍数:在 DSP 内部计算开关周期值时,为了让注入电压的数字量与底层 PWM 周期寄存器匹配,我们在测试代码中人为加入了一个放大系数 $K$ 值。
因此,在最终推导真实的系统开环特性曲线用于补偿设计时,绝对不能直接使用示波器实测算出的波特图。必须从测量结果中通过数学手段进行物理还原补偿:人工加上分压转换 $H(s)$ 的衰减,并除以系数 $K$ 值,方可还原出纯正的、剥离了所有测试干扰的主功率级真实波特图。
其等效的真实传递函数还原公式可表示为:
多工况恶劣点选取与最严苛补偿原则
LLC 谐振变换器是一个典型的强非线性系统。仔细观察上面提供的扫频实测表格,可以敏锐地发现一个关键现象:不同电压输出的时候(例如 40V/10A 与 25V/10A),系统在同一频率下的增益和相位衰减是完全不一样的!
随着工作频率的偏移和等效负载阻抗的剧烈变化,LLC 的主导极点和品质因数(Q值)会发生大幅漂移。如果仅仅针对某一个稳态标称工作点(如 40V 满载)设计补偿器,一旦电源切换到其他低压或轻载工况,极易因相位裕度不足而发生低频震荡或高频啸叫。
因此,在数字电源闭环设计的工程实践中,我们的标准做法是:
遍历扫描多个极限工况(如满载最高压、满载最低压、极轻载等),获取多组不同的波特图,然后对比取出相位裕度最差、穿越频率最容易失控的“最恶劣情况(Worst Case)”来进行统一的补偿设计。 只要能把最恶劣的工况稳妥镇压,电源在其他任何常规工况下的稳定性自然固若金汤。
软件实现位置指引
为了方便读者亲自进行扫频复现与实际测试操作,本章节所配套的底层开环注入与信号解析软件代码,已完整实现在工程目录的以下路径中:
02Bcode -> Code-LoopTest -> Demo-LLC-LoopTest
您可以直接编译烧录该专用测试代码,切断闭环,配合外围的信号发生器,即可快速获取属于您当前硬件参数的专属波特图数据集。
PI补偿器设计与代码分析
PI补偿器设计与代码分析
只有在 LLC 这种变频控制(PFM)的电路中,由于工作频率的偏移和等效负载阻抗的剧烈变化,其系统品质因数($Q$值)和主导极点会发生大幅漂移,才导致了不同工况下的伯德图(Bode Plot)变化如此之大。
因此,要想彻底驾驭 LLC 的稳定性,我们不能凭空捏造参数,必须严格基于扫频实测的恶劣工况数据,通过严密的数学计算,逆向推导并设计数字 PI 补偿器,最终将其转化为 DSP 的底层 C 语言代码。
本章将详细揭秘如何从“剥除测试干扰的原始 Bode 图”出发,一步步计算出理论 PI 参数,并完成定点化代码实装。
试数据导入与提取
根据《LLC环路补偿计算-基于PI控制参数》设计书,我们首先将 LLC 的扫频测试数据导入到数学运算软件(如 Mathcad)中。
其中第 0 列代表频率,第 6 列代表相位滞后,第 8 列代表测量总增益。
1. 额定输入 380V,满载输出 40V/10A 工况(Data1):
| 序号 | 0 (频率 Hz) | 1 (CH1 mV) | 2 (CH1 mV) | 3 (CH2 mV) | 4 (延时 us) | 5 (示波器图) | 6 (相位 °) | 7 (放大倍数) | 8 (增益 dB) |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 50 | 400 | 400 | $5.64 \times 10^3$ | 1 | “tek00000” | 0.018 | 14.1 | 22.98 |
| 1 | 100 | 400 | 400 | $5.52 \times 10^3$ | 1 | “tek00001” | 0.036 | 13.8 | 22.8 |
| 2 | 200 | 400 | 400 | $5.76 \times 10^3$ | 110 | “tek00002” | 7.92 | 14.4 | 23.17 |
| 3 | 400 | 400 | 400 | $5.8 \times 10^3$ | 284 | “tek00015” | 40.896 | 14.5 | 23.23 |
| 4 | 600 | 400 | 400 | $3.76 \times 10^3$ | 364 | “tek00014” | 78.624 | 9.4 | 19.46 |
| 5 | 800 | 400 | 400 | $3.44 \times 10^3$ | 380 | “tek00013” | 109.44 | 8.6 | 18.69 |
| 6 | $1 \times 10^3$ | 400 | 400 | $3.12 \times 10^3$ | 356 | “tek00003” | 128.16 | 7.8 | 17.84 |
| 7 | $2 \times 10^3$ | 400 | 400 | 830 | 210 | “tek00004” | 151.2 | 2.075 | 6.34 |
| 8 | $3 \times 10^3$ | 400 | 400 | 368 | 114 | “tek00005” | 123.12 | 0.92 | -0.72 |
| 9 | $4 \times 10^3$ | 400 | 400 | 372 | 136 | “tek00006” | 195.84 | 0.93 | -0.63 |
| 10 | $5 \times 10^3$ | 400 | 400 | 404 | 125 | “tek00007” | 225 | 1.01 | 0.09 |
| 11 | $6 \times 10^3$ | 400 | 400 | 164 | 92 | “tek00008” | 198.72 | 0.41 | -7.74 |
| 12 | $7 \times 10^3$ | 400 | 400 | 154 | 98 | “tek00009” | 246.96 | 0.385 | -8.29 |
| 13 | $8 \times 10^3$ | 400 | 400 | 112 | 84 | “tek00010” | 241.92 | 0.28 | -11.06 |
| 14 | $9 \times 10^3$ | 400 | 400 | 146 | 92.8 | “tek00011” | 300.672 | 0.365 | -8.75 |
| 15 | $1.1 \times 10^4$ | 400 | 400 | 72 | 74.8 | “tek00012” | 269.28 | 0.18 | -14.89 |
2. 额定输入 380V,轻载降压输出 25V/10A 工况(Data2):
| 序号 | 0 (频率 Hz) | 1 (CH1 mV) | 2 (CH1 mV) | 3 (CH2 mV) | 4 (延时 us) | 5 (示波器图) | 6 (相位 °) | 7 (放大倍数) | 8 (增益 dB) |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 50 | 400 | 400 | $7.44 \times 10^3$ | $2.12 \times 10^3$ | “tek00016” | 38.16 | 18.6 | 25.39 |
| 1 | 100 | 400 | 400 | $4.44 \times 10^3$ | $1.6 \times 10^3$ | “tek00017” | 57.6 | 11.1 | 20.91 |
| 2 | 200 | 400 | 400 | $2.34 \times 10^3$ | 900 | “tek00018” | 64.8 | 5.85 | 15.34 |
| 3 | 400 | 400 | 400 | $1.2 \times 10^3$ | 500 | “tek00019” | 72 | 3 | 9.54 |
| 4 | 600 | 400 | 400 | 800 | 324 | “tek00020” | 69.984 | 2 | 6.02 |
| 5 | 800 | 400 | 400 | 640 | 272 | “tek00021” | 78.336 | 1.6 | 4.08 |
| 6 | $1 \times 10^3$ | 400 | 400 | 488 | 200 | “tek00022” | 72 | 1.22 | 1.73 |
| 7 | $2 \times 10^3$ | 400 | 400 | 280 | 107 | “tek00023” | 77.04 | 0.7 | -3.1 |
| 8 | $3 \times 10^3$ | 400 | 400 | 180 | 62 | “tek00024” | 66.96 | 0.45 | -6.94 |
| 9 | $4 \times 10^3$ | 400 | 400 | 166 | 64 | “tek00025” | 92.16 | 0.415 | -7.64 |
| 10 | $5 \times 10^3$ | 400 | 400 | 114 | 59 | “tek00026” | 106.2 | 0.285 | -10.9 |
| 11 | $6 \times 10^3$ | 400 | 400 | 75 | 50 | “tek00027” | 108 | 0.188 | -14.54 |
| 12 | $7 \times 10^3$ | 400 | 400 | 100 | 38.4 | “tek00028” | 96.768 | 0.25 | -12.04 |
| 13 | $8 \times 10^3$ | 400 | 400 | 100 | 38.8 | “tek00029” | 111.744 | 0.25 | -12.04 |
| 14 | $9 \times 10^3$ | 400 | 400 | 105 | 44.8 | “tek00030” | 145.152 | 0.263 | -11.62 |
| 15 | $1.1 \times 10^4$ | 400 | 400 | 61 | 40.8 | “tek00031” | 146.88 | 0.153 | -16.33 |
开环传递函数 Bode 图的物理还原构建
环路扫频所得的第 8 列增益数据,仅仅是“扰动量到输出电压”的测试增益。为了构建纯正的系统主功率开环传递函数 Bode 图,我们必须通过数学方法消除测试外围电路的干扰。
1. 补偿硬件分压衰减:
忽略输出电压分压电路的滤波延迟,真实输出电压转换电路的硬件分压增益为:
2. 剥离软件放大系数:
在扫频注入程序中,为了使电压数字量匹配周期寄存器,人为将采样数据乘以 $\frac{990}{2^{15}}$ 这个常量参数。因此构建开环传递函数 Bode 图时,要将这个人额外加入的参数剔除:
3. 真实增益与相位重构:
提取频率量:
构建扰动量加入口到输出电压转换的整体真实增益:
构建扰动量加入口到输出电压转换的整体相位(取负值代表滞后):
计算数据点个数:
根据上述提取的真实数据点,绘制出剔除干扰后的原始未补偿 BODE 图的增益曲线与相位曲线如下:
PI 环路补偿数学计算
从上述未补偿前的 Bode 图可以明显看出,红色曲线(40V/10A 满载)的相位裕度极小,高频衰减极快,系统最容易在这个恶劣工况下失控震荡。因此,我们以此红线作为补偿曲线设计的基准。
1. 穿越频率与增益提取:
定义设计的 PI 环路补偿后的系统闭环控制带宽(即期望的穿越频率)为:
从图中可知,未补偿前红线在穿越频率点 $800\text{Hz}$ 处的原始增益为:
计算得到实际的绝对放大倍数为:
2. 传递函数构建与零点配置:
传统 PI 的传递函数可表示为(其中 $K_{PI}$ 为总增益,$\omega_z$ 为比例积分零点):
定义 PI 补偿的零点(此为预设值,当补偿后的相位裕度或者增益裕度不满足要求时,可以适当调整零点位置来拉升相位):
构建 PI 传递函数对应频率的频域复数表达式:
3. 求解补偿器核心增益 $K_{PI}$:
根据闭环穿越频率的概念,穿越频率点处的总增益必须为 0dB(即整体放大倍数为 1)。换言之,原始传递函数在该点的幅值倒数,必须等于 PI 补偿器的幅值,因此可以构建对应的方程:
通过预设初始的探测值 $K_s$,使用迭代求解法(root函数)求解 $K_{PI}$ 值:
求解该方程得到:
4. 补偿后 Bode 图验证:
以此,得到彻底定型的补偿器复频域传递函数为:
求解对数频率下的增益和相位:
绘制出叠加了 $G_c(s)$ 补偿器后的增益曲线与相位曲线如下图:
由上图可知,补偿后的红线工况(满载高压)穿越频率精准定格在 800Hz,相位裕度高达 50度,增益裕度在 -20dB 以下,极其稳定。
同时,补偿后的蓝线工况(降压轻载)穿越频率退至 200Hz,相位裕度达 60度,完全满足全工况的严苛稳定要求。一般大于45就好。
数字 PI 参数定点化换算
由于 DSP 单片机无法直接运行连续域的 $s$ 函数,我们必须将理论物理量离散化为 C 语言代码所需的数字系数。
将 PI 补偿器传递函数表示为标准位置式传递函数形式:
因此可以得到对应的 PI 连续态比例系数:
积分的时间常数:
系统采样频率(即 20us 控制中断频率)和采样周期为:
通过离散化(欧拉变换),得到数字化的积分系数:
Q15 格式定点化放大:
为匹配定点型 DSP 的高效移位乘法,将 PI 控制的比例和积分系数人为放大 Q15($2^{15}$)倍表示:
C 语言核心代码深度解析 (VLoopCtlPI)
在最终落地的工程代码中,根据实际带载动态微调,最终采用的宏定义参数为 DSP_V_PI_KP = 2678 和 DSP_V_PI_KI = 88。这与我们上述硬核推导的理论标幺值 ($2327$ 和 $87.74$) 高度吻合,完美实现了理论对代码的闭环指导!
1 | /* |
多零极点补偿器设计与代码分析
多零极点补偿器设计与代码分析
正如工程实践中常总结的那样:“零点增加相位超前,极点增加相位滞后。”
在 LLC 谐振变换器面临极端工况(如重载、输入电压剧变)时,其原始开环传递函数的相位常常会以极快的速度发生断崖式下跌。传统的 PI 控制器(仅包含一个原点极点和一个控制零点)理论上最多只能提供 $90^{\circ}$ 的相位超前,往往无法将穿越频率处的相位拉升到安全裕度之上,导致系统陷入低频震荡。
为了打破 PI 控制的物理极限,我们需要引入一种更强大的武器:多零极点补偿器(即经典的 Type-III / 2型或3型网络变形:2零2极补偿器)。本章将详细为您拆解,如何通过引入双零点来提供高达 $180^{\circ}$ 的相位超前,并通过严密的数学计算与 Z 变换,将其转化为极其高效的 C 语言差分方程代码。
测试数据导入与原始数据表
将前面利用自制环路扫描仪获取的 LLC 测试数据导入数学计算软件中。其中第 0 列代表频率,第 6 列代表相位,第 8 列代表增益。
1. 将 LLC 测试数据导入 Data1 中(输出 40V/10A 工况):
| 序号 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 50 | 400 | 400 | $5.64 \cdot 10^3$ | 1 | “tek00000” | 0.018 | 14.1 | 22.98 |
| 1 | 100 | 400 | 400 | $5.52 \cdot 10^3$ | 1 | “tek00001” | 0.036 | 13.8 | 22.8 |
| 2 | 200 | 400 | 400 | $5.76 \cdot 10^3$ | 110 | “tek00002” | 7.92 | 14.4 | 23.17 |
| 3 | 400 | 400 | 400 | $5.8 \cdot 10^3$ | 284 | “tek00015” | 40.896 | 14.5 | 23.23 |
| 4 | 600 | 400 | 400 | $3.76 \cdot 10^3$ | 364 | “tek00014” | 78.624 | 9.4 | 19.46 |
| 5 | 800 | 400 | 400 | $3.44 \cdot 10^3$ | 380 | “tek00013” | 109.44 | 8.6 | 18.69 |
| 6 | $1 \cdot 10^3$ | 400 | 400 | $3.12 \cdot 10^3$ | 356 | “tek00003” | 128.16 | 7.8 | 17.84 |
| 7 | $2 \cdot 10^3$ | 400 | 400 | 830 | 210 | “tek00004” | 151.2 | 2.075 | 6.34 |
| 8 | $3 \cdot 10^3$ | 400 | 400 | 368 | 114 | “tek00005” | 123.12 | 0.92 | -0.72 |
| 9 | $4 \cdot 10^3$ | 400 | 400 | 372 | 136 | “tek00006” | 195.84 | 0.93 | -0.63 |
| 10 | $5 \cdot 10^3$ | 400 | 400 | 404 | 125 | “tek00007” | 225 | 1.01 | 0.09 |
| 11 | $6 \cdot 10^3$ | 400 | 400 | 164 | 92 | “tek00008” | 198.72 | 0.41 | -7.74 |
| 12 | $7 \cdot 10^3$ | 400 | 400 | 154 | 98 | “tek00009” | 246.96 | 0.385 | -8.29 |
| 13 | $8 \cdot 10^3$ | 400 | 400 | 112 | 84 | “tek00010” | 241.92 | 0.28 | -11.06 |
| 14 | $9 \cdot 10^3$ | 400 | 400 | 146 | 92.8 | “tek00011” | 300.672 | 0.365 | -8.75 |
| 15 | $1 \cdot 10^4$ | 400 | 400 | 72 | 74.8 | “tek00012” | 269.28 | 0.18 | -14.89 |
2. 将 LLC 测试数据导入 Data2 中(输出 25V/10A 工况):
| 序号 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 50 | 400 | 400 | $7.44 \cdot 10^3$ | $2.12 \cdot 10^3$ | “tek00016” | 38.16 | 18.6 | 25.39 |
| 1 | 100 | 400 | 400 | $4.44 \cdot 10^3$ | $1.6 \cdot 10^3$ | “tek00017” | 57.6 | 11.1 | 20.91 |
| 2 | 200 | 400 | 400 | $2.34 \cdot 10^3$ | 900 | “tek00018” | 64.8 | 5.85 | 15.34 |
| 3 | 400 | 400 | 400 | $1.2 \cdot 10^3$ | 500 | “tek00019” | 72 | 3 | 9.54 |
| 4 | 600 | 400 | 400 | 800 | 324 | “tek00020” | 69.984 | 2 | 6.02 |
| 5 | 800 | 400 | 400 | 640 | 272 | “tek00021” | 78.336 | 1.6 | 4.08 |
| 6 | $1 \cdot 10^3$ | 400 | 400 | 488 | 200 | “tek00022” | 72 | 1.22 | 1.73 |
| 7 | $2 \cdot 10^3$ | 400 | 400 | 280 | 107 | “tek00023” | 77.04 | 0.7 | -3.1 |
| 8 | $3 \cdot 10^3$ | 400 | 400 | 180 | 62 | “tek00024” | 66.96 | 0.45 | -6.94 |
| 9 | $4 \cdot 10^3$ | 400 | 400 | 166 | 64 | “tek00025” | 92.16 | 0.415 | -7.64 |
| 10 | $5 \cdot 10^3$ | 400 | 400 | 114 | 59 | “tek00026” | 106.2 | 0.285 | -10.9 |
| 11 | $6 \cdot 10^3$ | 400 | 400 | 75 | 50 | “tek00027” | 108 | 0.188 | -14.54 |
| 12 | $7 \cdot 10^3$ | 400 | 400 | 100 | 38.4 | “tek00028” | 96.768 | 0.25 | -12.04 |
| 13 | $8 \cdot 10^3$ | 400 | 400 | 100 | 38.8 | “tek00029” | 111.744 | 0.25 | -12.04 |
| 14 | $9 \cdot 10^3$ | 400 | 400 | 105 | 44.8 | “tek00030” | 145.152 | 0.263 | -11.62 |
| 15 | $1 \cdot 10^4$ | 400 | 400 | 61 | 40.8 | “tek00031” | 146.88 | 0.153 | -16.33 |
开环传递函数 Bode 图构建
环路扫频的第 8 列增益数据为扰动量到输出电压的表象增益。为了得到纯净的主功率模型,需要剥离测试外围电路的干扰。
忽略输出电压分压电路的滤波延迟,则输出电压转换电路的硬件物理增益为:
在扫频程序中,人为将采样数据乘以 $\frac{990}{2^{15}}$ 这个参量,因此构建开环传递函数 Bode 图要将这个人额外加入的参数去除:
提取频率量:
构建扰动量加入口到输出电压转换的整体真实增益:
构建扰动量加入口到输出电压转换的真实相位:
计算数据点个数:
根据上述提取的数据点,绘制原始未补偿 BODE 图的增益曲线与相位曲线如下图(红线为 40V/10A,蓝线为 25V/10A):
多零极点环路补偿计算
定义设计的多零极点环路补偿后的系统闭环控制带宽(穿越频率)为:
从上述未补偿前的 Bode 图可知,红色曲线(40V/10A)的相位较小,衰减快,以此为补偿曲线。从图中可知,未补偿前红线在穿越频率点处的增益为:
计算得到实际的放大倍数为:
传统两零两极的传递函数可表示为(其中 K 为增益,$\omega_{z1}$ 和 $\omega_{z2}$ 为零点,$\omega_{p1}$ 为极点):
定义零点和极点如下(预设,当补偿后的相位裕度或者增益裕度不满足要求可以适当调整零点位置):
构建 PI 传递函数对应频率的函数:
根据闭环穿越频率的概念,穿越频率点处的增益为 0,即原始传递函数乘以补偿器的值等于 1,因此可以构建对应的方程:
通过预设 K 值,使用迭代求法求解 K 值:
求解该方程得到:
以此,得到补偿器的真实传递函数为:
求解对应频率的增益和相位:
绘制补偿后的增益曲线与相位曲线如下图:
如上图可知,补偿后的红线工况穿越频率为 $1000\text{Hz}$,相位裕度为 $60$ 度,增益裕度在 $-20\text{dB}$ 以下,系统极其稳定。
数字控制参数换算与 Matlab Z 变换
由于 DSP 只能执行离散控制,使用 Matlab 工具对补偿器传递函数进行 Z 变换。
1 | fz1=800; |
得到传递函数如下:
对应的 Z 变换方程如下:
传统零极点的 Z 域传递函数表示为:
则对应的参数:
数字控制差分方程为:
将所有参数统一用 Q12 表示:
2零2极点控制 C 语言代码深度解析 (VLoopCtl2Z2P)
复频域的复杂微积分,最终完美化作了这段以微秒级速度狂飙的 C 语言差分方程代码。
注意:在 C 语言宏定义中,为了提高 DSP 硬件乘加器的计算效率,直接将反馈系数取反(即 $-a_1$ 和 $-a_2$),这样代码里就只剩下纯粹的加法。
1 | /* |
空载轻载打嗝(Burst)控制与代码分析
空载轻载打嗝(Burst)控制与代码分析
在 LLC 谐振变换器的实际工程应用中,全负载范围内的稳定调压是一个巨大的挑战。特别是当系统处于极轻载或完全空载状态时,由于寄生电容和励磁电感的物理特性,传统的调频控制往往会面临失效的窘境。为了彻底解决这一问题,系统引入了打嗝(Burst)控制模式。
本章将详细解析什么是打嗝控制、为什么要使用它,并深度剖析其底层的 C 语言实现逻辑。
什么是打嗝控制?为什么要使用它?
物理瓶颈与失效背景:
LLC 变换器通过改变开关频率来调节输出电压(频率越高,输出电压越低)。然而,当模块输出等效负载太轻或彻底空载时,LLC 的电压增益曲线会变得极其平缓。此时,即使系统控制环路将 LLC 工作频率推到了硬件允许的最高频率极限,变压器原边仍然会向副边泵入过多的能量,导致输出依然不能达到想要降低的参考设定电流和电压,使得输出电压不受控制地持续飘高。
Burst 控制的核心原理:
为了防止空载时输出电压失控过压,控制环路必须进入 Burst(打嗝)控制模式。
所谓打嗝控制,其本质是一种能量的“间歇性投递”策略:即当 PI 环路计算出的 LLC 控制频率大于设定的最高频率(对应周期量小于最小值)时,系统直接采取硬核手段彻底关闭 PWM 发波;此时能量停止传输,输出电容向负载缓慢放电,电压开始回落;当 PI 环路需求频率小于最高频率时,系统再次重新打开 PWM 恢复发波。
系统通过这种一开一关的低频间歇工作方式,极大地降低了单位时间内的平均能量传输,从而使得极轻载下的输出电压和电流也能精准达到目标值。
Burst 控制模式程序流程图
在 20us 的超高频定时中断中,每次执行完 PI 环路计算后,程序都会紧接着进行 Burst 状态的判定与干预。其判定与执行逻辑的程序流程图如下图所示:
流程图逻辑简析:
- 首先检测是否处于 Burst 允许使能的状态。
- 判断当前 PI 环路输出的控制量(周期)是否已经小于设定的安全最小值(即频率超出了最高限制)。
- 如果超出极限,则将 PWM 关闭标志位置 1,并物理切断 PWM 输出。
- 如果控制量回到安全范围内,且检测到此前 PWM 处于关闭状态,则清除标志位,并重新开启 PWM 脉冲输出,恢复正常的调频工作。
核心代码深度解析
这段控制逻辑在代码层面主要分为两部分:一是状态检测与标志位调度的 BurstCtl 主函数;二是负责底层硬件发波切断与恢复的 PWMDis 与 PWMEn 函数。
Burst 状态机主调度函数 (BurstCtl)
1 | /* |
硬件级极速封波与恢复机制 (PWMDis & PWMEn)
在电源控制中,要求“关得死,开得快”。为了彻底防止在停波期间由空间电磁干扰(EMI)引起的引脚误动作导致全桥直通炸机,代码没有采取“将占空比设为 0”这种软做法,而是直接篡改了芯片底层 GPIO 的复用属性(MUX),实施了硬核物理隔离。
1 | /* |
当输出电压回落,需要再次注入能量时,系统只需重新将引脚控制权交还给内部的 ePWM 硬件模块即可,脉冲会瞬间无缝衔接输出:
1 | /* |
短路等快速保护与寄存器更新
短路等快速保护与寄存器更新
在数字开关电源的设计中,控制算法的闭环计算仅仅是系统稳定运行的前提。当系统面临突发的极端恶劣工况(如输出端意外短路、原边谐振腔电流激增、前级 PFC 意外掉电等)时,DSP 必须能够在微秒级别做出响应,强行接管或切断发波,以防止功率器件发生不可逆的物理损坏。
本章将详细梳理 20us 高频中断中最核心的两个收尾动作:PWM 寄存器的安全更新刷新,以及三大快速保护机制(输出短路、原边硬件过流、PFC 状态机联锁)的设计原理与代码实现。
PWM 寄存器安全更新 (RegReflash)
在执行完复杂的电压外环、电流内环以及 Burst 打嗝逻辑后,程序最终会得出系统需要的运行周期量(PD)。然而,在将这个数值真实地写入底层硬件 PWM 寄存器之前,必须进行最后一道安全防线的拦截——极限边界钳位。
核心逻辑说明:
- 频率安全限制:电压环计算得到 LLC 的控制周期量(频率值)后,需对控制量进行最大和最小值限制,避免运行出现频率过小(导致变压器饱和)或者过大(导致开关损耗失控炸管)。
- 软启动平滑介入:在电源刚刚启动时,为了限制极大的启动电流过冲,程序引入了
MaxPD变量。通过在启动阶段逐渐减小MaxPD的限幅值,强迫电源以最高频率、极小能量的状态平滑启动。 - 50%占空比锚定:根据配置的 PWM 发波方式,更新 PWM 的周期寄存器
TBPRD时,为了保证占空比依然恒定为 50%,必须同步将对应的计数寄存器CMPA值更新为周期值的一半(Period >> 1)。 - 死区限制:对最小死区进行硬性限制,避免上下管死区过小发生桥臂直通。
1 | /* |
快速保护函数总调度 (FastProtection)
模块具有快速保护功能和慢速保护功能,定义输出短路、LLC谐振电流过流保护、PFC_OK信号这三项为快速保护功能(其余如过温保护等为慢速保护,在 5ms 中断中执行)。这三项快速保护直接挂载在 20us 的超高频中断(ISR_20US)末尾,确保故障发生后在几十微秒内即可瞬间切断输出。
1 | /** =================================================================== |
输出短路保护与打嗝重启机制 (ShortOff)
当模块输出端负载意外短路时,由物理短路特性可知,此时输出侧的电压将被瞬间拉得很低,且电流会变得极其巨大。因此,我们可以通过同时检测输出电压跌落和输出电流飙升这两个条件,来综合判断输出是否发生短路工况。
短路阈值参数计算:
为了精准判定短路且防止误触发,我们定义输出短路保护的电压阈值为最低标称电压的 10%,最大电流阈值为额定最大电流的 150%。计算公式如下:
根据之前章节论述的数字量转换关系,将其映射为 DSP 内部的 Q15 数字量判定标准:
这正是代码中 #define IO_SHORT_DSP 22342 与 #define VO_SHORT_DSP 1103 这两个宏定义的理论来源。
当模块检测到输出电流过大且输出电压过低时可认为发生短路故障,需进行短路保护处理:禁止模块 Burst 功能(防止 Burst 逻辑在低压时误打开 PWM)、强行关闭 PWM、置位短路保护标志位,并跳转至故障状态机。
为了提高电源的可用性,模块具备输出短路故障撤出后自动重启功能。发生短路保护关机后,程序会进入长达 4 秒的冷却等待时间。若计时器累加至 4 秒后,系统判断重启次数若大于 10 次,说明是永久性死短路,禁止再次重启并死锁保护;若重启次数小于 10 次,则清空标志位重新软起动。
其程序流程图及代码实现如下:
1 | /* |
谐振原边电流硬件过流封波 (HwOpp)
当电源侧输出短路,或者突加大负载时,会造成模块副边电流迅速增加,同时原边谐振腔电流会瞬间产生剧烈的激增。为了防止瞬间极大的原边电流对功率半导体(MOSFET)造成电流击穿或瞬态结温过热,必须不依赖软件计算,采用最高级的硬件级封波来抑制电流。
硬件比较器机制:
谐振电流保护采用 DSP 控制器自身内设的模拟比较器设计。外部硬件电路将原边互感器采样的电流信号送进内设比较器的正输入端,控制器内部 DAC 产生比较器的负端比较参考阈值电压。
当原边电流峰值过大,达到 DAC 设定的参考电压时,内设比较器输出发生翻转。该翻转信号无需经过 CPU 软件运算,直接在硬件底层快速触发 ePWM 模块的 TZ(Trip Zone, one shot)端,瞬间强制剥夺 PWM 输出,硬件标志位 OST 置位。
软件在此处的职责仅仅是:检测到硬件已经动手封波后,同步更新软件状态机并维持锁定,随后交由上述的 ShortOff 里的打嗝逻辑来处理重启。
1 | /* |
PFC 前级健康度联锁保护 (PFCokCheck)
LLC 谐振变换器的正常运行必须基于前级 PFC(功率因数校正)电路提供稳定的直流母线电压。当模块的 PFC 尚未进入稳压状态,或 PFC 突发故障(如掉电、过压等)时,LLC 必须绝对禁止运行,否则 LLC 增益特性将彻底错乱,导致磁芯偏磁或输出失控。
PFC 芯片通过一个专用的硬件引脚(PFC OK 端口)输出高低电平,来告知 LLC 的 DSP 自身运行是否健康正常。
当 LLC 检测到 PFC OK 信号为高电平时,方可置位 F_PFC_OK 标志位,允许启动。反之,如果在运行中突然丢失此信号,LLC 必须紧急切断输出,退回到 Wait(等待)状态机。
1 | /* |
过流过温等慢速保护与 200Hz 状态机调度
过流过温等慢速保护与 200Hz 状态机调度
在数字电源的控制架构中,任务的优先级分配是系统稳定运行的核心。前文所述的 20us 中断(50kHz)负责最核心的闭环计算与快速硬件保护,而对于一些需要一定时间滤波、不要求微秒级响应的保护逻辑(如软件过流、过温、通信丢失等),则被统一安排在优先级较低的 200Hz(5ms)中断中执行。
本章将详细解析 200Hz 中断的嵌套调度机制,并逐一剖析输出过流、过压、欠压、过温及通信丢失等慢速保护的底层 C 语言实现逻辑与恢复机制。
200Hz 中断总调度与嵌套逻辑 (ISR_200Hz)
5ms 中断(即 200Hz)优先级较低,运行包括慢速保护、LLC 状态机、参考电压计算函数、SCI 通信函数、LLC 状态显示等功能。其程序流程图如下图所示:
【深度代码解析:中断嵌套机制】
在单片机中,默认情况下进入一个中断后会屏蔽其他同级或低级中断。由于 5ms 中断执行的代码量非常庞大(包含复杂的通信协议与状态机),如果在此期间全局屏蔽中断,将会导致极其关键的 20us 高频控制中断被严重阻塞,进而引发电源炸机。
因此,代码在进入 200Hz 中断的第一时间,巧妙地使用了中断嵌套技术:手动清除应答标志位并重新开启全局中断(EINT),使得 20us 的核心环路中断可以随时打断当前的 5ms 慢速中断,保障了控制环路的绝对实时性。
1 | struct _FLAG DF={0}; |
慢速保护总线函数 (SlowP)
慢速保护功能函数包含电源所有的慢速保护功能,包含输出过流保护、输出过压保护、输出欠压保护、CAN 通信掉电保护、散热器过温保护等。慢速保护不同于快速保护,对时间响应性要求不高,因此可以加入更多的软件防抖滤波时间,避免误触发。
1 | /** =================================================================== |
软件输出过流保护 (SwOCP)
当电源模块正在运行过程中,检测到输出电流大于过流阈值,且连续保持若干时间电流过大,则判断为输出过流,系统将执行保护:禁止模块 Burst 功能(因 Burst 功能会主动打开 PWM),关闭 PWM,置位短路保护标志位,跳转至故障状态机。
过流保护恢复与重启机制:
若检测到过流标志位为 1,则说明发生过流保护。计时器累加至 4 秒后,判断重启次数是否大于 10 次:
- 若重启次数大于 10 次,说明输出持续过流、负载过大,禁止模块再次重启,进入死锁保护。
- 若重启次数小于 10 次,则人为清空过流标志位。程序在过流标志位清除后,若无其他故障发生,则状态机自动从故障状态跳转至等待状态,并重新软起动。
其程序流程图及代码解析如下:
1 | /* |
软件输出过压保护 (SwOVP)
程序设置输出过压保护,旨在抑制输出电压持续过高损坏器件。
电源模块时刻检测输出电压,当输出电压大于过压保护阈值,且连续保持若干时间电压过高,则判断为输出过压,执行保护措施。
不可恢复特性:
值得注意的是,电源通常过压保护被设计为不可恢复性保护,这是为了防止持久输出的高压对电源后级负载造成毁灭性的电压击穿损坏。因此代码中没有像 OCP 那样的打嗝重启逻辑。
1 | /* |
软件输出欠压保护 (SwUVP)
若电源的主功率器件短路、驱动芯片损坏等,均会导致输出无任何状态。程序通过判定输出电压的大小和电源运行状态信息,来综合判定电源是否触发了欠压保护。
电源模块时刻检测到输出电压,当输出电压小于欠压保护阈值,同时必须满足电源的状态机处于正常运行状态,且连续保持若干时间后,才判断为输出欠压,并执行保护停机。
1 | /* |
CAN通信丢失保护 (CANLost)
CAN 通信主要应用于上位机对模块的实时控制。正常运行时,上位机以一定时间间隔向模块发送控制信息,模块也以一定的时间间隔回复上位机的指令。当上位机与模块之间的 CAN 通信发生故障(如断开通信连接)时,为了安全起见,模块需自动停止输出功能。
模块设有 CAN 通信掉线保护功能。CanDat.LostCnt 为通信掉线计时器,在其他中断中以 5ms 为基准计时,当模块收到上位机的信息时,该计时器被清零。
若模块连续若干时间内并未收到来自上位机的 CAN 信息,将执行保护;若再次收到来自上位机的 CAN 通信指令,则标志位清理,模块重新启动。
1 | /* |
散热器过温保护 (SwOTP)
电源长期运行或者高温状态运行下,半导体器件产生的热量会逐渐积累,必须设立过温保护功能,保护半导体器件温度不过高而损坏。
程序根据 NTC 温度传感器的 ADC 采样值,通过查表法查找与采样值对应的真实温度值。
当检测到散热器的温度大于过温保护阈值时,且连续 1S 保持过高温度,则认为器件过温,执行保护停机并跳转至故障状态机。
过温恢复(迟滞判定):
若检测到过温标志位为 1,程序会继续实时检测散热器温度。当在模块关闭输出后,散热器温度自然回落,恢复至设定的较低值(恢复阈值)以下时,则人为清空过温标志位。程序在过温标志位清除后,状态机自动从故障状态跳转至等待状态重新软起动。
1 | /* |
LLC状态机函数与运行控制逻辑解析
LLC状态机函数与运行控制逻辑解析
在数字电源的高可靠性设计中,除了高频的闭环 PID 计算外,电源的启停、故障保护、自恢复以及各功能模块的时序调度,都需要一个严密且稳健的“状态机(State Machine)”来统筹管理。
程序以状态机的方式表明模块的每一个运行状态。程序状态机运行周期为 5mS,主要由以下五个核心状态组成:初始化状态(Init)、等待状态(Wait/Idle)、启动状态(Rise)、正常运行状态(Run)、故障状态(Err)。各个状态之间相互独立,且严格按照设定条件进行跳转,其跳转条件逻辑如下图所示。
状态机跳转宏观条件总览如下:
- 初始化状态至空闲状态:上电程序参数初始化,电流偏置采样后跳转等待状态。
- 空闲状态至软启动状态:等待 PFC 与 LLC 均无故障,且 PFC 正常运行,跳转软起动状态。
- 软启动状态至正常运行状态:开启 PWM,频率逐渐从高频平滑启动并过渡到闭环。
- 软启动状态至故障状态:启动过程中发生故障或保护,强制中断启动。
- 正常运行状态至故障状态:正常运行过程中发生故障或保护,立即切断输出。
- 故障状态至空闲状态:故障消除后自动跳转,模块自动恢复启动准备阶段。
状态机调度总入口 (ISR_200Hz & StateM)
状态机的大脑位于 200Hz(5ms)的定时器中断中。为了防止庞大的状态机逻辑阻塞 20us 的核心发波环路,这里极其关键地使用了中断嵌套机制。StateM 函数则是状态机的核心集线器,使用 switch-case 结构对当前所处状态进行分支散转。
1 | /** =================================================================== |
初始化状态 (StateMInit & ValInit)
模块初上电/复位后,程序首先强制进入初始化状态(Init),完成程序运行相关基础参数的初始化配置。
这部分配置极其重要,包含控制变量初始化、SCI 通信数据初始化、以及极为核心的电流采样零偏计算等。为了消除硬件运放的直流偏置,必须在没发波时提前采出硬件的偏置基准量。
当输出电流偏置采样完成后,程序完成初始化,状态机才会进入空闲等待状态(Idle/Wait)。
1 | /** =================================================================== |
空闲 / 等待状态 (StateMWait & CanOutEn)
进入空闲状态下,程序实时判断 LLC 的故障信息,PFC 的故障信息,PFC 的运行状态,PFC_OK 信号以及上位机开机命令。
程序进入状态机后会故意计时等待 5 秒时间,以确保上述硬件建立稳态且故障复位至正常状态。若 LLC 的故障信息与 PFC 的故障信息均为 0(无故障),且 PFC 处于正常运行状态,PFC_OK 信号有效,且上位机下发开机命令,程序状态机跳转至启动状态(Rise)。
1 | /** =================================================================== |
启动状态机 (StateMRise)
当程序进入启动状态机则准备模块启动输出。程序的启动状态机是一个嵌套的子状态机,由三个子步骤精细组成,分别为:启动初始化状态(SSInit),等待发波状态(SSWait),正在软启状态(SSRun)。
- SSInit:进入启动初始化状态,分别初始化启动相关状态和参量,包含启动标志位清 0,禁止 Burst 功能,关闭 PWM,设置 LLC 硬件过流保护点,将最大控制周期量限制值限制至最小值(即最高频率),设置最大死区,设置输出参考电压初值等,随后进入等待发波状态。
- SSWait:等待发波状态计时等待 100mS 后设置控制周期量为最小值(频率最大值),配置 LLC 从最高频率开始启动,避免过大的启动 PWM 引起谐振电流过大。随后更新 PWM 寄存器,并开启 Burst 控制功能,跳转至正在软起状态。
- SSRun:进入软起状态,置位启动标志位,最大控制周期量限制值逐渐增加(代表最低允许频率逐渐降低),死区时间逐渐减小。当最大控制周期量限制值增加至最大值时(最低频率完全放开)和死区减小至最小值时,软起动状态彻底结束,程序跳转至正常运行状态。
1 | /* |
正常运行状态与故障状态 (StateMRun & StateMErr)
正常运行状态
当电源越过惊险的软启阶段后,便进入平稳的正常运行状态。
值得注意的是,该状态机内程序不处理任何实质性内容。因为所有的恒压/限流环路运行、打嗝模式控制和各种突发物理保护,均已分布在最高优先级的 20us 中断和 200Hz 中断内的 SlowP 中后台默默处理。这个空函数是留给未来业务扩展架构预留的锚点。
1 | /* |
故障状态机
当模块发生故障或需要保护时(如过压、过流或过温保护等),模块由外层保护函数强行跳转进入保护状态。
在此状态下,系统不仅会保持关闭 PWM 和 Burst 功能,还会停留在当前死循环中静静等待。只有当故障彻底清除(DF.ErrFlag==F_NOERR)后,才能跳转至等待状态(Wait),进行 5 秒安全冷却后重新启动。其程序流程图如下图所示。
1 | /* |
参考电压、电流更新计算与状态指示灯
参考电压、电流更新计算与状态指示灯
在 LLC 闭环控制系统中,PID 环路的目标是使得实际输出跟随给定的参考值。为了满足不同应用场景的需求,模块的输出电压控制由参考电压决定,设计的模块参考电压由输出侧滑动电源器(硬件电位器)调节产生或者由上位机设定产生。
本章将详细解析这两种参考值的获取与数字标幺化转换逻辑,并介绍用于人机交互的状态指示灯设计机制。
上位机 CAN 通信命令解析与标幺转换 (SetCmdUpdate)
在数字化程度较高的系统中,通常由上位机通过 CAN 总线下发目标电压和电流。接收到的原始十进制物理数据必须经过严格的合法性校验,并转换为 DSP 内部的 Q 格式数字量。
代码深度解析:
在 SetCmdUpdate 函数中,程序首先校验输出使能指令的合法性。随后对接收到的参考电压(要求在 24V-48V 之间)和参考电流(要求在 0.1A-10A 之间)进行安全范围钳位。
在进行数字量转换时,代码巧妙利用了移位操作代替除法以提高效率。例如,将上位机发送的数据转换成控制变量时,电压转换使用了乘 4706 再右移 10 位(即除以 1024)的操作,电流转换使用了乘 3813 再右移 8 位(即除以 256)的操作,这正是基于系统硬件采样分压比的逆运算标幺化。
1 | /* |
基于 CAN 的目标值缓变更新 (CANVrefGet / CANIrefGet)
上位机下发的电压电流参考值可能会发生阶跃性突变(例如直接从 24V 设定为 48V)。如果将这个阶跃信号直接喂给 PI 闭环控制器,会引发极其剧烈的积分饱和与过冲,甚至导致谐振腔失控炸机。
因此,代码中引入了步进逼近算法(Slew Rate Control):通过固定的步长(VREF_K 和 IREF_K)将目标值缓慢增加或缓慢减小,使得阶跃指令被平滑为斜坡指令。这极大地保护了功率器件的稳定过渡。
1 | /** =================================================================== |
基于硬件电位器的参考电压更新 (VrefGet)
在脱机或手动模式下,电源的输出电压由面板上的滑动电位器进行物理旋钮调节。
以滑动电位器调节参考电压为例,读取滑动电位器分压端的电压值,并对其进行 32 次滑动滤波(参考电压需要较稳定值)。
计算数学模型如下:
$V_{ref} = V_{ref_min} + V_{adj} \times K$。
上述 K 值的大小可以调整参考电压调节的灵敏度。为了抑制调节过程中输出电压过快的跳动造成振荡,可设置将参考电压缓慢增加或缓慢减小。并限制输出最大参考电压值。
1 | /** =================================================================== |
状态指示灯显示逻辑 (LEDShow)
优秀的人机交互界面能够帮助工程师和用户快速定位电源工况。模块设置输出红黄绿三色灯用以指示模块的运行状态信息。
状态显示描述如下:
| 绿灯 | 黄灯 | 红灯 | 状态描述 |
|---|---|---|---|
| 灭 | 灭 | 灭 | 机器掉电 |
| 亮 | 亮 | 亮 | 初始化状态/等待状态 |
| 亮 | 亮 | 灭 | 软启动过程 |
| 亮 | 灭 | 灭 | 正常运行状态 |
| 灭 | 灭 | 亮 | 故障或保护状态 |
根据上述表格,LEDShow 函数在 200Hz 的中断总调度中被周期性调用,它根据全局状态机变量 DF.SMFlag 的具体情况,向对应的 GPIO 寄存器写入高低电平,实时刷新面板三色灯的点亮逻辑。
OLED显示屏与I2C通信源代码分析
OLED显示屏与I2C通信源代码分析
在现代数字电源的工程应用与现场调试中,配备一个直观的人机交互界面(HMI)是极其必要的。本系统采用了一块标准的 I2C 接口 OLED 显示屏,用于实时监控并刷新电源的运行工况(状态机)、输出电压、输出电流,并在发生异常时精准报出具体的保护故障类型。
本章将详细剖析 DSP 底层 I2C 外设的硬件初始化配置过程,以及在 5ms 中断中调用的 OLED 屏幕数据格式化与刷新算法。
I2C 硬件通信接口初始化 (I2CA_Init)
OLED 屏幕使用 I2C(内部集成电路总线)协议与 DSP 进行异步串行通信。为了实现高速的数据发送并防止通信阻塞高频控制环路,程序不仅配置了精准的通信波特率,还启用了 DSP 内部的 TX-FIFO(发送硬件缓冲队列)。这样,CPU 只需要把一串显示数据丢进 FIFO 寄存器即可继续执行其他任务,极大地减轻了软件等待的时间开销。
代码中 I2CA_Init 函数完成了引脚复用、从机地址绑定、时钟分频以及 FIFO 的激活。
1 | /* |
OLED 数据格式化与屏幕刷新逻辑 (OLEDShow)
OLED 显示函数 OLEDShow 通常挂载在 5ms 的慢速定时器中断中,利用一个全局计数器 OledCnt 来控制刷新的帧率。
这个函数主要承担两大任务:
- 数字量解码与标幺逆转换:将 DSP 内部的 Q15 格式电压、电流变量,逆向转换为人类可读的实际十进制物理数值,并通过数学方法提取出各位数字(如十位、个位、十分位、百分位)。
- 状态机文字映射:监控系统的全局状态机
DF.SMFlag,一旦状态发生变化,立刻在屏幕上刷新对应的英文字符串提示。
1 | // 计时器,在 5 毫秒的中断中计时,控制屏幕的刷新频率 |
至此,系统通过 I2C 硬件 FIFO 与高效的无浮点数拆位算法,完美构建了 LLC 电源的本地可视化监控平台。
```



































