坚持只有一个万用表/电压表?但是,有时您需要同时检查 2 或 3 个电压。那么您可能会考虑制作一个真正的直流电压表!
采用常用组件和易于理解的代码设计,可以同时测量单个电路或 3 个独立电路中 3 个节点的正电压和负电压。
以下硬件用于构建此设备:-
通常,ATmega328P (Arduino Uno) 可以测量 Gnd 和 AVCC 范围之间的电压(即 0 到 5V),无需任何分压电阻网络。如果启用内部 AREF,它可以测量 Gnd 和 AREF 范围之间的电压(即 0 到 1.1 V)。使用一些分压器,可以测量高于 5V 的电压。这些都是相对于 Gnd 的正电压。
但它无法测量低于 Gnd 的任何电压,这意味着它无法测量负电压。问题是,ATmega328P 有一个单端 ADC,默认情况下会根据Gnd 进行测量。
解决办法是,不要再对 Gnd 进行测量。
真正的电压表有 COM(黑色)和 V(红色)端子,您将 COM 连接到一个节点,V 连接到电路上的另一个节点。相对于 COM 节点,V 节点上的电压读数。
您需要构建一个 (AFE)模拟前端,某种信号调节电路来生成类似 COM 的行为。此 COM 节点的电压应介于 AVCC 和 Gnd 之间。理想情况下,AVCC 电压的一半,但对于本设计,它是 AREF 的一半。
当对 COM 进行外部电压测量时,您可以轻松测量正电压和负电压!
请仔细检查以下电路:
那么,这里发生了什么?内部参考 AREF 在 ATmega328P 上启用(来自无效设置中的固件/代码)。AREF 引脚为 1.1 V。现在,ADC 测量的有效范围为 0 至 1.1 伏。
接下来,使用 LM324 运算放大器缓冲这个 1.1 AREF 电压,这意味着我们仍然有来自第一个运算放大器输出的 1.1 电压。一个 10k 多圈微调电位器精确设置为 5k 以产生 550mV(半 AREF)伏特。这个 550 mV 信号由第二个运算放大器缓冲。550 mV 信号也连接到 ADC Ch - 0。它应该读取 512(10 位的一半)。
有一个分压器网络由 5 兆欧姆(两个 10M 并联)和 100 千欧姆电阻组成,连接到第二个运算放大器的输出。
我将此分压器网络上的电阻较低端 (100k) 定义为 COM,电阻较高端 (5M) 端定义为 V。此分压器的中点连接到 ADC Ch - 1。当没有外部电压施加到此分压器时,ADC Ch - 1 应读取 512(因为 550 mV)
当施加外部电压时,分压器中点电压将移动到 550 mV 以上或以下。如果 V 上的外部电压相对于 COM 较高(正电压),它将移动到 550 mV 以上,如果 V 上的外部电压相对于 COM 较低(负电压),它将移动到 550 mV 以下。ADC Ch-1 读数将相应改变。使用 ADC 读数的这种变化,我们可以计算外部电压。
为什么使用 AREF 而不是 AVCC ?
此设计由 LiPo 电池供电,充满电的 LiPo 将从 4.2 伏开始,电压会逐渐下降。所以,AVCC也会发生变化。但内部参考 AREF 具有恒定的 1.1 伏特。这就是我选择 AREF 的原因。
如果使用其他没有AREF的单片机,可以使用TL431 IC来产生参考电压!
为什么使用 LM324 运算放大器?
LM324 IC 在一个封装中有 4 个运算放大器,应用广泛,它的输出可以(非常接近)Gnd。它还适用于 3 至 32 伏之间的任何电源电压。
您始终可以使用更好的运算放大器(精密、低噪声、轨到轨)
使用 ADC 测量的电压将是实际施加电压的一小部分。这就是为什么在固件内部使用以下公式来计算实际电压的原因:-
+/- V = (R_High / R_Low) / 2
V < sqrt ((R_High + R_Low) * P)
R_High + R_Low > hundreds of kOhms to few MOhms
对于这个项目,这个电压表可以测量 +/- 25 伏特,R_High = 5M(或 5000k)和 R_Low = 100K ,额定功率为 1/10 瓦,满足以上 3 个条件
Measurement Resolution = Measurement Range / ADC Resolution
示例:假设新的 AA 电池用 Fluke 电压表读数为 1.627 伏,但该电压表可能读数仅为 1.5 或 1.6 或 1.7 伏
For better range or resolution select microcontroller with 12 bit ADC or more
Reduce measurement range to increase resolution
Reduce resolution to increase range or measure bigger voltages
准确性取决于很多因素。在这个项目中实现了以下一些技巧。
在固件中实施以下操作将提高准确性:-
尽管可以使用以下代码将 Arduino UNO 或 Atmega328P 的 AREF 引脚设置为 1.1 伏
analogReference(INTERNAL);
不同芯片的实际 AREF 电压可能在 1.06 伏到 1.13 伏之间变化。建议使用高精度万用表测量 AREF 引脚,并找到实际电压。然后在代码中定义它以获得更高的准确性
#define AREF 1.097 // Aref pin voltage
不要只是复制粘贴 1.1 伏!
这是用于过压或浪涌保护的双向二极管钳位,您可以与 R_Low 并联使用。由于空间不足,我将这部分留在了我的构建中!
安全永远不能掉以轻心!当 R_Low 两端的电压超过 +/- 800 mV 时,这些二极管将开始钳位。这只是一个例子,根据需要使用不同类型的二极管以获得合适的钳位电压。
为 1306 OLED 显示器安装u8glib(由 Oliver 设计)库。
校准
为获得最佳效果,您需要使用常规万用表/电压表校准该电压表。您将需要任何电池 AA 或 LiPo。用普通万用表测量电池电压。然后用这个电压表测量电池。看到读数有一些差异,现在稍微调整/调整 10K 电位器(参见示意图)以进行校准。
通过反转电池的负电压来执行相同的步骤。
您还可以通过使用电阻器定义的值添加/减去一些偏移值来从代码进行软校准。
测量
共有 3 个 Commons COM1、COM2、COM3 和 3 个对应的 V1、V2、V3 探头,用于 3 个不同通道的电压测量。
对于通道 1,电压是在 V1 上相对于 COM1 测量的。如果用 V1 探测的电路节点的电位高于用 COM1 探测的节点,则电压读数将为正。如果 V1 和 COM1 在这两个电路节点上交换,则电压读数将为负。
同样适用于带 V2 和 COM2 的通道 2 以及带 V3 和 COM3 的通道 3。
在不共享任何电气连接的 3 个不同电路上测量三个不同电压时,对 3 个电路使用 V1/COM1、V2/COM2、V3/COM3 对。
在单个电路上测量三个不同的电压时,请勿使用多个 COM 。只需将一个 COM (例如 COM3,任何 COM 都可以!)连接到 Gnd 或该电路的任何节点。然后使用 V1、V2、V3 测量 3 个不同节点上相对于 Gnd 或连接 COM 的节点的 3 个不同电压。
在同一电路上连接多个 COM 会搞砸读数!
我忘了添加一些重要的东西,当电压范围超过测量范围时显示 OL(过载)。希望我会用额外的功能更新代码。
内部 EEPROM 上的一些电压记录可能很方便,我也会尝试这样做。我想为 REL(归零幻影电压)和 HOLD(冻结屏幕)添加几个按钮。我已经在顶部焊接了一个母接头以供将来扩展,敬请期待。
该设计可用于测量缓慢变化的交流电压/信号(假设为正弦波),而无需更改硬件。它还可用于设计分流电流表(提示:用非常低的 R 值替换分压器)。但是您需要为此编写不同的代码。
这个概念适用于任何微控制器,请随意构建您自己的设计,祝您好运。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !