ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于STM32的双极性SPWM逆变器设计实战:原理、代码与实测

基于STM32的双极性SPWM逆变器设计实战:原理、代码与实测 简介本资源是一套基于STM32F1系列单片机ARM Cortex-M3内核实现双极性正弦脉宽调制SPWM逆变控制的完整Keil MDK-ARM工程面向电力电子、嵌入式控制及电机驱动方向的中级以上开发者与高校实践者解决直流—交流高效逆变中SPWM波形生成、载波调制逻辑与硬件协同控制等核心问题。压缩包含266个文件主体为42个C源码含定时器、GPIO、RCC、USART等外设驱动与SPWM算法实现、48个头文件h、44个依赖文件d及41个编译中间文件o结构完整支持Keil5直接打开编译下载总大小10.83MB。已有113人学习下载配套工程已预置系统初始化、双极性SPWM定时器互补输出配置、中断服务逻辑及基础保护响应框架可快速验证逆变波形质量、调试死区时间、适配不同载波比并作为光伏微逆、UPS或实验教学逆变板的可靠底层参考。 从柜子里翻出这块双极性SPWM逆变板时第一反应是“又得把Keil5工程翻出来了”。这个工程名是XU程序-STM32-Code核心MCU是STM32F103代码基于标准外设库开发环境是Keil5。板子目的很纯粹把直流母线电压变成50Hz工频交流电用双极性SPWM调制策略实测输出正弦波。对我这种做了几年嵌入式、最近两年才开始认真碰电力电子的人来说这个项目的价值在于——它把“SPWM”从教材公式变成了示波器上实际可调、可看的电压波形。这篇博文不打算讲太多虚的就按我拿到这块板子之后从原理、硬件、代码到实测的完整思路来写适合正在做逆变器、UPS、变频电源或者想搞懂SPWM到底怎么落到单片机上的朋友参考。1. 为什么选双极性SPWM逆变板的核心价值与应用定位1.1 逆变本质用高低电平“拼”出正弦波逆变器的任务是把直流电变成交流电。这里的难点不在于“变交流”而在于变出一个“正弦形状”的交流。正弦波我们很熟悉但一个只有开关状态的功率管电路输出只有高电平和低电平怎么产生正弦答案就是SPWMSinusoidal PWM正弦脉宽调制。核心思想是在一个固定频率的三角波载波周期内让高电平的宽度按照正弦函数的规律变化。高电平宽的地方平均电压高窄的地方平均电压低。经过LC低通滤波器之后高频开关分量被滤掉剩下的就是跟随脉冲宽度变化的低频正弦包络。双极性SPWM只是SPWM的一种实现方式。它的特征是在整个调制周期内逆变桥输出电压都在Vdc和-Vdc两个电平之间来回切换不存在0电平。也就是说正半周靠“宽脉冲窄脉冲”平均出正电压负半周靠“宽脉冲窄脉冲”平均出负电压。这个特性决定了它的控制逻辑简单动态响应好但也带来开关损耗高、滤波难度大等代价。1.2 双极性与单极性一个关键取舍很多人在做逆变器时会纠结用双极性还是单极性我在这块板子上用的是双极性原因后面会讲但先把这个选择拆清楚。下面是我整理的单极性与双极性对比对比维度单极性SPWM双极性SPWM桥臂输出电压电平Vdc、0、-Vdc 三种电平只有 Vdc 和 -Vdc 两种功率管开关状态一臂高频开关另一臂工频翻转对角两管同时高频开关谐波含量谐波能量集中在载波频率两倍附近滤波容易谐波集中在载波频率附近需要更高截止频率的滤波器开关损耗较低较高四只管都参与高频开关EMI干扰相对小较大共模噪声明显控制实现过零判断复杂需要切换两臂工作模式逻辑统一代码简单适合MCU实现动态响应一般好典型应用中大功率、注重效率的逆变器小功率、控制优先的逆变电源这块板子的定位是小功率验证板主要目标是先把SPWM算法跑通、把波形做出来。双极性最大的优势是逻辑简单——所有管子都按同一套PWM规律工作不存在过零附近切换逻辑的问题用STM32F1的定时器互补输出就能直接驱动程序不容易出现“过零切换时跑飞”的诡异现象。对新手或者想快速验证算法的人来说双极性是成本最低的起步路线。1.3 为什么不是DSP而是STM32F1做逆变器很多人第一反应是用DSP特别是TI的C2000系列原因是DSP的PWM模块天生为电力电子设计。但如果只是做小功率验证板或者学习SPWMSTM32F103完全够用而且优势明显价格便宜一块F103C8T6最小系统板十几块钱72MHz主频对10kHz载波的SPWM来说绰绰有余TIM1/TIM8高级定时器支持互补PWM输出和硬件死区插入这是做H桥驱动最需要的功能生态成熟Keil5工程一拉就能编译网上资料和调试经验最多。当时我选STM32F1而不是DSP最重要的理由是我不想把时间花在“学会一套新IDE和寄存器手册”上。我是做嵌入式出身对STM32和Keil5已经非常熟用熟悉的工具把电力电子算法跑通比用陌生的平台重新学一遍更高效。如果你的目标是学习SPWM本身STM32F1是很好的载体如果要做大功率商用逆变器再考虑DSP也不迟。2. H桥主回路与器件选型从母线电容到自举驱动2.1 H桥拓扑与双极性开关时序SPWM算法最终要落到功率电路上。常见的小功率逆变桥是H桥结构四个开关管这里用的是N沟道MOSFET组成一个“H”字形负载或者LC滤波器接在桥臂中间。双极性SPWM的开关时序很直接正半周时Q1和Q4同时导通Q2和Q3关断负载两端电压为Vdc负半周时Q2和Q3同时导通Q1和Q4关断负载两端电压为-Vdc。注意这里说的是“理想开关时序”实际必须留出死区时间防止同一桥臂上下管直通。也就是说TIM1的CH1和CH2对应的PWM占空比始终是相同的同时变化而CH1N和CH2N是它们的互补信号负责驱动同一桥臂的下管。这样一对对角管Q1/Q4和另一对对角管Q2/Q3交替导通V_AB输出波形就是双极性SPWM脉冲序列。2.2 驱动电路半桥驱动芯片与自举电容STM32的引脚输出3.3V电平驱动能力也弱不可能直接驱动大功率MOSFET的栅极。这块板子用的是半桥驱动芯片方案比如IR2104或者EG2104一路PWM输入输出HO和LO分别驱动上管和下管。这类半桥驱动芯片的难点是上管驱动供电。上管源极电压是浮动的必须用自举电路通过一个自举电容让驱动芯片内部的高端驱动器以“上管源极电压”为参考提供足够的栅源电压。自举电容选多大有一个经验公式Cbs 15 × Qg_total / ΔVbs其中Qg_total是上管栅极电荷如果是多管并联要累加ΔVbs是允许的自举电容电压跌落一般取0.1到0.5V系数15是经验余量。以IRF540N为例Qg约71nC如果ΔV取0.3VCbs 15 × 71nC / 0.3V ≈ 3.55uF实际取4.7uF或10uF都可以。电容太小上管开不到足够的栅压管子发热电容太大自举充电时间变长极端情况下上管可能突然关断。这个坑我踩过板子运行时总是上管温度明显高于下管后来发现是自举电容容量偏小。2.3 输出滤波LC低通滤波器的参数计算双极性SPWM输出的是高频脉冲串必须通过LC低通滤波器恢复正弦波形。滤波器截止频率的选择很关键太低了基波也会被衰减输出电压降低太高了载波谐波滤不干净输出波形会顶着一个锯齿状的纹波。LC滤波器截止频率fc 1 / (2π × sqrt(L × C))通常把fc设在载波频率的十分之一左右。这块板子载波是10kHz所以fc取1kHz到2kHz之间比较合适。如果L取5mHC取2.2uFfc 1 / (2π × sqrt(5mH × 2.2uF)) ≈ 1.52kHz实际效果还不错。但要注意LC滤波器的L和C在带载时会有压降和相移轻载时可能出现过冲重载时输出幅值下降。如果要做闭环稳压电压采样点要放在滤波电容之后而不是直接采桥臂输出。2.4 保护电路母线过压、欠压和过流逆变器最容易出问题的时候就是上电和过载瞬间。这块板子虽然定位是验证板但保护电路不能省。至少要有三路母线电压采样用电阻分压加运放跟随送到STM32的ADC。母线电压超过上限或低于下限时立即封锁PWM输出。输出过流检测在输出回路串采样电阻或者用电流互感器比较器输出接到TIM1的刹车输入BKIN引脚实现硬件级快速封锁PWM。温度保护MOSFET或者电感温度超过阈值时降低调制比或者停机。这里特别说一下为什么不把过流保护完全交给程序。TIM1的刹车输入是硬件行为——PWM输出立即被硬件拉到安全状态不依赖CPU中断响应时间。一旦输出短路程序里哪怕过了几微秒再关管子也可能已经炸管了。所以把过流比较器输出直接接到BKIN引脚是安全底线同时也保留一个GPIO状态读取用于向程序报告故障原因。3. STM32F1生成双极性SPWM的软件核心查表、定时器与死区3.1 四种生成方案为什么选查表定时器更新SPWM波形软件生成有几种常见思路方案优点缺点适用场景普通GPIO定时翻转逻辑简单任意引脚可用CPU中断频繁精度差难以控制死区极低速或教学演示定时器PWM查表更新CCR硬件输出CPU只要定期更新占空比寄存器需要高级定时器和存储器表最常用适合绝大多数MCUDMA内存映射更新CCR几乎不占CPU可输出复杂波形变化占内存、调试复杂、DMA触发时序要小心多相变频、高频载波专用SPWM芯片或外部DAC波形精度极高完全脱机增加成本和面积灵活性差高端变频器这块板子用的是“定时器PWM查表更新CCR”方案。原因很简单10kHz载波下200点正弦表对应的基波频率刚好是50Hz10000/20050每200μs才需要更新一次CCR。STM32F1跑72MHz中断服务程序里就做一次查表、一次赋值、一次变量加一CPU占用率几乎可以忽略。如果以后需要多路输出或更高载波再考虑DMA方案。3.2 一个正弦周期要多少个样本载波比计算载波比一个正弦周期内包含多少个载波周期直接影响输出波形质量。数量太少输出波形阶梯感严重、谐波大数量太多PWM频率高、开关损耗直线上升。常见选择是100到400个样本。这里取200个样本是综合考虑了基波频率范围和定时器分辨率。定时器ARR设为7200-172MHz主频下PWM输出频率为f_pwm 72MHz / 7200 10kHz如果正弦表200个点每个点更新一次占空比则正弦基波频率是f_sin 10kHz / 200 50Hz正好覆盖工频50Hz。如果后续要输出60Hz同样的载波下正弦表点数就要改为166或167点或者保持200点把载波调到12kHz。代码里我喜欢把“载波频率”“正弦表点数”“目标正弦频率”三者分开定义改频率时只改一个宏不用动中断函数。3.3 定时器配置与死区设置TIM1代码详解这块板子的代码基于STM32标准外设库Keil5直接编译。TIM1是关键外设配置代码分四步时钟、GPIO、时基、PWM输出通道和死区。下面是一段可用的初始化代码void TIM1_SPWM_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; TIM_BDTRInitTypeDef TIM_BDTRInitStructure; // 1. 使能TIM1和对应GPIO时钟PA8/PA9/PA10/PA11 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); // 2. 配置TIM1的PWM输出引脚为复用推挽输出 GPIO_InitStructure.GPIO_Pin GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure); // 3. 时基配置72MHz不分频ARR7200-1输出频率10kHz TIM_TimeBaseStructure.TIM_Period 7200 - 1; TIM_TimeBaseStructure.TIM_Prescaler 0; TIM_TimeBaseStructure.TIM_ClockDivision 0; TIM_TimeBaseStructure.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, TIM_TimeBaseStructure); // 4. 配置CH1和CH2为PWM1模式初始占空比50%对应双极性SPWM的0输出 TIM_OCInitStructure.TIM_OCMode TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_Pulse 3600; TIM_OCInitStructure.TIM_OutputState TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OutputNState TIM_OutputNState_Enable; // 使能互补输出 TIM_OCInitStructure.TIM_OCPolarity TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OCNPolarity TIM_OCNPolarity_High; TIM_OC1Init(TIM1, TIM_OCInitStructure); TIM_OC2Init(TIM1, TIM_OCInitStructure); // 5. 死区配置TIM_DeadTime大约为667ns TIM_BDTRInitStructure.TIM_OSSRState TIM_OSSRState_Enable; TIM_BDTRInitStructure.TIM_OSSIState TIM_OSSIState_Disable; TIM_BDTRInitStructure.TIM_LOCKLevel TIM_LOCKLevel_OFF; TIM_BDTRInitStructure.TIM_DeadTime 0x30; TIM_BDTRInitStructure.TIM_Break TIM_Break_Disable; TIM_BDTRInitStructure.TIM_BreakPolarity TIM_BreakPolarity_High; TIM_BDTRInitStructure.TIM_AutomaticOutput TIM_AutomaticOutput_Enable; TIM_BDTRConfig(TIM1, TIM_BDTRInitStructure); // 6. 使能TIM1更新中断用于周期性更新占空比 TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel TIM1_UP_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority 1; NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE; NVIC_Init(NVIC_InitStructure); // 7. 主输出使能这一步容易漏掉 TIM_CtrlPWMOutputs(TIM1, ENABLE); TIM_Cmd(TIM1, ENABLE); }这段代码有几个容易踩的点第一步必须使能AFIO时钟因为TIM1的复用功能在F103上需要AFIO时钟最后一步TIM_CtrlPWMOutputs则对应高级定时器的MOE主输出使能位如果漏掉这一句PWM引脚会一直处于高阻或空闲状态波形完全不出现很多人一开始查半天不知道问题在哪。死区配置那一行TIM_DeadTime 0x30表示死区时间约667ns。死区时间不是越大越好太大反而会引起输出波形失真和占空比丢失。我这块板子用的MOSFET输入电容不大667ns足够如果你换了大电流MOSFET要把死区适当加大到1微秒左右宁可牺牲一点波形质量也要保证不直通。3.4 中断里更新正弦表核心代码在TIM1的更新中断里每进入一次就更新一次占空比让占空比按照正弦表规律变化uint16_t sinTable[200]; // 正弦表在程序初始化时生成 void TIM1_UP_IRQHandler(void) { static uint16_t index 0; uint16_t ccr_value; if (TIM_GetITStatus(TIM1, TIM_IT_Update) ! RESET) { TIM_ClearITPendingBit(TIM1, TIM_IT_Update); // 从正弦表取当前占空比 ccr_value sinTable[index]; // CH1和CH2同时更新为同一个值实现双极性调制 TIM_SetCompare1(TIM1, ccr_value); TIM_SetCompare2(TIM1, ccr_value); // 指针循环 index; if (index 200) { index 0; } } }正弦表怎么生成一种是在程序初始化时用C代码当场算#include math.h void SPWM_SinTable_Init(void) { uint16_t i; float v; for (i 0; i 200; i) { // 中心是3600幅度3400即调制比约为0.944 v 3600.0f 3400.0f * sinf(2.0f * 3.14159265f * i / 200.0f); sinTable[i] (uint16_t)v; } }这里的关键公式是CCR值 中心值 幅度 × sin(角度)中心值是3600对应50%占空比幅度是3400也就是占空比在2.8%到97.2%之间变化调制比约为3400/3600 ≈ 0.944。为什么不把幅度也设为3600因为过高的调制比会导致过调制输出波形出现平顶而且实际死区会吃掉一部分占空比所以留出余量更稳妥。3.5 调制比与输出电压的计算用双极性SPWM时H桥输出基波电压幅值与调制比的关系是Uo_peak m × Vdc输出正弦电压有效值Uo_rms Uo_peak / sqrt(2) m × Vdc / sqrt(2)举个例子如果母线电压是155V目标输出110V交流有效值调制比取0.95Uo_rms 0.95 × 155 / 1.414 ≈ 104V看起来稍微偏低这时要么提高母线电压要么把调制比调大。如果你做的是220V交流输出母线电压至少要310V而且调制比要逼近1这时最好把母线电压升到350V以上否则输出有效值很难达到220V。这块板子最初设计时母线是低压可调的所以我只需要根据实测母线电压反推调制比即可。这个公式非常实用建议做逆变器的朋友直接抄下来调参时心里有数。4. Keil5工程实战从芯片配置到烧录调试4.1 拿到工程先看什么芯片型号与启动文件用Keil5打开XU程序-STM32-Code工程的第一步不要急着编译先确认芯片型号和启动文件是否匹配。工程里默认选的是STM32F103RCT6如果你手上的板子是F103C8T6容量不一样启动文件和Flash下载算法都要换。Keil5里查看芯片型号的方法是菜单Project - Options for Target - Device。启动文件在工程目录的Startup文件夹下F103系列要用startup_stm32f10x_hd.s大容量或者startup_stm32f10x_md.s中容量。C8T6是64KB Flash属于中容量RCT6是256KB Flash属于大容量。用错启动文件会产生很诡异的编译通过但运行不正常的问题。还有一个容易忽略的点是仿真器配置。打开Options - Debug左侧选择“ST-Link Debugger”然后点Settings确认能识别到目标芯片。烧录时如果提示“Flash Download failed - Target DLL has been cancelled”多半是Flash下载算法没选对在Flash Download页面Add一个对应容量的编程算法即可。4.2 标准库还是HAL库一个影响调试方式的决策这个工程用的是STM32标准外设库不是HAL库。这两种库现在都在广泛使用但风格差距很大。标准库的代码直观直接操作寄存器封装好的函数比如TIM_SetCompare1、TIM_Cmd逻辑链路清晰非常适合用来理解定时器高级功能HAL库则更抽象通过句柄和回调函数组织代码CubeMX可以生成初始化代码适合快速开发。我的建议是如果你是想彻底理解SPWM和TIM1的关系用标准库这个工程学习是很好的选择因为每一步都能看到寄存器级别的操作如果你是要在项目上快速迭代建议直接用CubeMX生成HAL工程再把中断里查表更新CCR的逻辑移植过去。核心逻辑完全一样HAL库对应的是__HAL_TIM_SET_COMPARE(htim1, TIM_CHANNEL_1, ccr_value)。4.3 编译、烧录与在线调试要点编译通过之后接上ST-Link烧录。烧录成功后先别急着上高压把示波器一通道接在CH1输出引脚二通道接在CH1N引脚先看PWM是否正常输出了10kHz互补波形。如果没有检查TIM_CtrlPWMOutputs这个函数是否执行了、GPIO是否配置为复用推挽。Keil5自带的调试器可以做简单验证进入Debug模式后打开View - Watch窗口添加TIM1-CCR1和TIM1-CNT单步执行或全速运行时观察CCR1是否按照正弦表规律变化。如果CCR1在跳变说明中断和正弦表正常问题大概率在输出电路或者引脚配置如果CCR1固定不变说明中断没触发优先查NVIC和TIM_ITConfig。在线调试还有一个技巧在TIM1_UP_IRQHandler里打断点然后全速运行断点应该每200微秒触发一次。如果断点触发频率不对说明定时器时钟分频或者ARR配置与预期不一致调整宏定义更方便。4.4 Keil5下的三个易踩坑这块板子调试过程中遇到过几个很典型的Keil5问题列出来给大家参考工程路径带中文或者空格编译报一堆莫名其妙错误。解决方案是把工程放到纯英文路径下Keil5对非ASCII字符的支持一直没做好。使用标准库时忘记定义USE_STDPERIPH_DEVICE宏导致编译报“core_cm3.h: No such file or directory”。在C/C选项卡的Define里加上这个宏即可。Keil5版本太新可能导致旧工程编译警告激增尤其是MDK 5.39以后对某些旧标准库文件有不兼容提示。这种问题通常不影响功能但如果强迫症想处理把编译器警告等级从AC5-Like改成AC5-Like并关掉部分告警即可。如果需要下载单独的STM32F1器件支持包在Keil5的Pack Installer里找到Keil::STM32F1xx_DFP安装即可。没有这个包Options for Target的Device列表是空的工程根本选不了芯片。5. 示波器实测与问题排查双极性波形的十个坑5.1 示波器探头怎么接必须以差分方式测桥臂输出很多朋友第一次测逆变板直接拿一根探头接地夹子夹到板子的GND然后测某个桥臂输出结果看到的波形要么全是毛刺要么形状完全不对。原因很简单H桥输出端相对GND是高幅值高频开关信号而且负载两端都是浮动的用单端探头测不出真正的负载电压。正确的做法是用示波器两个通道分别接桥臂输出A点和B点然后启用数学通道CH1-CH2观察差分电压波形。这样得到的是负载或者LC滤波之前的真实电压正半周是正脉冲序列负半周是负脉冲序列这就是双极性SPWM的原始形态。如果示波器只有两个通道也可以让两个通道都设为1:1探头分别接A和B用MATH相减如果示波器支持差分探头优先用差分探头抗共模干扰能力更强。5.2 第一次上电的检查清单逆变板第一次上电千万不要直接把310V母线电压怼上去。我的习惯是分三步走第一步用12V或者24V低压直流电源供电把程序烧进去先看PWM引脚波形。此时不需要接功率级输出甚至可以先断开MOSFET的母线供电只让控制部分工作确认TIM1四路PWMCH1/CH1N/CH2/CH2N都有互补输出死区时间符合预期。第二步接上H桥的24V低压母线空载测量桥臂差分电压确认LC滤波后输出波形是正弦波频率50Hz、波形无明显失真。这一步通过后再逐步升高母线电压。第三步升到目标母线电压接上额定负载的10%、25%、50%逐级测试同时观察MOSFET温度、电感和母线电流。任何一级出现异常立即停止升压回到低压状态排查。这里要特别提醒任何时候接触母线电容或者桥臂输出都要先确认电容放电完成220V级别以上的母线电容存电非常危险。板子断电后电容电压可能还保持在危险水平必须等几十秒或者用放电电阻手动放电再动手。5.3 常见故障与根因对照表这块板子从焊接完成到稳定输出前后遇到好几轮问题。下面这个表是我实际踩过的或者帮别人排查过的典型问题现象可能原因排查思路输出波形扭曲正负半周不对称调制比过高产生过调制或正弦表中心偏了用示波器看桥臂输出占空比变化规律把调制比降到0.8左右对比桥臂上管明显发烫自举电容太小或驱动芯片供电不足换大电容检查自举二极管是否压降过大开关瞬间出现严重振铃栅极驱动电阻过小回路寄生电感大加大栅极电阻到10-22欧优化布局走线带载后正弦波幅值骤降LC滤波器电感饱和或母线电压跌落查看电感是否发烫检查母线电容容量空载正常接负载就过流保护负载短路或启动浪涌电流过大接灯泡做限流负载观察启动瞬间电流输出频率偏高或偏低正弦表点数和载波频率不匹配复核基波频率公式f_sin f_pwm / NPWM输出全部为高电平MOE主输出使能位被硬件清零或者进入了刹车状态查看TIM1-BDTR寄存器检查BKIN引脚是否被拉低CH1和CH1N同时为高死区配置失败或芯片型号不支持互补输出检查BDTR初始化代码确认使用的是TIM1/TIM8高级定时器5.4 死区与过零失真的关系双极性SPWM的一个固有问题是过零附近的失真。理想情况下占空比从50%向两边变化时输出电压平均值应该平滑地穿越零点。但实际因为有死区时间每个开关周期都损失了一部分有效脉冲宽度导致输出电压在过零附近出现阶梯状畸变这就是所谓的“死区效应”。死区效应在轻载时尤其明显空载输出电压波形看起来可能有一小段平坦区。减小死区时间可以缓解但受限于管子安全软件上可以做死区补偿——根据电流方向在CCR值上叠加一个修正量抵消死区损失。对于这块板子来说如果只是验证波形不做补偿也能接受如果要做精密电源或者并网逆变器死区补偿就是必修课了。6. 从“能跑波形”到“长期可靠”布局、软启动与扩展思路6.1 布局布线的几个教训按键入第一版PCB时我把功率地和信号地连成一大片铜结果ADC采样噪声大得离谱波形毛刺也多。后来把功率部分单独铺地采样电路用单点接地连接到功率地噪声问题明显改善。逆变板布局有几个原则都是拿实测经验换来的母线电容尽量靠近H桥减小开关换流回路的寄生电感。这个回路的面积越小尖峰电压越小栅极驱动电阻放在MOSFET栅极脚旁边防止驱动回路串入干扰LC滤波电感远离控制电路和采样电路电感是强磁场源靠近了会影响ADC精度电流采样回路用差分走线避免功率电流流过采样地。6.2 软启动母线电容不是直接灌的逆变器上电瞬间母线电容充电会形成很大的浪涌电流容易把整流桥、保险丝或者母线电容本身打坏。解决方法是加软启动电路上电时通过一个功率电阻给电容充电等母线电压上升到接近目标值后用继电器或者三极管短路掉电阻。程序上也可以配合做软启动上电后先不输出SPWM等母线电压稳定后再逐渐把调制比从0升到目标值。这样做的另一层好处是避免SPWM启动瞬间产生很大的冲击电流。如果程序一上电就以满调制比输出变压器或者LC滤波器可能发出明显的“嘭”一声长期看会影响电感寿命。我的做法是在初始化函数里把正弦表指针清零同时让调制比从0开始每个正弦周期增加一点500毫秒内达到目标值。6.3 下一步可以怎么玩闭环、频率可调与更高载波这块板子的SPWM目前是开环的也就是调制比固定、输出频率固定。如果要做更实用的逆变器有几个扩展方向第一频率和调制比可调。把目标频率和调制比做成全局变量中断里实时读取可以实现变频功能。注意频率变化时正弦表指针要根据新频率做相位移位否则会出现频率跳变时的波形毛刺。第二输出电压闭环。用ADC采样滤波后的交流电压做RMS计算然后用PI控制器动态调整调制比补偿负载变化和母线电压波动。这个闭环做起来后板的实用性会明显提升。第三输出限流。把电流采样信号接入ADC实时限制输出功率超限时优先降调制比再不行就触发刹车封锁PWM。有这一层保护后板子才能放心接真实负载。我个人实际做下来最大的体会是SPWM这个课题真正难的不是那些正弦表、按键操作或者滤波公式而是“设计时觉得没问题一上电就出问题”的工程细节。你永远不知道是死区不够、自举电容小了、还是LC滤波器的电感饱和了。所以做逆变板一定要一步步来先用低压小功率验证算法再逐步加电压加负载。每次只改一个变量出了故障能快速定位这才是做电力电子项目最省时间的路径。本文还有配套的精品资源点击获取
返回列表