Hotdry.

Article

AVR 微控制器 PWM 占空比驱动模拟电压表:线性校准与温漂补偿实践

解析如何用 AVR128DB28 实现 1-bit PWM 驱动模拟电压表偏转,涵盖占空比映射、RC 滤波参数、线性校准表与温漂补偿的完整参数体系。

2026-05-17systems

用 AVR 微控制器驱动模拟电压表偏转来显示时间,本质上是一个开环控制系统。微控制器输出高频脉冲序列,电压表的机械惯性和线圈电感将其平滑为稳定的指针位置。这种方案的工程简洁性在于不需要任何数模转换器,仅凭一个数字输出引脚即可实现精准的模拟电压控制。然而,正是这种简洁性带来了线性度、频率选择、温漂补偿等一系列需要精细调校的工程参数。

PWM 信号到电压表位置的物理映射

模拟电压表的本质是一个永磁式直流电流表,其指针偏转角度与流过线圈的电流成正比。当我们用高频方波驱动时,电压表看到的不是一个固定电压,而是电压对时间的平均值。这个平均值由方波的占空比决定:占空比越高,平均电压越高,指针偏转越大。对于满量程 5V 的电压表,当占空比为 0% 时指针指向 0V 刻度;当占空比为 100% 时指针指向 5V 刻度。

在 lcamtuf 的实现中,使用 AVR128DB28 的三个引脚(PC0、PC1、PC2)分别驱动时、分、秒三块电压表。主循环以软件方式手动翻转这些引脚,而非使用芯片内置的硬件 PWM 模块。原因在于软件实现能够更灵活地控制时序,且该应用对频率精度要求不高,不需要硬件 PWM 的严格时序保证。定时器中断以 10 Hz 的频率触发,每次中断更新一个计数器,主循环则根据当前计数值计算占空比并输出。

从工程角度,关键参数是 PWM 频率与 RC 时间常数的匹配。电压表线圈具有电感和电阻,其电气特性可以用一阶 RL 模型近似。当 PWM 频率过低(比如低于 100 Hz),指针会出现明显抖动,人眼能够感知指针在目标位置附近振荡。当 PWM 频率过高(比如高于 10 kHz),线圈的感抗显著增加,电流响应变慢,电压表的响应速度跟不上占空比的快速变化,导致指针移动迟滞。

占空比到指针位置的校准映射

电压表的刻度通常不是严格线性的,这是机械制造的公差导致的。在低成本面板电压表(比如文章中使用的 Baomain 65C5)中,指针位置与驱动电压之间的关系可能存在系统性偏差。为了实现准确的时钟显示,需要建立占空比到指针位置的一对一映射表。

实际操作中,常见的做法是在电压表前放置一个量角器,测量不同占空比下指针实际指向的角度。然后将测量结果与期望值对比,生成校正曲线。校正方法可以分为查表法和拟合法。查表法将占空比分段,比如每 5% 记录一个数据点存储在程序数组中,运行时根据当前目标位置查表插值。拟合法则用多项式函数逼近校正曲线,对于大多数电压表而言,三次多项式已经足够。

对于时钟应用,线性度要求尤其体现在秒针上。秒针需要每秒钟移动一个刻度(60 格对应 360°,每格 6°)。如果占空比映射存在非线性,秒针在某些时段会走得快,某些时段走得慢,肉眼即可察觉不均匀。校准时建议对 0、15、30、45、60 秒五个校准点进行精确测量,确保秒针在整个圆周上匀速运动。

温漂补偿的工程参数

模拟电压表的精度受温度影响显著。温度变化会导致内部磁铁磁场强度变化、弹簧弹性模量变化、线圈电阻变化。这些因素综合作用,使得同一占空比在不同温度下对应的指针位置不同。对于安装在室内、且有木材外壳包裹的时钟来说,温漂的主要来源是环境温度的日间波动以及电路板自身的发热。

AVR128DB28 内置的 12 位 ADC 可以用来做闭环校准。一种简单的补偿方案是:在电路中加入一个热敏电阻(NTC),通过 ADC 持续监测环境温度。然后根据预先测定的温漂曲线,在软件中对占空比做微调。温漂曲线可以通过在不同温度(比如 15°C、20°C、25°C、30°C)下测量电压表的校准点获得。

对于精度要求更高的应用,可以将热敏电阻与电压表做在同一测量链路中。驱动电压表的同时,ADC 采样热敏电阻分压,计算当前温度对应的校正系数。典型 NTC 热敏电阻(如 10kΩ B3950)在 25°C 时阻值为 10kΩ,在 0°C 时约 32kΩ,在 50°C 时约 4kΩ。ADC 参考电压设为芯片供电电压 3.3V 或 5V,通过分压电路将热敏电阻阻值转换为电压值供 ADC 采样。

电源设计与去耦参数

电压表时钟通常使用市电供电的 wall adapter,输出直流电压经 LDO 稳压到 5V 或 3.3V 为 MCU 供电。电源设计需要关注两个问题:纹波抑制和启动瞬态。MCU 的数字输出切换会在电源轨上产生高频噪声,如果这些噪声通过电源传导到电压表,会表现为指针微颤。

去耦电容的典型参数是:每个 MCU 电源引脚附近放置 100nF 陶瓷电容,与电源引脚的距离不超过 5mm。此外,在电压表驱动引脚与地之间可以串联一个 100Ω 电阻和 10μF 电解电容构成低通滤波器,进一步平滑 PWM 边沿。这种 RC 滤波器的截止频率约为 160 Hz,远低于 PWM 频率,能够有效抑制高频纹波。

如果发现指针仍然存在微颤,可以尝试增加 PWM 频率到 20-50 kHz,同时降低 RC 滤波器的截止频率。更激进的做法是使用两级 LC 滤波,用 10μH 电感和 47μF 电容构成 π 型滤波器,截止频率约 7.3 kHz,对 20 kHz 以上的 PWM 噪声衰减显著。

时钟精度与 RTC 方案

lmamtuf 的方案使用 8 MHz 晶体配合定时器中断实现计时,计时精度取决于晶体的稳定性和软件中断处理的 jitter。对于短时间测量,这种软件 RTC 已经足够。但如果要求每日误差小于 1 秒,晶体频率偏差需要控制在 11.6 ppm 以内(1 秒 / 86400 秒 ≈ 11.6 ppm)。

8 MHz 晶体商业规格书中标注的频率容差通常为 ±20 ppm 或 ±30 ppm。这意味着在最坏情况下,每日误差可能达到 1.7-2.6 秒。对于时钟应用,建议使用专用 RTC 芯片如 DS3231(精度 ±2 ppm)或 PCF8523(精度 ±5 ppm),这些芯片内置温度补偿晶体振荡器,能够在不同温度下保持稳定。

如果坚持使用 MCU 内置 RTC,AVR128DB28 支持外接 32.768 kHz 晶体。32.768 kHz 是 2 的 15 次方,使得定时器可以简单地实现 1 秒中断而无需分频。在软件层面,每 32768 次计数溢出触发一次秒中断,然后通过软件计数器累积成分、时、日。这种方案比 8 MHz 晶体的软件分频更省电,适合使用电池备份的场景。

工程实践总结

用 PWM 占空比驱动模拟电压表的核心参数可以归纳为:PWM 频率建议在 1-10 kHz 范围,以 4-5 kHz 为折中点;RC 滤波截止频率设为 PWM 频率的 1/10 到 1/20;校准时对至少 12 个点做线性度测试并生成校正表;温漂补偿使用 NTC 热敏电阻配合 ADC 采样,补偿曲线通过多点实测获得。

这类项目的工程价值在于:它展示了如何使用最少的硬件实现模拟量控制,同时暴露出开环系统的局限性。当你能精确控制信号输出后,下一步的改进方向就是引入反馈闭环 —— 在电压表指针处安装光栅编码器或使用摄像头视觉定位,将实际指针位置反馈回控制器,用 PID 算法补偿机械非线性和温度漂移。这种从开环到闭环的演进,正是嵌入式控制系统设计的典型路径。

资料来源:lcamtuf 的《A nicer voltmeter clock》(https://lcamtuf.substack.com/p/a-nicer-voltmeter-clock)。

systems

内容声明:本文无广告投放、无付费植入。

如有事实性问题,欢迎发送勘误至 i@hotdrydog.com