双向可控硅功率可调:过零检测与触发链路工程化调试

发布时间:2026/11/4 15:12:24
双向可控硅功率可调:过零检测与触发链路工程化调试

1. 从"点亮"到"调得准":第二篇真正要补的三块短板

上一篇把双向可控硅的基本脾气、功率可调的两种思路、过零检测电路的大致框架都过了一遍,很多人照着搭出来,灯是亮了,但一上示波器就露馅:过零信号毛刺一片,触发角飘来飘去,调到 30% 的时候灯在闪,稍微带个变压器负载干脆半个周期不导通。这一篇就专门解决这些"亮是亮了但用不了"的问题。内容围绕三件事展开:过零检测电路怎么从原理图变成一条干净的方波、双向可控硅的触发链路里每个电阻的取值依据、以及单片机侧怎么把功率稳稳地分配到每一个工频周期上。适合已经搭过一遍基础电路、手里有示波器和烙铁、想把东西做成能长期跑的读者;完全零基础也能看懂思路,但落地时建议先把上一篇的框架补上。

1.1 第一篇停在哪,这一篇从哪接

上一篇的重点在"认识器件":可控硅怎么导通、怎么关断、门极需要什么条件、过零检测大概长什么样。那时候给的电路是能工作的最小版本,很多参数写的是"典型值",比如限流电阻"取 100k 到 1M 之间"、门极电阻"300Ω 左右"。这种写法在原理层面没问题,真焊板子就会出问题——100k 和 1M 差十倍,光耦的输入电流差十倍,CTR 衰减之后输出可能压根拉不动上拉电阻。

所以这一篇的定位是"把典型值变成确定值"。每一个电阻我都会给出计算过程,告诉你为什么是 360Ω 而不是 300Ω,为什么限流电阻要用四只串联而不是一只大阻值,为什么缓冲电容的耐压必须选 630V 而不能用 400V。这些细节在实际调试里决定成败,但它们几乎不会出现在器件手册的典型应用图里,因为手册默认你是熟手。

1.2 整条信号链拆开看:从 220V 到门极脉冲

把整机拆成四段来看,思路会清楚很多。第一段是采样段:220V 交流经过限流电阻进光耦发光二极管,光耦在电压接近零点时输出翻转,产生过零脉冲。第二段是决策段:单片机捕获这个脉冲,记录周期、计算延时、决定这一拍要不要触发。第三段是驱动段:单片机 IO 经过三极管或者直接 drives 光耦输入,光耦输出经门极限流电阻送到可控硅门极。第四段是功率段:可控硅主端子串在负载回路里,两端并上 RC 缓冲。

四段之间存在明确的时序依赖:采样段的延迟会传递给决策段,决策段的定时误差会传递给驱动段,驱动段的光耦上升时间又会叠加到实际触发角上。很多人调试时只盯着一个环节看,结果怎么调都对不上,就是因为没意识到误差是沿着链路累积的。我的习惯是把每一段的延迟单独测出来记在本子上,最后算总账。

1.3 冷热地边界:这条线画错,后面全白搭

只要涉及市电,隔离就是第一条纪律。光耦存在的意义不只是"传递信号",更重要的是把热地(和市电有电气连接的那一侧)和冷地(单片机、调试器、电脑 USB 那一侧)彻底隔开。这条边界一旦被破坏,比如示波器探头的地夹夹到了热地上,轻则烧探头,重则整个调试链路带电。

注意:调试带市电的板子,示波器要么用隔离变压器给被测板供电,要么老老实实用差分探头。用普通探头的地夹去夹热地,等于把市电直接短接到大地,非常危险。这一条不管做多少次都别图省事。

隔离边界在 PCB 上也要有物理体现:光耦本体下方开隔离槽,两侧铺铜不要跨越,爬电距离按加强绝缘来留够 8mm 以上。这不是形式主义,潮湿环境下 4mm 的间距是真的会打火的。

2. 过零检测电路:把正弦波切成一条干净的方波

过零检测的本质是把 50Hz 正弦的过零点转换成数字脉冲,供单片机捕获。听起来简单,但"零点"在工程上从来不是一个点,而是一个区间。真正要确定的是:你要检测的是电压过零还是电流过零、允许的相位误差是多少、脉冲宽度留多宽才既不会被漏掉又不会掩盖真正的零点位置。这三个问题想清楚了,电路拓扑和参数自然就定了。

2.1 三种常见拓扑摆在一起比,最后为什么选光耦方案

常见的过零检测有三条路:变压器降压后比较、电容降压后比较、光耦直接跨接在交流线上。

变压器方案的好处是天然隔离、波形干净,缺点是体积大、成本高、空载损耗下不来,小功率产品里基本被淘汰了。电容降压方案成本极低,但它是非隔离的,整板带电极不安全,而且电容老化后容值漂移,过零点跟着跑,长期可靠性差——我个人非常不建议新手碰这条路。

光耦方案是目前的主流:一只双向光耦(内部两只反并联的发光二极管)串一只限流电阻直接跨在交流线上,输出侧接上拉电阻到单片机电源。交流电压绝对值超过光耦的导通阈值时发光,低于阈值时熄灭,于是在每个过零点附近输出一个低电平脉冲。优点是隔离、体积小、成本可控、延迟可算;缺点是功耗都消耗在限流电阻上,而且脉宽受器件离散性影响,需要实测确认。

我最后选它,核心原因是可预测。限流电阻的功耗能算、光耦的传输延迟手册里有、脉宽能用公式估出来再实测校正,整条链路的误差都在可控范围内。

2.2 限流电阻的阻值和功率必须一起算

这是最容易翻车的地方。很多人算完阻值就下单,结果电阻通电三秒钟开始冒烟。

先说阻值。市电有效值 220V,峰值是 220 × 1.414 ≈ 311V。光耦发光二极管的正向压降按 1.2V 算,希望的工作电流取 2mA 到 3mA(取值偏小是为了降低功耗,同时给 CTR 衰减留余量):

R = (Vpk - Vf) / If = (311 - 1.2) / 0.0025 ≈ 124kΩ

取 120kΩ 到 150kΩ 之间都合理。如果选的是高灵敏度的双向光耦,1mA 就能可靠导通,阻值可以上到 300kΩ,功耗进一步降低。

再说功率,这一步千万别省:

P = U²/ R = 220² / 120000 = 0.403W

单只 1/4W 电阻扛不住,必须用 1W 以上的,或者拆成多只串联分摊。我通常用四只 30kΩ 的 1/4W 电阻串联,总阻值 120kΩ,每只承担约 0.1W,余量充足。

提示:串联不只是为了分摊功率,更重要的是分摊耐压。常用的 0805 贴片电阻额定工作电压大约 150V,1206 约 200V,而这里单个位置要承受 311V 峰值。一只贴片电阻直接跨在这里,短期可能没事,长期存在击穿风险。四只串联,每只承受约 78V,安全余量很大。

顺带说一句,电阻选金属膜而不是碳膜,碳膜电阻的温度系数大,阻值随温度漂移会让过零点慢慢偏移,虽然偏得不多,但对于要做精确移相的场景,这就是个隐患。

2.3 输出侧的上拉、滤波与脉宽的实测波形

光耦输出侧是一只光敏三极管,集电极接上拉电阻到 VCC,发射极接地。没光的时候三极管截止,输出高;有光的时候导通,输出低。所以过零点对应的是低电平脉冲,这个极性在写中断程序时要注意,别配反了边沿。

上拉电阻取 4.7kΩ 到 10kΩ 之间。取值小,上升沿陡、抗干扰好,但光耦导通时的灌电流大;取值大,功耗低,但上升沿被 RC 拖慢,过零点定位精度下降。我一般用 10kΩ,兼顾两者。

关于滤波,这里有个反直觉的结论:不要加大电容滤波。很多教程建议在输出端并 100nF 甚至 1μF 电容"消除毛刺",实际上这会把脉冲宽度拉宽、把边沿延迟,直接破坏过零点的相位精度。10kΩ 配 100nF 的时间常数是 1ms,相当于把整个脉冲往后拖了将近 1ms,对应工频相位 18°,移相控制直接就废了。

正确的做法是硬件上只做小电容(100pF 级别)滤高频,主要靠软件消抖。

脉宽的理论值可以估一下。正弦波在零点附近的斜率是:

dV/dt = Vpk × 2πf = 311 × 314 ≈ 97600 V/s ≈ 0.098 V/μs

光耦导通阈值约 1.2V,那么从零点上升到导通阈值需要的时间约 1.2 / 0.098 ≈ 12μs,正负半周各一次,理论脉宽约 24μs。实际因为光耦的传输延迟、CTR 离散性、上拉电阻的充放电时间,实测通常在 100μs 到 500μs 之间。这个偏差是正常的,重要的是每次的脉宽要稳定,抖动大才说明有问题。

2.4 零点抖动和脉宽漂移的四个来源

实际调试中,过零信号不稳通常来自四个地方。

第一个是限流电阻的温漂。通电后电阻发热,阻值变化,光耦电流跟着变,导通阈值对应的相位点就偏了。解决办法是留足功率余量,把电阻的温升压在 20℃ 以内。

第二个是光耦本身的传输延迟离散性。同一批次的器件延迟一致性还行,跨批次可能差几十微秒。如果做批量产品,这个要在软件里做一次标定。

第三个是电源纹波。上拉电阻接的 VCC 如果不干净,比较阈值跟着抖,脉宽就抖。单片机的 VCC 一定要加 100nF 加 10μF 的组合滤波。

第四个最隐蔽——地线干扰。光耦输出侧的接地点如果和可控硅的驱动回路共用一段走线,可控硅每次触发时的大电流脉冲会在地线上产生毫伏级的尖峰,叠加到过零信号上就是毛刺。解决办法是过零检测的输出地单独走一根线回单片机的地,中间不和其他大电流回路交汇。这个细节在原理图上看不出来,只有在 PCB 布局时才体现,但它是"信号明明算对了却总是误触发"的头号原因。

3. 触发链路:光耦、门极电阻与缓冲网络

过零信号解决了"什么时候该动",接下来要解决"怎么把可控硅打开"。这一段涉及三个元件:隔离光耦、门极限流电阻、RC 缓冲网络。每一个都有明确的取值逻辑,不能凭手感。

3.1 过零型与随机型光耦,选错了整个方案就废了

可控硅驱动光耦分成两大类:过零型(内部带过零检测,只有两端电压接近零时才允许输出触发脉冲)和随机型(也叫非过零型,输入有信号就立即输出)。

过零型的好处是天生抑制干扰,因为它只在电压过零点附近开通,产生的 dV/dt 和射频干扰极小,适合做"开关"用——比如控制加热管通断、控制电机启停。缺点是它没法做移相,因为你想在 90° 触发,它偏要等到下一个过零点才动。

随机型的自由度大,可以在任意相位触发,是移相调功的必需器件。代价是开通瞬间的 dV/dt 大,电磁干扰明显,必须靠 RC 缓冲和电感滤波来压。

这里有个非常经典的坑,值得单独说:过零型光耦驱动感性负载时会丢波。原因是感性负载的电流滞后于电压,当电压过零时电流还没过零,可控硅仍然导通,两端电压接近零;等到电流过零、可控硅自然关断时,两端电压已经不为零了,此时光耦内部的过零检测认为"不在零点",拒绝输出触发脉冲,于是下一个半周直接缺失。表现出来就是变压器或电机带不动、嗡嗡响、只有半个波在工作。

解决路子有三条:换成随机型光耦,用软件在过零点附近触发;在负载两端并联一只合适的假负载电阻,让电压在过零附近有个确定的通路;或者干脆放弃过零型,改用继电器加过零投切。我一般首选第一条,控制权在软件手里,灵活得多。

3.2 门极限流电阻怎么算,为什么常用 360Ω

光耦输出侧是一只光敏可控硅,它串在门极回路里。当光耦导通时,MT2 的电压经过这只电阻打到门极上,产生触发电流。电阻的作用是限流,防止门极电流过大烧掉光耦或者门极。

计算依据是光耦允许的浪涌电流。以常见的随机型光耦为例,输出侧额定电流 100mA,允许的峰值浪涌约 1A。市电峰值 311V,那么:

Rmin = Vpk / I_peak = 311 / 1 = 311Ω

取 330Ω 到 360Ω 是安全的。如果电阻取得太小,比如 100Ω,峰值电流能到 3A,超出光耦承受能力,短期内可能看不出来,长期就是随机失效。取得太大,比如 1kΩ,峰值电流只有 0.3A,对于需要 30mA 以上门极电流的大功率可控硅,触发就变得勉强,尤其在低温环境下更明显。

功率方面,这只电阻看着工作电流大,但实际导通时间极短。可控硅一旦开通,MT1 和 MT2 之间的压降被钳位在 1V 左右,电阻两端的电压骤降,电流自然就衰减下去了。所以平均功耗很小,但瞬间要能扛住浪涌,选 1W 的金属膜比较稳妥。

另外补一个容易忽略的点:门极和 MT1 之间最好并一只 1kΩ 的下拉电阻。作用是防止漏电流或干扰把可控硅误触发。有些应用里省掉它也能工作,但在干扰大的场合,比如附近有电机、继电器频繁动作,这只电阻能省掉很多莫名其妙的故障。

3.3 RC 缓冲网络:抑制 dV/dt 的保险,也是效率的负担

可控硅关断的瞬间,负载侧的电感(哪怕只是走线的分布电感)和可控硅的结电容会形成高频振荡,产生很大的 dV/dt。如果这个变化率超过器件的承受能力,可控硅会误导通,表现为关不断、半波工作、或者干脆失控。

RC 缓冲网络就是并联在 MT1 和 MT2 之间的一个"泄压阀"。典型取值是 100Ω 串联 0.1μF。计算思路是这样的:可控硅关断后,负载电压要通过 RC 才能上升,上升时间被拉长,dV/dt 就降下来了。粗略估算:

dV/dt ≈ Vpk / (R × C) = 311 / (100 × 0.1e-6) = 31 V/μs

这个数值低于大多数可控硅的静态 dV/dt 极限(通常在 50V/μs 以上),留有余量。如果负载是感性很强的场合,比如变压器,可以把电容加大到 0.22μF,或者把电阻减小到 47Ω,进一步压低 dV/dt。

代价有两个。一是电容在每次电压变化时都要充放电,产生额外的无功电流,待机时有微小功耗,也会让负载上有一点漏电流。二是电容本身的耐压必须够,标称 400V 的电容在 311V 峰值下长期工作余量不足,必须选 630V 的 CBB 或者 X2 类安规电容。

注意:RC 缓冲电容绝对不能用电解电容,也不能用普通陶瓷电容。必须是金属化聚丙烯薄膜电容,这类电容能承受频繁的充放电冲击和较高的 dV/dt。用错电容的后果是电容内部击穿短路,可控硅直接失控。

还有一种情况要提醒:容性负载(比如带电容滤波的电源模块)上电瞬间相当于短路,冲击电流极大,RC 缓冲不但帮不上忙,还会加剧冲击。这类负载前面要加 NTC 热敏电阻或者限流电路,不能指望可控硅自己扛。

3.4 布板、散热与那些不写进原理图的细节

原理图正确但板子跑不稳,八成是布局的问题。

第一条是隔离带。光耦下方建议开槽,两侧的铺铜保持 8mm 以上的间距。如果做不到开槽,至少保证隔离带内没有过孔、没有走线、不铺铜。潮湿、灰尘、长期工作后的表面污染都会让绝缘电阻下降,8mm 是针对 220V 加强绝缘的常规要求,别压缩到 4mm 以下去省空间。

第二条是门极回路的走线。从光耦输出到门极电阻再到可控硅门极,这条线要短、要粗,不能和主回路的大电流走线并行。并行会产生磁耦合,大电流切换时的 di/dt 在门极回路上感应出尖峰,轻则误触发,重则烧门极。如果实在避不开,中间加一条地线做屏蔽。

第三条是散热。可控硅的通态压降大约 1V 到 1.5V,10A 电流就是 10W 到 15W 的发热。TO-220 封装不加散热片,热阻大约 60℃/W,10W 就是 600℃ 温升,显然撑不住。按实际电流选散热片:5A 以内可以用小铝片,10A 以上必须用带翅片的散热器,并且涂导热硅脂。结温控制在 100℃ 以内比较稳妥,留 25℃ 余量。

第四条是主回路走线。可控硅的 MT1、MT2 引脚之间的走线要尽量短而宽,减少寄生电感。负载回路的走线如果太长,关断时的感应电动势会叠加到可控硅两端,配合 RC 缓冲也压不住。经验值是回路面积控制在 10 平方厘米以内。

4. 功率可调的两条路线:移相和整周波

"功率可调"这四个字听起来是一个功能,实际上有两种完全不同的实现哲学,选错了方向,后面怎么优化都是徒劳。这一节把两条路线的原理、代价、适用负载讲透,最后给一张对照表。

4.1 移相调功:连续平滑,代价是谐波和干扰

原理很直观:每个半周从过零点开始计时,延时一段时间再触发可控硅,剩下的半个周期导通。延时越长,导通角越小,输出的有效值电压越低。

有效值电压和触发角的关系可以用公式算:

Vrms(α) = Vfull × √(1 - α/π + sin(2α)/(2π))

其中 α 是触发角,单位弧度。代入几个关键点看看:

触发角 α导通角输出电压相对功率
0°180°220V100%
45°135°201V83%
90°90°156V50%
135°45°105V23%
180°0°0V0%

注意 90° 对应的是 50% 功率,不是 50% 电压——因为功率和电压的平方成正比,155V 的平方是 220V 平方的一半。这个非线性意味着控制上要做查表或者反函数运算,直接用线性映射会导致调光手感很差,低端变化太快、高端变化太慢。

移相调功的优点是无级连续、响应快、成本低,缺点是波形残缺。每个半周只有一部分导通,相当于把正弦波切了一刀,产生的谐波从 3 次一直到几十次都有。这些谐波在电网上的传导会干扰其他设备,在负载上会产生噪音(白炽灯在低亮度时嗡嗡响、电机发热严重),而且功率因数很低,低导通角时可能只有 0.5 左右。

4.2 整周波调功:干净利落,但要解决"闪"和"慢"

另一条路线是整周期控制,也叫周波控制或者循环控制。做法是:以一个固定长度的周期组为基本单位(比如 1 秒,包含 50 个工频周期),在这一组里选通 N 个完整的工频周期,其余周期完全不通。输出功率就是 N/50。

这样做的好处非常明显:可控硅只在过零点开通和关断,波形是完整的正弦,没有谐波,没有干扰,功率因数是 1。缺点是输出的能量是脉动的,负载上会看到一段有电一段没电的交替。

对于加热管这类热惯性大的负载,1 秒的周期完全感觉不到,这是最理想的方案。对于白炽灯,1 秒周期会看到明显的闪烁,必须把周期缩短到 200ms 甚至 100ms 以内,但周期太短又会导致分辨率下降(200ms 只有 10 个周期,功率只能按 10% 步进)。

电机负载要更小心。单相电机在整周波控制下会频繁经历启动和停止,启动电流是额定电流的 5 到 7 倍,频繁通断会烧绕组。这类负载要么用移相控制做软启动,要么干脆用变频方案,别用可控硅硬扛。

4.3 负载类型是最终裁判

选路线的时候,负载性质比什么都重要,我按经验整理了一份判断依据。

纯阻性负载(白炽灯、电热丝、电热管、PTC 加热器):两条路都能走。要求调光无闪烁就选移相,要求低干扰、高功率因数就选整周波。加热类的场合我几乎都选整周波,稳定可靠。

感性负载(变压器、电机、带铁芯的电感线圈):首选整周波,因为移相控制会产生不对称的正负半周。为什么会不对称?正半周和负半周的电感储能不同,如果触发角控制得不够精确,两个半周的导通时间会有偏差,产生直流分量。这个直流分量加到变压器绕组上,会让铁芯逐渐饱和,励磁电流激增,轻则过热,重则烧毁。这是移相控制带感性负载最危险的地方,很多教程一笔带过,实际后果很严重。

容性负载(带整流桥和电容滤波的电源):可控硅开通瞬间电容相当于短路,冲击电流极大,可能直接超过器件的浪涌承受能力。这类负载必须加限流措施,比如 NTC 热敏电阻或者串联电感,而且触发时刻要选在电压峰值附近,减少电流冲击。

4.4 一张对照表说清楚选型

对比维度移相调功整周波调功
输出连续性无级连续离散,取决于周期数
谐波含量高,随导通角减小而增加理论上无
功率因数低,0.5 到 0.9接近 1
电磁干扰大,需要 LC 滤波极小
响应速度快,单个半周即可改变慢,至少一个周期组
负载适应性阻性、白炽灯阻性、感性、大功率加热
典型应用调光台灯、电风扇调速加热设备、恒温控制
器件要求随机型光耦过零型光耦

5. 单片机这一侧:中断、定时和功率分配算法

硬件把路铺好了,剩下的活全在软件。这一节讲三个东西:过零中断怎么捕得稳、移相定时怎么算得准、整周波功率怎么分得匀。

5.1 过零中断的捕获与消抖

过零信号进来,第一反应是配外部中断。有一个细节要注意:过零脉冲是低电平有效,所以要配成下降沿触发,而且最好同时打开双边沿或者用定时器输入捕获,这样能同时拿到正半周和负半周的零点位置。

单纯用下降沿触发的问题是,如果脉冲有毛刺,会误触发多次。软件消抖的做法是:进中断后关中断,读定时器计数,如果距离上次中断的时间小于 9ms(半个工频周期减去合理余量),判定为毛刺直接丢弃;如果大于 11ms,说明丢了一个半周,要做失步处理,重新同步相位。

void zero_cross_irq(void) { uint16_t now = timer_get_count(); uint16_t dt = now - last_tick; disable_irq(); if (dt < TICK_MIN) { /* 9ms 以内,判为毛刺 */ enable_irq(); return; } if (dt > TICK_MAX) { /* 11ms 以上,判为失步 */ sync_state = LOST; phase_base = now; enable_irq(); return; } last_tick = now; phase_base = now; /* 记录本周零点 */ sync_state = LOCKED; enable_irq(); }

中断里的代码要短,能放到主循环处理的都挪出去。这里只做时间戳记录和状态判定,具体的触发延时计算放到主循环里,避免中断嵌套和长时间占用。

还有一个配置上的坑:如果用的是双边沿触发,正半周和负半周都会进中断,那么 TICK_MIN 要相应调整,否则会把另一半周误判为毛刺。我一般只用一个下降沿,靠定时器周期来推算另一半零点,简单可靠。

5.2 移相的定时精度要求与配置

移相控制的核心是"零点后延时多少微秒触发"。工频周期 20ms,半周 10ms,对应 180°。如果触发角分辨率要做到 1°,延时精度需要达到:

10ms / 180 = 55.6μs

看起来要求不高,普通定时器都能满足。但实际要做到 0.1° 级别的平滑调节,就需要 5.5μs 的精度。用 1MHz 时钟的 16 位定时器,计一个数就是 1μs,完全够用。

定时器配置上,我习惯这样算:单片机主频 24MHz,预分频 24 得到 1MHz 计数时钟,16 位定时器最大计数值 65535,对应 65.5ms,覆盖一个完整工频周期绰绰有余。触发延时的计数值:

uint16_t delay_ticks = angle_deg * 10000UL / 180; timer_set_compare(TRIG_TIMER, phase_base + delay_ticks);

这里用phase_base(过零时刻的计数值)作为基准,而不是在中断里重新清零计数,好处是定时基准不随中断响应延迟漂移,即使中断晚进了几微秒,触发点仍然是相对于真实零点算出来的。

触发脉冲宽度也要控制。可控硅一旦导通,门极就不需要再给电流了,所以脉冲给 50μs 到 100μs 足够。给太宽没有意义,反而增加光耦的功耗和发热。但也不能太窄,要考虑光耦的传输延迟和上升时间,50μs 是比较稳妥的下限。

5.3 整周波调功的均匀分配算法

整周波调功最容易犯的错是"集中导通":需要 50% 功率就前 25 个周期全开、后 25 个周期全关。这样做虽然平均功率对,但负载上的温度波动、灯的闪烁都会非常明显。

正确的做法是把导通的周期均匀散布在周期组里。经典实现是累加器法,也叫 delta-sigma 思路:

static uint16_t acc = 0; #define FULL_SCALE 1000 void on_zero_cross(void) { acc += power_set; /* power_set 范围 0 到 1000 */ if (acc >= FULL_SCALE) { acc -= FULL_SCALE; fire_next_cycle = 1; /* 本周期导通 */ } else { fire_next_cycle = 0; /* 本周期跳过 */ } }

这个算法的妙处在于,无论功率设成多少,导通的周期都会均匀分布在整个周期组里。设 50% 时,实际输出是"开、关、开、关"交替;设 33% 时是"开、关、关、开、关、关",间隔恒定。负载上看到的能量脉动频率从 1Hz 提升到了 25Hz,热惯性和人眼视觉都能完全滤掉。

分辨率由 FULL_SCALE 决定。取 1000 意味着最小调节步进是 0.1%,配合 50Hz 工频,一个完整周期组 1 秒,实际能表达的功率级数是 1000 级,但实际上只有 50 个周期,所以有效分辨率是 2%。如果要更细,就得拉长周期组,或者接受更新频率降低。

实际工程里我通常这么配:加热类负载周期组 1 秒(50 个周期),分辨率 2%,够用;照明类周期组 200ms(10 个周期),分辨率 10%,牺牲分辨率换低闪烁。

5.4 软启动与功率斜率限制

不管走哪条路线,上电瞬间的功率冲击都要处理。冷态的白炽灯电阻只有热态的十分之一,直接全功率上电,冲击电流能达到额定值的十倍;加热管同理,冷态电阻小,瞬间功率远超额定。可控硅本身能承受短时浪涌,但长期这么折腾,寿命会大幅下降。

软启动的做法是限制功率设定值的变化速率。比如要求从 0 到 100% 至少花 1 秒,那么每次过零中断时,实际输出功率最多比上一次增加 2%(1 秒 50 个周期):

void power_ramp(void) { if (target_power > actual_power) { actual_power += RAMP_STEP; if (actual_power > target_power) actual_power = target_power; } else if (target_power < actual_power) { actual_power -= RAMP_STEP; if (actual_power < target_power) actual_power = target_power; } }

RAMP_STEP 的取值看负载。加热管热惯性大,取 1% 到 2% 都行;白炽灯要快一点响应,取 5%;电机类必须慢,取 0.5% 以下。

还有一层保护是掉电检测。市电突然断电又恢复时,如果功率设定值还停在高位,恢复瞬间就是全功率冲击。稳妥的做法是检测到过零信号丢失超过 100ms,就把实际功率清零,等信号恢复后重新软启动。

6. 调试实录:六类典型故障的排查路径

纸面上的东西讲完了,真正花时间的永远是调试。这一节的内容全部来自实际踩过的坑,按现象分类整理,遇到问题时可以对着查。

6.1 故障速查表

