news 2026/10/29 4:05:38

GD32F330三相四桥臂逆变电源:10路PWM与15路采样时序设计

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
GD32F330三相四桥臂逆变电源:10路PWM与15路采样时序设计

简介:面向嵌入式电源与电力电子开发者的GD32F330三相四桥臂逆变电源设计参考,聚焦国产MCU在数字电源中的落地实现。内容围绕三相四线供电、电池充电、推挽升压DC/DC与四桥臂逆变架构展开,给出PWM及15路AD采样引脚分配,并说明DC/DC单电压环、R/S/T独立电压外环加电流内环、N相开环等控制策略与100kHz、19.2kHz开关频率设置。还涉及软件锁相、串口通讯、Flash模拟EEPROM、电池管理、过欠压/过流/短路/过温保护、在线升级和逻辑时序控制。资源包为1个PDF文档,约185KB,已有533人学习,适合对照原理、引脚定义与保护逻辑做方案设计或课程项目参考。

1. 一颗芯片同时管 10 路 PWM 和 15 路采样:先别急着看算力

第一次把三相四桥臂的方案往一颗 GD32F330 上压的时候,我最担心的是算力不够,结果真正卡了我两周的是外设:10 路 PWM 要成对互补还得带死区,15 路模拟量要在同一个 52 µs 的控制周期里采完,还要留一路刹车输入给硬件封波。gd32 做电源,三相逆变器这条线上的国产芯片选型,大家盯着主频和 Flash,落地时决定成败的往往是定时器通道够不够、互补通道能不能配成对、ADC 触发源能不能跟 PWM 对齐这几个硬约束。这里把一套已经跑起来的三相四桥臂逆变电源拆开讲:能量路径怎么分段、10 路 PWM 怎么排、15 路采样怎么排时序、三环加锁相怎么在 19.2 kHz 里塞进去,最后把调试台上翻过车的几处列出来。新手可以照着顺序做,熟手大概更关心我为什么这么分。

2. 系统结构先算账:三段能量路径和一颗芯片的资源边界

2.1 从市电到四桥臂:能量路径分三段,每段的控制节奏完全不同

这套系统的输入是三相四线市电,第一段是充电回路:市电经充电电路给电池充电,这段是慢过程,控制板在这条路上只需要做充电电流闭环、电池状态判断,以及没接电池、充满、亏电这些逻辑判定,实时性要求以毫秒甚至秒计。第二段是停电之后的推挽升压 DC/DC,把电池电压抬到母线电压,这段跑在 100 kHz。第三段是三相四桥臂逆变,把母线电压重新构造成三相交流,跑在 19.2 kHz。

之所以要拆成两段而不是一级搞定,是因为电池电压在一个很宽的范围里变化,而逆变侧希望母线尽量稳。推挽拓扑天生适合低压侧大电流、匝比固定的升压场合,变压器一次侧两管交替,二次侧整流后进母线电容,母线上的能量再由逆变级取走。三段路径对应的控制周期差了三个数量级,这个差异决定了中断优先级怎么排、哪些任务敢放在控制中断里、哪些必须甩到主循环。

我一般会先把这条路径画在纸上,标出每一段的开关频率、采样量、保护动作时间要求,再去对芯片外设。顺序反过来——先挑芯片再想架构——十有八九会在引脚或者定时器上卡住,改板是小事,改拓扑就伤筋动骨了。

2.2 为什么 DC/DC 跑 100 kHz、逆变只跑 19.2 kHz

推挽级选 100 kHz,是变压器体积、磁芯损耗和开关损耗三者折中的结果。频率往上走,变压器能变小,但推挽两管的开关损耗和驱动损耗跟着涨,二次侧整流的反向恢复也变难看;频率往下走,变压器和母线电容都变大。100 kHz 在这个功率段属于常规选择,磁芯和绕组的窗口都还宽裕。

逆变级选 19.2 kHz,考量的东西不一样。开关频率和控制频率是同一个数,意味着每个 PWM 周期只做一次采样和一次运算,没有双更新,也没有过采样。这样一来,死区在周期里的占比直接决定波形失真度:假设死区按 1 µs 设,52.08 µs 的周期里占了接近 2%,这个比例在轻载时会造成明显的过零畸变,但还能靠死区补偿拉回来;如果把开关频率再往上抬,死区占比降下来,开关损耗和驱动能力又变成新问题。

另一个约束是电流环带宽。工程上电流环带宽通常取开关频率的十分之一到二十分之一,19.2 kHz 对应大约 1 kHz 到 2 kHz 的环带宽,带三相不平衡负载、带整流性负载都够用。我倾向认为 19.2 kHz 这个数是按时钟整数分频下来的,整数分频的好处是采样点固定,不会每个周期抖一个计数,锁相和环运算的时序才好对齐。换成 20 kHz 分频系数不整,采样时刻会有小数抖动,短期看不出来,长期跑温漂和噪声都更容易冒头。

提示:控制频率等于开关频率时,采样到占空比更新之间固定有一个周期的延迟,做电流环设计时必须把这个延迟当成纯滞后环节算进相位裕度里,不然带宽一调高就振。

2.3 一颗 RBT6 的资源账:外设分配表比选型参数表更有用

这颗芯片在这套设计里承担的不只是采样和 PWM,串口通讯、内部 Flash 模拟 EEPROM 存参数、充电与电池管理、四类保护、串口在线升级、整机时序逻辑,全在同一颗片子上。所以在动手画原理图之前,我习惯先把外设占用列成一张表,把每个外设的“不可替代性”标出来——哪些功能必须挂在带互补和死区的定时器上,哪些可以退到通用定时器,哪些能用软件顶。

资源承担的职能配置方式余量关注点
TIMER0R/S/T 三相六路互补 PWM中心对齐,CH0/CH1/CH2 加三路互补通道,硬件死区,刹车输入死区寄存器与实际驱动延时是否匹配
TIMER15N 相桥臂上下两路CH0 加互补通道与三相的计数同步方式
TIMER2推挽 DC/DC 两路驱动通用定时器两通道,交替输出无硬件死区,必须软件或驱动侧补
ADC15 路模拟量规则组序列加 DMA 搬运,PWM 中点触发总转换时间必须小于控制周期
USART上位机通讯与在线升级与升级流程共用同一路升级时必须停 PWM
内部 Flash模拟 EEPROM 存参数双区备份加校验写入时机不能落在控制中断里

这张表真正有用的是最后一列。选型阶段看的是前三列,能不能干;调试阶段出问题的几乎全在第四列,干得稳不稳。举个具体的:内部 Flash 模拟 EEPROM 这件事,从功能上看完全没问题,写进去读出来都对,但它一旦被放进控制中断,擦写期间取指停顿会把 52 µs 的中断拉长到几百微秒,PWM 立刻失步。这类问题在资源表上看不见,只有把时序要求一起写进去才会暴露。

3. 10 路 PWM 的排布:互补、死区、刹车一个都不能少

3.1 三相互补交给 TIMER0,中线单独挂在 TIMER15

系统一共需要 10 路 PWM:推挽 DC/DC 两路,逆变四桥臂八路。R、S、T 三相各需要一对高低端互补信号,六路正好吃满 TIMER0 的三个通道和三路互补通道。引脚上,R 相高端 PA8、低端 PB13,S 相高端 PA9、低端 PB14,T 相高端 PA10、低端 PB15,低端全部走互补通道输出,这样死区由硬件插入,不用软件去算两个比较值之间的间隙。

第四桥臂,也就是中线 N 相,单独用 TIMER15 的一个通道加互补通道,高端 PB8,低端走对应的互补脚。这里有个细节值得说:三相互补和中线互补如果来自两个不同的定时器,它们之间的相位关系就必须显式对齐,否则中线桥臂的开关时刻会跟三相错开,中线电流的纹波会变大。常见做法是让两个定时器同时启动、共用同一个计数基准,或者在主定时器更新时同步触发从定时器。

把 N 相单独拿出来,是因为它在控制上跟三相不是一回事:R、S、T 是三个独立的电压外环加电流内环,N 相是开环。开环的意思是这一路不需要采样反馈参与运算,只需要按固定占空比输出,给中线电流提供一条低阻通路。这样做省掉了三路电流环的运算量和一路采样,代价是不平衡负载能力受限于中线电感的电流应力和开环占空比的固定值。这个取舍我在第 5 章会展开讲判断依据。

3.2 推挽两路挂在通用定时器上:没有硬件死区,这道坎得自己补

推挽 DC/DC 的两路驱动走 TIMER2 的两个通道,PC6 和 PC7。问题在于 TIMER2 是通用定时器,没有互补输出,也就没有硬件死区插入。推挽拓扑的两只开关管在变压器一次侧交替导通,理论上不会同时导通,但驱动延时、关断拖尾、布线不对称这几个因素叠在一起,实际波形上完全可能出现瞬间直通,母线一炸就是一片。

我的做法是三道防线叠着上。第一道是占空比钳位,把单管占空比硬限在 48% 以内,留出磁复位和死区的空间;第二道是软件死区,用千分比表示,按驱动和功率管的实际关断时间给;第三道是驱动侧的外部互锁,靠驱动芯片自身的死区或者 RC 延时网络兜底。三道里任何一道失效,另外两道还能挡住。

/* 推挽两路 PWM 的占空比钳位与软件死区,单位统一用千分比,避免浮点进中断 */ #define PP_DUTY_MAX_PERMIL 480u /* 单管最大占空比 48.0%,留 2% 给死区与磁复位 */ #define PP_DEAD_PERMIL 25u /* 软件死区 2.5%,100 kHz 下约 250 ns,按实测关断拖尾调整 */ #define PP_DUTY_MIN_PERMIL 0u static uint16_t pp_duty_permil = 0u; /* 由电压环输出调用,入参是千分比占空比 */ void push_pull_update(uint16_t duty_permil) { uint16_t ch_a, ch_b; if (duty_permil > PP_DUTY_MAX_PERMIL) { /* 第一道防线:硬钳位,环怎么算都越不过去 */ duty_permil = PP_DUTY_MAX_PERMIL; } if (duty_permil < PP_DUTY_MIN_PERMIL) { duty_permil = PP_DUTY_MIN_PERMIL; } pp_duty_permil = duty_permil; ch_a = duty_permil; /* A 管有效宽度 */ ch_b = duty_permil; /* B 管有效宽度,两管在半个周期内交替 */ /* 把有效宽度和死区一起换算成比较值,死区从有效宽度里扣,而不是加在周期上 */ timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_0, pp_permil_to_tick(ch_a)); timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_1, pp_permil_to_tick(ch_b)); }

这段代码里真正起作用的不是那两行写比较值的语句,而是上面两个宏。PP_DUTY_MAX_PERMIL决定了最坏情况下两管的重叠余量,PP_DEAD_PERMIL决定了这个余量怎么用掉。参数怎么调:先把示波器接在两管栅极上,看实际关断拖尾有多长,再把这个时间换算成千分比,留一倍余量写进死区宏;钳位宏则根据变压器匝比和最大母线电压反推,保证占空比顶到上限时母线也不会过压。改这两个数的时候一定要同步改,只改一个等于没改。

注意:软件死区只能保证两次写比较值之间有间隔,保证不了功率管真的关断。驱动侧的互锁不能省,尤其是推挽这种一次侧只有两只管的拓扑。

3.3 引脚分配表和布线代价:能跑通和能批量是两回事

把 10 路 PWM 落到具体引脚上,除了看定时器通道,还得看这几路在封装上的物理位置。这张表是我实际用的分配,最后一列是踩过坑之后补的备注。

引脚功能定时器通道备注
PC6DC/DC PWM1TIMER2_CH0通用定时器,无互补,软件死区
PC7DC/DC PWM2TIMER2_CH1同上,两路走线长度要对称
PA8R_PWM_HTIMER0_CH0高边,死区由硬件插入
PB13R_PWM_LTIMER0_CH0_ON互补通道,不可与高边交换
PA9S_PWM_HTIMER0_CH1与 R 相同一组,相位差 120 度
PB14S_PWM_LTIMER0_CH1_ON互补通道
PA10T_PWM_HTIMER0_CH2与 R、S 同组
PB15T_PWM_LTIMER0_CH2_ON互补通道
PB8N_PWM_HTIMER15_CH0独立定时器,需与 TIMER0 同步启动
互补脚N_PWM_LTIMER15_CH0_ON中线桥臂低边,与高边成对

这张表里容易忽略的是 PA8、PA9、PA10 这三个高边脚挨在一起,PB13、PB14、PB15 这三个低边脚也挨在一起,对 PCB 布线其实是好事:三相互补对可以走得比较短、比较对称。但有得必有失,PA8 到 PA10 这一排同时还是别的外设复用脚,一旦后面要加重映射的功能,就得先确认这几个脚还能不能保住。我在第二版板子上就吃过这个亏,为了加一路串口把某个复用脚改了,结果连带影响了 PWM 的输出极性配置,查了半天。

