news 2026/10/28 20:39:41

过零检测电路设计全解:相位误差、拓扑选型与PCB布局

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
过零检测电路设计全解:相位误差、拓扑选型与PCB布局

做可控硅调光那两年,最让我难受的不是算法,是过零信号。有一版板子,过零检测的方波在示波器上看着干净利落,边沿陡、占空比对称,可灯在5%以下亮度时会周期性地闪一下,怎么调触发角都压不住。后来把整条链路拆开一测才发现,过零信号的相位比真实过零点晚了七十多微秒,在满亮度时这点延迟根本无所谓,可低亮度时导通角本来就窄,七十微秒对应的角度误差直接把输出功率推到了不该在的位置。那次之后我才认真回头把过零检测电路从物理本质到PCB走线重新捋了一遍。这篇就把这套东西完整写出来,包括过零点到底有多少时间精度、光耦方案和变压器方案的取舍、限流电阻和上拉电阻怎么互相牵着算、隔离带在板子上怎么留,以及示波器上那些毛刺和丢脉冲到底从哪来。不管你是做调光、做继电器同步投切、做电机调速还是做电能计量,只要板子上有一路交流电要跟数字电路打交道,这些细节都绕不开。

1. 过零点不是一个点:先算清时间精度这碗水有多深

很多人对过零检测的第一印象是"电压过零时输出翻转",听起来像是个开关动作,误差最多几十微秒,无所谓。这个直觉在50Hz工频上会出大问题,因为过零点附近的电压变化率是整条正弦波上最大的,阈值定得稍微高一点,时间误差就被放大成可观的角度误差。

1.1 过零点附近的电压斜率决定了你的时间分辨率

市电正弦波可以写成 v(t) = Vpk·sin(2πft),对时间求导得到 dv/dt = 2πf·Vpk·cos(2πft)。在过零瞬间 cos 项等于1,斜率取到最大值。代入220V有效值、50Hz:

  • 峰值 Vpk = 220 × 1.414 ≈ 311V
  • 过零处斜率 = 2π × 50 × 311 ≈ 97.7 V/ms ≈ 0.0977 V/μs

这意味着在过零点附近,电压每微秒才变化约0.1V。反过来看,如果你的检测阈值是1V,对应的时间误差就是 1 ÷ 0.0977 ≈ 10.2μs;阈值如果是5V,误差直接拉到51μs;阈值如果做到0.5V,误差才压到5.1μs。

50Hz下一个完整周期20ms对应360度,所以1度等于55.6μs。把这个换算代进去,1V阈值带来的10.2μs误差约等于0.18度,5V阈值是0.92度。单看角度好像很小,但可控硅调光在低亮度时导通角本来就只有十几度到二十几度,零点几度的偏差会直接体现在输出功率的跳变上,表现出来就是低亮度闪烁或者调光曲线在底部不平滑。

提示:设计阶段先把可接受的相位误差定下来,再反推允许的检测阈值。想要0.5度以内,阈值必须压到2.8V以下;想要0.2度以内,阈值要压到1.1V以下。这一步决定了后面选什么拓扑。

1.2 一条完整的误差链:从电网波形到MCU引脚

真实系统里的相位误差不是单一来源,而是一条链子,每一环都往里加东西。

第一环是电网本身。市电不是理想正弦,整流性负载、变频设备、开关电源都会让波形顶部削平或者过零附近出现畸变。畸变严重的场合,真实过零点会来回漂移几十微秒甚至上百微秒,这种情况下再高精度的检测电路也没用,只能靠软件侧的锁相或者多次平均去压。

第二环是检测阈值的不对称。正半周和负半周如果用同一套阈值,理论上是对称的;但如果用两个器件分别处理正负半周,它们的导通压降、传输特性有差异,正负半周就会产生固定的相位差,这个差值会以直流分量的形式体现在后续控制里。

第三环是隔离器件的传输延迟。光耦的延迟跟输入电流、负载电阻、温度都相关,典型值在十几微秒到几十微秒之间浮动,而且这个浮动不是常数。变压器方案的延迟小得多,通常在微秒级,但体积和成本上去了。

第四环是数字侧的响应延迟。中断响应时间、输入捕获的硬件滤波、软件里的消抖窗口,这些加起来又是几个微秒到几十微秒。

把这条链子拉直看,你会发现一个残酷的事实:如果前三环加起来已经有三四十微秒的不确定度,那你在软件里把触发角算到小数点后三位毫无意义。真正该做的是先把每一环的延迟量出来、固定下来,能补偿的补偿,不能补偿的留足余量。

2. 三种主流拓扑的取舍:光耦、变压器与直接分压比较

过零检测的电路结构翻来覆去就那么几种,每一种都有自己的舒适区和死穴。选型的时候不要只看"能不能检测到",要看"在你的应用场景下,哪一种的缺点你能忍受"。

2.1 光耦反并联方案:便宜、隔离,但延迟是个变量

最常见的做法是限流电阻串一个光耦的发光二极管,输入端反并联一个保护二极管,输出端加上拉电阻接到MCU。正半周光耦导通,输出拉低;负半周保护二极管导通,光耦截止,输出为高。这样每个工频周期得到一个脉冲,脉冲的下降沿对应正半周的过零点。

这个方案最大的优点是隔离,高压侧和低压侧彻底分开,安规认证好过,成本也低。缺点是延迟大且不稳定。光耦从发光二极管电流建立到光敏三极管集电极电流到位,中间要经过光电转换和晶体管开关过程,典型延迟在10μs到50μs之间。更麻烦的是这个延迟跟CTR(电流传输比)强相关,而CTR会随温度漂移、随使用时间衰减。同一批板子,夏天和冬天的过零相位可能差出十几微秒。

还有一种变体是两个光耦反向并联,正负半周各由一个光耦负责,输出可以并联也可以分别接两个GPIO。并联的好处是全波检测,每个周期两个脉冲,周期测量更及时;分别接两个GPIO的好处是能区分正负半周,做双向可控硅触发或者功率计量时有用。但并联会带来一个新问题:两个光耦的饱和压降不可能完全一致,正负半周的脉宽会有细微差别,如果软件把两个脉冲都当等价的过零点用,周期测量就会引入周期性抖动。

如果在意成本又想要全波,还有一个折中方案:前面加一个整流桥,后面用单个光耦。整流桥把交流整成脉动直流,光耦在每个半周都导通一次,得到两个脉冲。代价是多了一个桥堆的正向压降,过零点附近的死区变宽,精度会下降一些,而且失去了正负半周的区分能力。

2.2 变压器取样与直接分压比较:精度优先的两种走法

变压器方案用一个小的工频变压器把220V降到几伏到十几伏,输出仍然是正弦波,后面接比较器或者直接进MCU的模拟比较器。因为变压器本身的相移很小,比较器的响应又在纳秒到微秒级,整条链路的延迟可以做到几微秒以内,相位精度远高于光耦方案。

代价是体积和成本。工频变压器再小也有个骨架和磁芯,占板面积下不来,而且低频特性要求磁芯不能太小否则波形失真。这个方案适合对相位精度要求高的场合,比如功率计量、精密相位控制,或者板子上本来就有辅助电源变压器可以顺便取一路绕组。

直接分压加比较器的方案精度最高,延迟最小,因为它跳过了所有隔离环节。电阻分压把220V降到比较器输入范围,比较器输出直接进MCU。问题是它不隔离,整个低压电路都带着火线的电位,要么整个系统浮地(外壳不能接地,安规上很难过),要么就得用其他方式做隔离。这条路一般只在对成本极度敏感且整机结构能保证安全隔离的场合用,或者用在差分采样芯片前面做预处理。

2.3 一张对比表把选型定下来

方案隔离典型延迟相位精度成本占板面积适用场景
单光耦加反并联二极管有20~50μs中低小普通调光、继电器同步投切
双光耦反向并联有20~50μs中中小需要全波或区分正负半周
整流桥加单光耦有30~60μs偏低低中成本敏感、精度要求不高
工频变压器取样有1~5μs高中高大功率计量、精密相位控制
电阻分压加比较器无<1μs最高最低最小整机已有安全隔离结构

选型的判断逻辑其实很简单:先问相位精度要求是多少。如果应用是可控硅调光,人的眼睛对1度以内的相位误差基本无感,光耦方案完全够用;如果是做电能计量或者功率因数计算,相位误差直接影响功率读数,那就得往变压器或者专用计量芯片的方向走。再问隔离是不是硬要求,是的话直接分压方案出局。最后看成本和体积能不能接受,工频变压器往往是第一个被砍掉的。

3. 把限流电阻算到手:输入电流、CTR余量与电阻耐压

光耦方案里最容易被算错的就是输入侧的限流电阻。很多人按"220V除以目标电流"随手一算,阻值对了,但功率和耐压没过关,板子跑一段时间电阻发烫甚至击穿。这一节把这几笔账分开算清楚。

3.1 从峰值电流反推电阻值

先定目标输入电流。这个电流不是随便拍的,它由输出侧的需求反推过来。假设输出侧上拉电阻是10kΩ,电源3.3V,光耦导通时要把输出拉到低电平,集电极电流至少要达到 3.3V ÷ 10kΩ = 0.33mA 才能把电平拉到接近地。再考虑CTR,817系列光耦在25度时CTR最小值通常在50%左右,高温85度和长期老化后会降到30%甚至更低。按最坏情况30%算,输入电流至少要 0.33mA ÷ 0.3 = 1.1mA。

这还只是"刚好能拉低",实际要留余量,建议按2mA设计。有了目标电流,限流电阻就好算了:

R = (Vpk - Vf) ÷ Iin_pk = (311 - 1.2) ÷ 0.002 ≈ 154.9kΩ

取标准值150kΩ,实际峰值电流约2.07mA。这里有个细节值得说清楚:因为发光二极管的导通压降只有1.2V左右,相对311V的峰值几乎可以忽略,所以LED在每个半周里导通的时间接近180度,电流波形近似半波整流的正弦。这意味着电阻上承受的电压有效值接近220V,功耗要按这个来算,不能按峰值电流乘峰值电压去算。

3.2 电阻的功率和耐压:220V下最容易被忽略的两件事

功耗先算:P = Vrms² ÷ R = 220² ÷ 150k ≈ 0.32W。这个功率要分摊到串联的电阻上。如果用两个75kΩ串联,每个承担0.16W。

再看耐压。这是最容易翻车的地方。常见的1206贴片电阻额定工作电压一般在200V DC左右,0805更低,大概150V。220V交流的峰值是311V,如果只用一个150kΩ的1206电阻,它两端承受的峰值电压就是311V,直接超过额定值,长期运行会出现阻值漂移甚至击穿。正确做法是串联分压:两个75kΩ串联,每个承受的峰值电压是155.5V,落在200V额定值以内,留了余量。

功率余量也要看。1206封装额定0.25W,但这是在70度以下的数值,板子内部温度轻松上到60度以上,要降额使用。0.16W相对0.25W是64%的负载率,勉强可以,但如果机箱散热不好,建议改成三个51kΩ串联(总阻值153kΩ),每个功耗约0.107W,负载率降到43%,非常稳。或者直接上2512封装,单个额定1W,但2512的额定电压通常也只有200V,所以还是得串联两个。

串联方案单只阻值单只功率单只峰值电压负载率(1206/0.25W)评价
1只150kΩ0.32W311V超额定电压不可用
2只75kΩ0.16W155.5V64%可用,散热要好
3只51kΩ0.107W103.7V43%推荐
4只39kΩ0.08W77.8V32%最稳,占板大

注意:串联电阻的排列也有讲究。靠近火线端的第一个电阻承受的电压应力最大,布局时把它放在远离信号线、远离低压区的位置,周围留出足够的爬电距离。

3.3 上拉电阻与CTR衰减的温度余量

输入侧定完了,输出侧的上拉电阻要跟着一起算,两者是绑定的。上拉电阻越大,同样的集电极电流下拉得越深,但抗干扰能力越差、边沿越缓;上拉电阻越小,边沿越陡,但对输入电流的要求越高。

举个实际的对比。上拉10kΩ时,需要的集电极电流0.33mA,按CTR最坏30%算,输入电流要1.1mA,你设计的2mA有接近一倍的余量,很安全。但如果为了追求陡峭边沿把上拉改成4.7kΩ,集电极电流需求变成0.7mA,输入电流就要2.3mA,2mA的设计就不够了,高温下会出现拉不低的情况。

还有一点:光耦输出侧的饱和压降不是零,典型值在0.1V到0.4V之间,而且随集电极电流增大而增大。MCU的数字输入低电平阈值一般是0.3×Vcc,3.3V系统下是0.99V。看起来余量很大,但如果CTR衰减到临界点,输出低电平会从0.2V慢慢爬到0.8V、0.9V,离阈值越来越近,表现出来就是偶发误判。所以在设计阶段就要把这个余量算进去,不要等到高温测试出问题再回头改。

4. PCB落地:隔离带、开槽与高压走线的具体画法

原理图对了不代表板子能用。过零检测电路横跨高压和低压两个区域,PCB布局上的一个小疏忽就可能让安规测试卡住,或者让过零信号上多出一堆耦合过来的毛刺。

4.1 爬电距离和电气间隙怎么留

这两个概念经常被混用,其实是两回事。电气间隙是空间直线距离,管的是空气击穿;爬电距离是沿绝缘表面的路径长度,管的是表面污染导致的漏电起痕。220V工况下,按常用安规表格查,基本绝缘的电气间隙要求大约1.5mm,爬电距离按污染等级2、材料组IIIa大约2.5mm。

但这是认证的最低线,实际工程里建议把高压区和低压区之间的间距做到4mm以上。原因很现实:板子在生产过程中会有助焊剂残留,使用过程中会积灰受潮,表面绝缘性能会下降,多留一点距离就是多留一份保险。如果空间实在紧张做不到4mm,退而求其次的做法是在隔离带中间开槽。

开槽的宽度1mm就够,深度要贯穿板厚。开槽的作用是把原本沿表面的直线路径变成绕槽壁的折线路径,等效增加了爬电距离。计算的时候槽宽和槽深都算进路径里,所以1mm宽、1.6mm板厚的一条槽,能把爬电距离增加大约2.6mm。开槽的位置要放在高压走线和低压走线之间最窄的地方,槽的两端要超出走线边界,不能留缺口。

4.2 光耦周围的布局细节

光耦是跨隔离带的器件,它的摆放直接决定了隔离带怎么走。标准做法是把光耦横跨在隔离带上,输入侧的两个引脚在高压区,输出侧的两个引脚在低压区,光耦本体正好压在隔离带上方。

光耦本体下方尽量不要铺铜。有些设计为了散热或者屏蔽在光耦下面铺一整块地,这是隐患。光耦内部的隔离距离是封装厂保证的,但PCB上的铜箔如果从输入引脚一直延伸到输出引脚下方,等于在外部又搭了一条表面路径,把封装内的隔离给短路了一部分。正确做法是光耦下方做净空,或者只在一侧铺铜并在隔离带处断开。

限流电阻的位置要靠近光耦的输入引脚,目的是缩短高压走线的长度。高压走线越长,耦合到附近信号线的机会越多,受雷击浪涌时的电压分布也越不均匀。但电阻本身有功耗会发热,不能紧贴着电解电容或者温度敏感器件放,中间留出2mm以上的间隙。

输出侧的上拉电阻要靠近MCU的输入引脚,而不是靠近光耦。这样做的理由是让光耦输出的电流路径尽量短,减少这段走线对外辐射的环路面积。如果光耦和MCU之间距离较远,中间这段走线要用地线包起来,或者至少保证旁边有一条完整的地回流路径。

4.3 输出侧的滤波与走线

光耦输出是一个带缓变边沿的方波,边沿时间取决于上拉电阻和走线电容。如果这段走线经过噪声环境,很容易在边沿上叠加毛刺。硬件上可以在输出侧加一个RC低通,比如10kΩ加100nF,时间常数1ms。但1ms的延迟对过零检测来说太奢侈了,它会直接吃掉你辛苦攒下来的相位精度。

更合适的做法是加一个施密特触发器做整形,比如常见的六反相器芯片里带施密特输入的那一档。施密特触发器有回差,能把缓慢变化的边沿整成陡峭的方波,同时抑制边沿上的小毛刺,而传输延迟只有几纳秒到几十纳秒,对相位几乎没有影响。代价是多一个器件、多一点成本,但在精度要求高的场合非常值。

如果不想加器件,纯软件消抖也能做,但要清楚它的代价。软件消抖的做法是检测到边沿后启动一个定时窗口,窗口内忽略新的边沿。窗口长度一般取20μs到50μs,这几十微秒就是硬生生加进去的相位延迟。如果这个延迟是固定的,可以在最终触发角计算里减掉;如果它随工况变化,那就变成了不确定度。

5. 上电之后:示波器上的毛刺、丢脉冲与相位偏移

板子焊回来第一次上电,过零信号很少有一次就完美的。下面这几种现象是我在实际项目里反复遇到的,把排查思路完整记下来,比直接给结论有用。

5.1 毛刺来自光耦的线性区

现象是过零附近的方波边沿上出现多个窄脉冲,或者边沿来回抖动几次才稳定。用示波器同时看输入电压和输出方波,会发现抖动集中在过零点前后几十微秒的窗口内。

根本原因是光耦在阈值附近处于线性放大区。发光二极管的电流从零开始上升,在到达导通阈值之前有一段很缓的过渡,光敏三极管在这一段的集电极电流也在慢慢爬升。如果这段爬升正好落在MCU输入阈值的附近,任何一点电源噪声或者空间耦合都会让输出反复穿越阈值,形成多个边沿。

这个现象在输入电流设计余量不足时特别明显。因为余量不足意味着光耦要花更长的时间才能从截止进入饱和,线性区停留的时间更久。反过来,把输入电流从1mA提到2mA甚至3mA,线性区被快速穿过,毛刺自然就少了。

还有一种情况是电源纹波耦合。如果MCU的3.3V电源上本身有几十毫伏的纹波,而上拉电阻直接接到这个电源上,纹波会叠加到输出电平上。在边沿附近,这个叠加足以让输出在阈值上下跳动。解决办法是在上拉电阻靠近电源的一端加一个100nF到1μF的退耦电容,把这段电源的交流阻抗压下去。

5.2 高温丢脉冲的完整排查链路

这个案例值得完整讲一遍,因为它涉及好几层排查。

现象:一批板子在常温老化台上跑了两个小时没问题,装到高温车间里运行一下午后,出现过零脉冲偶发丢失,丢失时可控硅不触发,灯会闪一下。

第一步先怀疑电源。用示波器测MCU的3.3V电源,纹波在正常范围,排除。第二步测光耦输入侧的电流。方法是串一个10Ω的小电阻在限流电阻和光耦之间,用差分探头测这个电阻上的电压,换算成电流。测下来电流波形跟常温下没有明显差别,因为限流电阻的阻值随温度变化很小,LED的正向压降虽然随温度下降(大约-2mV/度),但在311V面前这点变化可以忽略。第三步测输出侧的低电平电压,这一步找到问题了:常温下光耦导通时输出低电平是0.18V,高温下变成了0.82V,而MCU的低电平阈值是0.99V,余量只剩0.17V。再叠加电源纹波和地弹,就偶尔会误判成高电平。

结论很清晰:高温下CTR下降,同样的输入电流产生的集电极电流变小,上拉电阻上的压降不够,输出拉不低。

临时解决办法是把上拉电阻从10kΩ换成4.7kΩ,集电极电流需求翻倍,低电平立刻回落到0.35V,问题消失。但这不是根本解法,因为CTR还会继续衰减,换个电阻只是把临界点往后推。根本解法是把输入电流从2mA提到3mA,同时把限流电阻总阻值从150kΩ降到100kΩ。这里要注意,阻值降下来之后功耗上去了,100kΩ对应的功耗是0.48W,必须改成三个33kΩ串联,每个0.16W,同时确认每个电阻的耐压仍然在额定值以内。

提示:CTR衰减是光耦的固有特性, datasheet上通常会给一个"CTR相对初始值随工作时间的变化曲线",1000小时后可能只剩80%,几年后可能只剩60%。设计时按最坏情况留余量,比事后补救省事得多。

5.3 正负半周不对称引起的直流偏置

双光耦反向并联的方案里,如果两个光耦的输出直接并联接到同一个GPIO,正半周和负半周的低电平深度会有差异。因为两只光耦的饱和压降不可能完全一样,一只可能是0.15V,另一只是0.25V。这个差异本身不影响边沿位置,但会影响边沿的陡峭程度,进而影响MCU识别边沿的时刻。

更隐蔽的问题在周期测量上。如果软件把每个脉冲都当作一个过零点来算周期,正半周脉冲到负半周脉冲的间隔和负半周脉冲到正半周脉冲的间隔会有细微差别,两个间隔交替出现,平均值是对的,但瞬时值在跳。对于用周期做锁相的应用,这种交替抖动会传递到触发角上。

解决办法有两个。一是把两个光耦的输出分别接到两个GPIO,软件里分别记录上升沿和下降沿的时间戳,用同向的两个沿算周期,避免了交替误差。二是软件里做配对处理,把连续两个脉冲的间隔求和当作一个完整周期,用这个完整周期做锁相,瞬时抖动量就被平均掉了。

还有一种是半波方案(单光耦加反并联二极管)的问题。这种方案每个周期只得到一个脉冲,负半周的过零点靠周期推算。推算的精度取决于周期测量的精度,而周期测量本身受电网频率波动影响。电网频率在49.5Hz到50.5Hz之间波动是正常的,如果只测一个周期就用来推算后面所有过零点,误差会累积。更好的做法是用滑动平均,取最近八个到十六个周期的平均值,让频率波动被平滑掉。

6. 硬件信号到软件时间戳:捕获、滤波与相位补偿

硬件给出的是一个带抖动的方波,软件要把它变成一个可靠的时间基准。这一步做得好不好,直接决定了最终控制精度。

6.1 输入捕获的配置要点

用定时器的输入捕获功能是最稳的做法,比外部中断加软件计时精度高得多。定时器时钟选1MHz,分辨率1μs,对50Hz来说一个周期20000个计数,量化误差可以忽略。

配置的时候要注意几点。捕获边沿要跟硬件信号的极性对应,光耦输出是低电平有效的话,捕获下降沿能得到更接近真实过零点的时刻。捕获计数器如果是16位的,要注意溢出问题:1MHz时钟下16位计数器65.5ms溢出一次,50Hz的半周期是10ms,不会溢出,但如果电网频率掉到15Hz以下就会出问题,所以中断里要做溢出判断,用无符号减法计算差值就能自然处理回绕。

#define TIMER_HZ 1000000u #define HALF_CYCLE_MIN_TICKS 7000u /* 对应约71Hz */ #define HALF_CYCLE_MAX_TICKS 13000u /* 对应约38Hz */ static volatile uint32_t s_last_capture; static volatile uint32_t s_half_period_buf[8]; static volatile uint8_t s_buf_idx; void TIM_Capture_IRQHandler(void) { uint32_t now = TIM_GetCapture(); uint32_t delta = (now - s_last_capture) & 0xFFFFu; s_last_capture = now; /* 超出合理频率范围的直接丢弃,避免干扰造成脏数据 */ if (delta >= HALF_CYCLE_MIN_TICKS && delta <= HALF_CYCLE_MAX_TICKS) { s_half_period_buf[s_buf_idx++ & 0x07u] = delta; } }

这段代码的核心在两个地方。一是用无符号减法处理计数器回绕,不需要额外判断。二是加了频率窗口过滤,把明显不合理的间隔丢掉,避免一次干扰把整个平均值带偏。

6.2 周期平滑与锁相

拿到八个半周期样本之后,取中位数比取平均值更抗干扰。平均值会被一两个异常值拉偏,中位数只取排序后中间的那个,异常值影响不到它。

static uint32_t half_period_median(void) { uint32_t tmp[8]; uint8_t i, j; for (i = 0; i < 8; i++) tmp[i] = s_half_period_buf[i]; for (i = 0; i < 8; i++) { for (j = i + 1; j < 8; j++) { if (tmp[j] < tmp[i]) { uint32_t t = tmp[i]; tmp[i] = tmp[j]; tmp[j] = t; } } } return (tmp[3] + tmp[4]) >> 1; }

有了平滑后的半周期,就可以做锁相。锁相的思路是:每次捕获到一个真实边沿,就把内部相位计数器重置到零,同时用平滑周期预测下一个边沿的到来时刻。如果下一个边沿在预测窗口内出现,就用真实值修正;如果没出现(比如丢脉冲),就用预测值顶上,避免控制中断。这个机制在干扰严重的电网环境里很有用,能保证输出不会因为一次丢脉冲就断掉。

6.3 可控硅触发角度的提前量

最后一步是把过零时刻换算成可控硅的触发时刻。假设目标导通角是α度,那么从过零点开始要延迟的时间是:

delay_ticks = α × half_period ÷ 180

但这个值不能直接用,因为你的过零信号本身已经滞后于真实过零点一段时间。这个滞后量包括光耦传输延迟、RC滤波延迟、捕获中断响应延迟,是一个固定值(在一定温度范围内近似固定)。标定的方法很简单:用示波器同时测交流输入电压波形和MCU输出的触发脉冲,找到真实过零点到触发脉冲上升沿的时间差,再跟软件里设定的延迟值对比,差值就是硬件延迟。

/* HW_DELAY_TICKS 通过示波器标定得到,单位1us */ #define HW_DELAY_TICKS 38u static void schedule_triac_fire(uint32_t alpha_deg) { uint32_t hp = half_period_median(); uint32_t delay = (alpha_deg * hp) / 180u; /* 补偿硬件链路延迟,避免实际导通角偏大 */ if (delay > HW_DELAY_TICKS) { delay -= HW_DELAY_TICKS; } else { delay = 0; } TIM_SetCompare(delay); TIM_EnableOutput(); }

这里有个容易忽略的细节:低亮度时α接近180度,delay接近整个半周期,此时HW_DELAY_TICKS的补偿变得很关键。如果没有补偿,实际导通角会比设定值小几度,在低亮度区表现为亮度调不下去或者调到某个点突然熄灭。补偿之后,调光曲线在底部的线性度会明显改善。

还有一点值得说:如果电网波形畸变严重,过零点本身在漂移,光靠硬件检测和固定补偿是不够的。这种场合可以在软件里做基波相位跟踪,用多次过零点的滑动平均去估计真实基波相位,把谐波造成的抖动滤掉。实现起来不复杂,代价是响应速度慢一点,但对调光这种慢速控制来说完全可以接受。

我个人在这些项目里踩出来的经验是:过零检测这件事,硬件决定下限,软件决定上限。硬件上把输入电流余量留够、把电阻耐压和功耗算清楚、把隔离带留足,信号的干净程度就有保障;软件上把延迟标定出来、把周期平滑做好、把异常值过滤掉,精度就能再往上提一个台阶。最怕的是硬件上将就、软件上硬补,补到最后发现不确定度全在硬件那一侧,怎么调都调不稳。下次再做过零检测,先花半小时把误差预算列出来,比焊完板子再拿示波器猜要省事得多。

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

Simulink直流电机速度控制仿真:PID整定、传感器建模与参数扫描

简介&#xff1a;面向自动化专业学生、机器人研发工程师及希望掌握Simulink仿真技术的读者&#xff0c;这份文档围绕直流电机速度控制系统的建模、仿真与参数调优展开&#xff0c;可服务于传送带驱动、精密定位等需要恒定转速输出的场景。内容按系统建模、PID控制器设计、速度传…

作者头像 李华
网站建设 2026/10/28 20:39:27

高马尾怎么扎不伤发?发际线保护与蓬松造型全攻略

"ponytail"这个标题看似简单&#xff0c;但落在不同语境里&#xff0c;解法完全不同。它可以是一个发型教程&#xff0c;可以是一个独立品牌&#xff0c;也可以是一个技术项目的代号。在没有更多限定信息的情况下&#xff0c;我选择从最贴近大众日常、也最容易产生共…

作者头像 李华
网站建设 2026/10/28 20:38:39

医疗AI产品化:从模型到落地的关键挑战与解决方案

1. AI医疗产品的现实挑战与机遇医疗AI领域正在经历从实验室研究到实际落地的关键转型期。根据第三方统计数据显示&#xff0c;2022年全球医疗AI市场规模已达到96.3亿美元&#xff0c;但其中真正实现规模化商用的产品占比不足15%。这个数据背后反映的正是从模型到产品的巨大鸿沟…

作者头像 李华
网站建设 2026/10/28 20:38:17

华为营销人力资源体系:客户决策链驱动的组织进化逻辑

简介&#xff1a;本资源是一份系统解析华为营销人力资源体系的深度学习材料&#xff0c;面向HR从业者、企业管理者、营销团队负责人及组织发展研究者&#xff0c;聚焦大型科技企业如何构建支撑战略落地的人力资源机制。内容覆盖战略与组织架构、文化塑造、人才选拔、培训体系、…

作者头像 李华
网站建设 2026/10/28 20:35:50

10GHz矩形微带天线CST全链路建模与优化实战

简介&#xff1a;本资源为CST Studio Suite环境下10GHz矩形微带贴片天线的完整仿真设计文档&#xff0c;面向电磁场与天线方向的本科生、研究生及射频工程师&#xff0c;解决高频微带天线建模、参数计算、S参数优化与辐射特性分析等核心实践问题。压缩包含1个Word文档&#xff…

作者头像 李华
网站建设 2026/10/28 20:35:46

深度解析impeccable:词源、高频搭配与近义词边界

"impeccable"这个词我第一次认真琢磨&#xff0c;是几年前看一部英剧&#xff0c;里面一位老管家评价新来的年轻厨师&#xff0c;只说了一句&#xff1a;“His timing is impeccable.” 字幕翻译成"无懈可击"。我当时觉得翻译得漂亮&#xff0c;但心里其实…

作者头像 李华