现象最可能的原因排查动作
完全不导通光耦输入侧没有驱动信号万用表测光耦 1、2 脚电压,确认有 5 到 10mA 电流
完全不导通门极电阻虚焊或阻值过大断电测门极回路通断,阻值应在标称值 ±5% 内
只有半个波工作过零型光耦带感性负载换随机型光耦,或并联假负载
输出功率调不上去触发脉冲太窄,光耦没来得及响应脉冲加宽到 100μs 再试
低功率档闪烁负载电流低于可控硅维持电流并联泄放电阻,或改用整周波控制
随机误触发门极回路受干扰门极对 MT1 加 1kΩ 下拉电阻
过零信号毛刺多地线干扰或电源纹波检查过零检测的地是否独立走线
可控硅发热严重散热不足或通态电流超限测实际电流,核算功耗,加散热片

6.2 三个我踩过的坑

第一个坑:小功率负载点不亮。当时做的是一盏 3W 的 LED 灯调光,电路照着大功率的方案抄的,结果低亮度档位灯一直闪。查了半天才发现,3W 在 220V 下电流只有 13mA,而所用可控硅的维持电流是 25mA,导通之后电流撑不住,可控硅自己就关断了。解决办法是在负载两端并一只 47kΩ 的电阻做假负载,让总电流超过维持电流。代价是这只电阻常年耗电约 1W,需要选 2W 以上的规格,而且要放在通风的位置。

第二个坑:过零点偏移导致最低亮度调不到。电路上电后测波形,发现过零脉冲的实际位置比理论零点晚了大约 300μs,对应相位 5.4°。这意味着软件里算的"触发角 0°"实际是 5.4°,最低亮度永远调不下去。原因是光耦的传输延迟加上拉电阻的上升时间。解决办法是在软件里加一个固定的相位补偿量,把基准往前挪 300μs。这个补偿值每批板子都要重新标定,因为光耦的延迟有离散性。

第三个坑:带变压器负载丢波。这个前面提过,用的是过零型光耦,带一个 50W 的小变压器,结果变压器嗡嗡响、输出电压只有一半。换成随机型光耦,软件在过零点后延时 1ms 触发,问题解决。为什么延时 1ms?因为要等电压确实建立起一定幅值,光耦输出侧的触发电流才够,同时避开零点附近的抖动区。这个延时值不是算出来的,是试出来的,从 200μs 一直试到 2ms,1ms 最稳。

6.3 上电前必做的五项检查

每次焊完新板子,我都按这个顺序过一遍,能省掉大量"上电就炸"的悲剧。

第一项,断电状态下用万用表二极管档测热地和冷地之间的电阻,应该是无穷大。如果有读数,说明隔离被破坏了,绝对不能上电。

第二项,测限流电阻的实际阻值,四只串联的总阻值要和设计值一致。曾经遇到过贴片电阻焊错封装的情况,标称 30k 实际焊了 3k,上电瞬间光耦就烧了。

第三项,检查门极电阻和缓冲电容的极性。CBB 电容虽然无极性,但有些封装标注了方向,装反了不影响功能但影响寿命。门极电阻要确认功率规格够。

第四项,先用隔离变压器给板子供电,串一只 40W 的白炽灯做限流。如果板子有短路,灯泡会全亮而板子不工作,不会直接炸器件。这个土办法救过我很多次。

第五项,第一次上电不接负载,只测过零信号波形。波形正常了再接一个小功率负载试,逐步加大。直接上满功率是最容易出事的操作。

最后再分享一个实测下来很有用的小技巧:在可控硅的 MT1 和 MT2 之间临时并一只氖泡指示灯,能直观看到可控硅有没有导通、导通角大概多少。氖泡的亮度随导通角变化很明显,调试移相的时候比示波器还快。当然,长期使用要拆掉,氖泡本身也有寿命和漏电流。

我个人在实际操作中的体会是,这套电路的难点从来不在原理,而在那些"手册上不写、教程里不提"的边界条件——光耦的延迟、电阻的耐压、负载的维持电流、地线的走向。把这些细节一个个啃下来,电路才能从"能亮"变成"能用三年不出问题"。下一篇打算聊聊多路同步控制和功率因数校正的取舍,那部分涉及到多只可控硅共用一个过零基准时的相位对齐问题,坑比这一篇还多。