驱动到功率管的走线,我一般要求同一相的高边和低边走线长度差控制在很小范围内,三相对称性比绝对长度更重要。四桥臂比三桥臂多一对管,N 相的走线往往会绕远,如果 N 相开环输出固定占空比,走线不等带来的延时差会直接体现成中线电流的直流偏置,这个偏置在轻载时看不出来,满载不平衡的时候会顶到电感饱和。

4. 15 路采样塞进 52 µs:ADC 分组、触发时刻与对齐

4.1 15 路模拟量分三类,实时性要求差得很远

系统一共采 15 个量,看着多,但按实时性一分类就清楚了。第一类是控制环直接用的:三相输出电压 PA0 到 PA2,三相电感电流 PA3 到 PA5。这六路每个控制周期都要更新,晚一个周期环就会振。第二类是状态判断用的:三相市电电压 PA6、PA7、PB0,母线电压 PB1,电池电压 PC0,充电电流 PC1。这几路用于锁相、切换判断和保护,可以几个周期更新一次。第三类是慢变量:散热器温度 PC2,以及两路参数 PC4、PC5。温度的时间常数以秒计,参数口甚至是给产线标定用的,什么时候采都行。

引脚采样对象分类更新节奏
PA0 / PA1 / PA2R/S/T 相输出电压环内快变量每个控制周期
PA3 / PA4 / PA5R/S/T 相电感电流环内快变量每个控制周期
PA6 / PA7 / PB0R/S/T 相市电电压锁相与切换判断每几个控制周期
PB1母线电压保护与前馈每个控制周期
PC0电池电压电池管理毫秒级
PC1充电电流充电闭环毫秒级
PC2散热器温度过温保护秒级
PC4 / PC5参数 1 / 参数 2标定与配置按需

分完类,采样策略就出来了:不需要 15 路都按 19.2 kHz 更新。电流和输出电压这六路挂进规则组序列,由 PWM 触发、DMA 搬运,每个周期固定采一轮;市电电压和母线电压挂在同一序列的后面几位,跟着一起转,代价只是多几个转换周期;温度和参数口单独安排,放在主循环里按需触发一次单通道转换,不进控制中断。

4.2 采样时刻定在 PWM 中点,这是电流环能不能稳的分水岭

中心对齐的 PWM,计数器从 0 计到峰值再回到 0,一个周期里有两个时刻是开关动作密集区:计数器过零附近和过峰值附近。电感电流在开关管导通的瞬间会有一个尖峰,这是二极管反向恢复和寄生电容充放电造成的,宽度只有几十到几百纳秒。如果 ADC 触发点落在这个窗口里,采到的电流值会明显偏大,而且每次偏的量还不一样,环里就会表现成一类查不出原因的抖动。

我的做法是把 ADC 触发点定在计数器等于峰值的那一刻,也就是开关动作的中点。这个时候上管刚导通一半,电感电流处在平均值的附近,纹波的最小值和中点都在这个位置附近,采到的值最能代表这一周期的平均电流。三相输出电压也放在同一时刻采,这样电压环和电流环用的是同一个时间断面的数据,环之间的相位关系才干净。

提示:采样窗口要避开死区。死区期间上下管都关断,输出电压由续流路径决定,这时候采到的电压不代表实际输出,尤其轻载时误差很大。

4.3 转换时间预算:算得出来才敢排 15 路

很多人卡在这一步是因为没有把转换时间算清楚,凭感觉觉得“应该够”。算法其实很直接:每一路的采样时间加上转换时间,乘以序列长度,再加上 DMA 搬运和中断响应的开销,得到的就是一轮采样的总耗时,这个数必须明显小于控制周期 52 µs,而且要留出余量。

采样时间怎么定,取决于信号源的内阻。电感电流一般走霍尔或者采样电阻加运放,输出阻抗低,采样时间可以取短一点;输出电压经过分压网络,阻抗高一些,采样时间要长;温度是热敏电阻分压,阻抗最高,采样时间要给足。混在一个序列里的时候,就得按最长的那一路来算,或者干脆把高阻抗的慢变量从快序列里拆出去。

DMA 在这里的作用不是省 CPU,而是保证数据落点确定。规则组按序列转换,每转完一路就把结果搬到固定的数组位置上,CPU 在控制中断里直接读数组,不需要去查标志位、不需要判断是哪一路。这样中断里的代码是定长的,执行时间可预测,抖动就小。

4.4 控制中断的骨架:先算时间,再写算法

15 路采样加上三环运算、锁相、保护判断、状态机,全都要在 52 µs 里跑完。我的做法是先写一个空的中断骨架,量出固定开销,再往里填算法,填一段量一次,超了就往外挪。

/* 19.2 kHz 控制中断骨架,周期约 52.1 µs。顺序即优先级,越靠前越不能被拖 */ void ctrl_isr(void) { uint16_t i; gpio_bit_set(DEBUG_PORT, DEBUG_PIN); /* 示波器测中断耗时用,正式版本可保留 */ adc_dma_snapshot(); /* 把 DMA 搬好的 15 路数据拷进局部快照,防撕裂 */ /* 1. 保护判断放最前面,任何一路越限立刻封波,不等后面的运算 */ if (protect_check_fast() != 0) { pwm_emergency_stop(); /* 关 PWM 输出,同时置故障标志给主循环 */ gpio_bit_reset(DEBUG_PORT, DEBUG_PIN); return; } /* 2. 环内六路先做标定换算,定点乘加,无除法 */ for (i = 0; i < 6; i++) { ctrl_var[i] = adc_to_phys(i, adc_snap[i]); /* 查表加移位,避免浮点除法 */ } /* 3. 锁相每四个周期跑一次,摊薄运算量 */ if ((pll_tick & 0x03u) == 0u) { pll_update(&pll, ctrl_var[GRID_R], ctrl_var[GRID_S], ctrl_var[GRID_T]); } pll_tick++; /* 4. 三独立电压外环加电流内环,外环降速,内环每周期都跑 */ inverter_loop_run(&inv, ctrl_var); /* 5. 占空比写寄存器,最后一步,保证前面算多久都不会输出半成品 */ pwm_duty_commit(&inv); gpio_bit_reset(DEBUG_PORT, DEBUG_PIN); }

这段骨架的关键是顺序:保护最先、标定换算其次、慢任务用计数器摊薄、写占空比放最后。adc_dma_snapshot()那一步不能省,DMA 随时可能把新数据搬进来,直接在中断里读原数组会出现半新半旧的组合,表现出来是环里偶尔冒一个尖。DEBUG_PIN翻转是用来量中断实际占用时间的,占空比为 5% 说明 52 µs 里用了 2.6 µs,还有余量;占到 30% 以上就说明有浮点或者除法混进来了,得往下挪。

参数怎么改:pll_tick的掩码决定锁相多久跑一次,0x03 是四分之一速率,电网频率变化慢,这个速率够用;如果要做快速切换判断,可以改成 0x01。三环的具体系数不在这里调,但要知道外环的更新率是内环的几分之一,这个比值一旦定了,PI 参数就得按那个采样周期整定,中途改速率必须重调。

5. 三环加锁相加保护:19.2 kHz 里的优先级怎么排

5.1 三相独立电压外环加电流内环,中线开环的依据是什么

三相四桥臂的控制难点在零序。三个桥臂带三相对称负载时,中线没有电流,跟三桥臂没区别;一旦负载不平衡,中线电流必须有一条低阻通路,第四桥臂就是干这个的。常见的做法有两类:一类是三个桥臂各自做电压电流双环,第四桥臂单独闭环控制中线电流;另一类是三相独立双环,第四桥臂开环给固定占空比。

这套设计选的是后者。判断依据有三条。第一,运算量。三个独立双环已经是六个 PI 调节器,再加一个中线电流环就是七个,19.2 kHz 下每个周期都要算完,多一个环就多一份超时风险,而中线环的收益主要体现在中线电流波形的精细度上,对带载能力影响有限。第二,采样成本。中线电流需要额外一路采样,而 15 路已经把规则组占得比较满,再加一路就得砍别的或者拉长序列。第三,也是最实际的一条:开环的中线桥臂只要占空比选得合适,配合中线电感,能把中线电流的直流量基本吃掉,剩下的交流纹波由电感承担,对大多数不平衡负载够用。

代价也要说清楚。开环意味着中线桥臂不参与调节,中线电流的直流分量完全靠硬件参数匹配,一旦三相电感不一致或者驱动延时不对称,中线电流里会积累直流偏置,这个偏置在满载时会吃掉电感的饱和裕度。所以选这条路的前提是硬件一致性要够,产线要做电感匹配。

5.2 三次谐波注入:母线利用率提升的那 15% 是实打实省下来的

控制策略参考的是三次谐波注入法这一类思路:在正弦调制波里叠加一个三次谐波分量,三次谐波在三相里同相位,线电压里会互相抵消,相电压的峰值被削平,于是同样的母线电压下可以输出更大的基波幅值。

数字上很直观。纯正弦调制时,相电压基波幅值最大是母线电压的一半,也就是 0.5 倍;注入三次谐波之后,最大相电压幅值可以做到母线电压除以根号三,约 0.577 倍,提升幅度大约 15.5%。这 15% 不是纸面数字,它直接决定了同样母线电压下能不能带满载,或者同样的输出能力下母线电压能不能降一档、器件耐压能不能选低一档。

实现上,三次谐波不用单独去算,取三相调制波的最大值和最小值,用它们的中点作为零序分量注入,效果等价而且运算量小。这一段的实现要放在环运算之后、写占空比之前,而且必须三相同一个周期一起处理,不能一相一相来。

5.3 软件锁相:CMSIS 的正余弦怎么用,限幅怎么做

电网检测这块用软件锁相,靠的是把采到的三相市电电压做坐标变换,把交流量变成直流量,再用 PI 把直流量调到零,PI 的输出就是频率修正量,积分回来就是相位。变换过程里要用到正余弦,用的是 CMSIS 库里的浮点正余弦函数。

/* 单同步坐标系软件锁相的核心一步:用 CMSIS 正余弦构造 Park 变换 */ void pll_update(pll_t *p, int16_t ur, int16_t us, int16_t ut) { float alpha, beta, d, q, w; /* Clarke:三相转两相,系数用常量表,避免每周期重算 */ alpha = (2.0f * ur - us - ut) * ONE_THIRD; beta = (us - ut) * ONE_OVER_SQRT3; /* Park:用当前估计相位把交流量搬到旋转坐标系 */ d = alpha * arm_cos_f32(p->theta) + beta * arm_sin_f32(p->theta); q = -alpha * arm_sin_f32(p->theta) + beta * arm_cos_f32(p->theta); /* q 轴分量反映相位误差,PI 调节后得到频率修正 */ w = pi_calc(&p->pi, 0.0f - q); /* 频率限幅:超出范围说明电网异常,直接切内部基准自由运行 */ if (w > PLL_W_MAX) w = PLL_W_MAX; if (w < PLL_W_MIN) w = PLL_W_MIN; p->omega += w * TS; /* 积分得到角频率 */ p->theta += p->omega * TS; /* 再积分得到相位,TS 为控制周期 */ if (p->theta > TWO_PI) p->theta -= TWO_PI; if (p->theta < 0.0f) p->theta += TWO_PI; /* 市电幅值掉到阈值以下,判定为停电,置标志给主循环做切换 */ if (fabsf(d) < PLL_V_LOST) { p->lost_cnt++; } else { p->lost_cnt = 0u; } }

这段里最值得看的是两个限幅和那个lost_cnt。PLL_W_MAX和PLL_W_MIN卡住频率修正量的范围,是为了防止电网畸变或者缺相时 PI 积到一个离谱的值,等电网恢复时相位要花很久才拉回来,这个过程中如果发生切换,输出会瞬间冲击负载。lost_cnt做的是停电判定的去抖,单个周期幅值掉下去不算,连续多个周期才算,这样电网上的瞬时跌落不会引发误切换。

参数怎么调:TS是控制周期,必须跟实际中断周期一致,写成常数比运行时计算更稳;PLL_V_LOST按额定市电幅值的百分比给,一般取三成到五成,太低会在欠压时判不出来,太高会在正常波动时误判。

5.4 保护分两层:硬件封波管快,软件判定管全

保护这块我坚持分两层。第一层是硬件封波,把驱动故障信号或者过流比较器的输出接到定时器的刹车输入上,一旦触发,PWM 输出在几个时钟周期内被强制关断,不经过任何软件判断。这一层管的是短路、直通这类必须在微秒级切断的故障,靠软件根本来不及。

第二层是软件判定,用过欠压、过流过载、过温这些阈值去判断,动作时间在毫秒级,但覆盖面广、可以分级处理。比如输出过欠压可以设两级,一级告警降额,二级关机;过温也可以分级,先降载再关断。这两层的关系是:硬件层保证不炸,软件层保证不误动作、能记录故障原因。

注意:刹车触发之后不要立刻自动恢复。故障标志必须由主循环读取并记录,人工确认或者延时确认之后再清,否则一个间歇性故障会变成反复重启。

6. 避坑排查:调试台上翻过车的五件事

6.1 现象:推挽上电就炸管,波形上看两管有重叠

原因:TIMER2 是通用定时器,没有硬件死区,两路 PWM 的比较值是分别写的,写第一路和第二路之间存在几个指令周期的时间差;再加上驱动关断拖尾,两管在换向瞬间同时导通,一次侧相当于短路。

解决:先把单管占空比硬钳到 48% 以下,再在驱动侧加互锁,最后才靠软件死区补。顺序不能反,软件死区是补最后一道的,不是拿来当主防线的。改完之后用电流探头看一次侧电流,换向时应该有一个明显的死区平台,没有平台就是还没补到位。

6.2 现象:输出波形偶尔畸变,示波器上看某些周期的占空比明显不对

原因:控制中断超时。中断里塞了浮点除法做标定换算,还有一处调试用的串口打印没删。19.2 kHz 的周期是 52 µs,一次除法加上串口等待能把中断拉到七八十微秒,下一个周期的中断被推迟,占空比就错位了。

解决:把标定换算改成查表加移位,串口打印全部挪到主循环,用 DEBUG 引脚翻转量中断占用时间。改完之后中断占用从满载降到个位数百分比,畸变消失。这类问题的坑在于它是偶发的,负载轻的时候不出现,一加负载就冒出来,容易被误判成功率器件问题。

6.3 现象:电流环一直小幅振荡,换了 PI 参数也压不住

原因:ADC 触发点落在了开关沿附近。电感电流在开关动作瞬间有尖峰,采到这个尖峰后环里算出来的值偏大,环就往下压,下一个周期又采到谷值,来回形成极限环。调参数只能改变振荡幅度,改不了根因。

解决:把 ADC 触发源改成 PWM 中点,也就是计数器等于峰值时触发,同时把采样窗口挪到死区之外。改完之后同一个 PI 参数下振荡直接消失,说明之前的参数其实一直在补偿采样误差。这里还有个连带经验:采样时刻改了之后,PI 参数要重新整定一遍,因为采样到更新的延迟变了。

6.4 现象:改参数保存后偶发丢配置,重启回到默认值

原因:内部 Flash 模拟 EEPROM 的写入放在了控制中断里,擦写期间取指停顿把中断拉长,同时又碰上掉电,写了一半就断电,那一页数据全废。另一个隐患是只写了一份没有备份,校验失败就没有退路。

解决:写入动作只在停机状态或者主循环里做,写之前先关掉 PWM 输出,写完再恢复;存储用双区加校验,A 区写坏了从 B 区读;写之前把关键参数先写进 RAM 副本,掉电重启后先读副本再读 Flash,两者不一致按校验通过的算。这套做完之后,产线反复上下电几百次没再丢过参数。

6.5 现象:停电切换瞬间输出冲击大,有时直接触发过流保护

原因:软件锁相在电网幅值跌落时没有及时判定停电,相位还在跟着一个已经畸变的电网跑,等真正切换的时候相位是乱的,逆变器按错的相位起振,输出瞬间冲击负载。根因不是切换逻辑,是锁相的停电判定没有去抖,也没有频率限幅。

解决:加连续多周期的幅值判定做去抖,加频率限幅防止 PI 积分跑飞,再加一个相位连续性检查,切换时保证逆变输出从当前相位接上,不是从零开始。这三条加上去之后,切换瞬间的冲击电流降了一大截,过流保护不再误动。

7. 从空板到带载:我最后复核的那张清单

调试到后面我基本不靠灵感了,靠一张固定顺序的清单,一步一步来,每一步不通过就不往下走。空板第一次上电只给控制电,功率电全部断开,先用示波器把 10 路 PWM 全量一遍,重点看三相互补的死区是不是一致、推挽两路有没有重叠、中线和三相的启动时刻是不是同步。这几项里任何一项不对,后面所有的波形问题都会被它污染,查起来就是玄学。

步骤上电范围观察点通过标准
1仅控制电10 路 PWM 波形、死区、相位三相互补死区一致,推挽无重叠
2控制电加低压直流推挽空载升压、母线建立母线电压稳定,无过冲
3母线供电,逆变空载三相输出波形、锁相跟踪波形正弦,相位跟电网同步
4三相阻性负载输出电压调整率、电流环满载压降在设定范围内
5单相满载不平衡中线电流、母线纹波中线电流在电感裕度内
6反复掉电切换切换瞬间冲击、相位连续性不触发过流,输出无跳变

这张表里第 5 步是最容易被跳过的一步。三相对称负载跑得再漂亮,也不能说明四桥臂设计成立,中线开环这条路的全部风险都压在不平衡负载上。我一般会直接把单相满载、另外两相空载这个工况跑满半小时,用热像仪看中线电感和第四桥臂的温度,温度上得比预期快,就说明开环占空比选得不合适或者电感量不够。

回过头看,这套设计真正花时间的不是算法,是资源分配和时序对齐这两件事。一颗芯片同时管 10 路 PWM 和 15 路采样,能不能成,在画原理图之前就基本定了,后面调试只是把当初的判断验证一遍。从那以后我每次投新板,都强制先把 10 路 PWM 用示波器轮着量一遍死区和相位,再上功率电——这一步花十分钟,能省掉后面几天的排查。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/29 4:05:37

企业微信非官方API开发:混合驱动方案实战解析

1. 企微非官方API开发背景与挑战企业微信作为国内主流的企业级通讯工具&#xff0c;其官方API存在诸多限制&#xff1a;接口调用频率受限、功能模块开放不全、审批流程复杂。这直接导致了许多企业级自动化需求无法通过官方渠道实现。去年我们团队为某零售企业做库存预警系统时&…

作者头像 李华
网站建设 2026/10/29 4:05:36

HyperFrame实战:用标签生命周期管理告别地图数据暴力刷数

干地图数据标注这一行&#xff0c;你多半见过这个场面&#xff1a;数据生产线的同事拿着新版本规范冲过来&#xff0c;说“标签规则又改了&#xff0c;今天上线的这批数据得全部洗一遍”。然后整个团队就陷入改脚本、跑批、校验、回滚的循环。HyperFrame&#xff08;在多数讨论…

作者头像 李华
网站建设 2026/10/29 4:05:17

Sysmac Studio中文手册:PLC编程、EtherCAT与运动控制避坑指南

简介&#xff1a;这份 Sysmac Studio 中文手册面向具备电气系统知识、正在学习 PLC 的电气工程师、设计人员、安装维护人员及职能系统管理者&#xff0c;帮助读者掌握欧姆龙自动化软件在 NJ/NX/NY 系列控制器上的编程、设备设置与系统设计。资源包内含 1 个 PDF 文件&#xff0…

作者头像 李华
网站建设 2026/10/29 4:05:16

多智能体协作最后一公里:Agent-Reach触达调度与容错设计

做多智能体系统的人&#xff0c;十有八九都会被同一个问题卡脖子&#xff1a;单看每个Agent都挺聪明&#xff0c;一旦让它们协作干活&#xff0c;就跟临时拉来的团队一样互相找不到人、说不清楚话、活推来推去。我自己也折腾过几套方案&#xff0c;从给每个Agent塞自定义工具脚…

作者头像 李华
网站建设 2026/10/29 4:04:29

模板代码生成技术:原理、实践与应用场景

1. 模板代码生成的基本概念在软件开发领域&#xff0c;模板代码生成&#xff08;Template Code Generation&#xff09;是一种通过预定义的模板自动生成重复性代码的技术。它就像是一个智能化的代码复印机&#xff0c;能够根据开发者设定的规则和参数&#xff0c;快速产出符合特…

作者头像 李华
网站建设 2026/10/29 4:04:09

具身智能机器人的商业应用与技术解析

1. 具身智能机器人的商业价值与技术架构解析2026年的营销战场将迎来一位新主角——具身智能机器人。这类拥有物理形态的AI实体正在突破传统虚拟助手的局限&#xff0c;通过多模态交互能力重塑人机协作模式。百度最新白皮书揭示&#xff0c;到2026年全球服务机器人市场规模预计突…

作者头像 李华