通过模拟输入引脚选择 4 位总线地址:蒙特卡洛模拟显示重叠地址值

电器工程 ADC 服装 寻址 宽容
2022-01-28 13:18:51

我使用ATtiny44微控制器为我的硕士论文设计了一个小型传感器 PCB 我的应用程序需要大约 200 个这样的板,其中 16 个总是本地连接到控制器板。整个网络是这样的:

在此处输入图像描述

为了在控制器和传感器板之间进行通信,我编写了自己的 1 针总线(基于时序)。唯一的问题是,当我将传感器板的数据发送到控制器板时,传感器板必须有一个地址才能知道它在网络中的位置。

由于我在阁楼上只剩下 1 个引脚,我想出了一个基于跳线的 DAC 电路,它应该根据四个跳线的设置生成模拟电压。由于传感器电路使用值(47、470、1k、3k、4k7、10k、100k 和 220k)并且我想针对生产进行优化,因此我为 DAC 使用了以下值(基本上是 100k、50k、20k 和 10k )。根据跳线设置,这应该会给我一个介于 0 V 和 760 mV 之间的不错的值。正是我需要通过 ATtiny 的内部 1.1 V 参考读取的模拟电压。在启动时,阁楼会读取这个电压并且应该知道它的位置。

示意图

模拟此电路- 使用CircuitLab创建的原理图

从理论上讲,这很好用。我什至在LTspice中进行了蒙特卡洛分析,以确认在考虑电阻器的容差时没有重叠区域(均为 1% BTW)。您可以在下面找到此分析的图片。

在此处输入图像描述 在此处输入图像描述

现在我生产了几块(幸运的是不是 200 个)这样的板,但有些板的地址没有得到正确的读数(特别是在所有公差同时发挥作用的更高地址区域)。我测量了所有可能的解决方案,最终找出了我的问题。我最初的分析不包括 5 V 电源电压的容差,它是在每个控制器板上使用MC7805从 12 V 本地生成的。根据数据表,MC7805 的输出电压介于 4.8 和 5.2 V 之间。

在我弄清楚这一点后,我修改了蒙特卡洛分析。现在看起来像这样:

在此处输入图像描述 在此处输入图像描述

正如你所看到的,有很好的重叠区域,我不能肯定地说这个电压只能表示这个地址。基本上所有地址都以 no 开头。8 可以得到错误读数(更高地址错误读数的可能性更高)。

我不想添加与板上已经使用的电阻值不同的电阻值(至于我想为生产优化的论文)。

我不想添加一个电压参考(例如齐纳二极管)来为 DAC 电阻网络供电。

不能再修改控制器板(并在那里使用更精确的电压调节器)。

我仍然可以修改传感器板的 PCB 设计/原理图!

如何确保始终获得正确的地址读数(通过程序或通过更改电路)?

2个回答

根据您的模拟,只要仅考虑电阻值的不确定性,您的寻址方案就可以正常工作。导致它失败的是电压的不确定性。

我的建议是通过将 VCC 用作 ADC 的参考来抵消 VCC 的波动。REFS您可以通过对寄存器中的位进行编程来做到这一点ADMUX,如数据表中所述:

在此处输入图像描述

一旦切换到 VCC 作为 ADC 的参考电压,您将不再测量电压,而是测量电阻值之间的比率,并且这些值精确到 1%。原理图中不需要更改(尽管您可能希望增加 R7 的值以使您的测量值处于 ADC 转换范围的中间),只需更新 Attiny 的固件。

如果您仍然愿意返工传感器板,您可以按照 Cano64 的建议用 R-2R 梯子替换原理图:

示意图

模拟此电路- 使用CircuitLab创建的原理图

这将通过使梯子中的所有步骤相等来优化分辨率。1% 的电阻足以构建高达 5 位的单调阶梯。

我不得不解决一次类似的问题。我需要将 4 个按钮连接到 arduino 上的一个模拟引脚,但是我需要识别同时按下(所有组合)。我想出了和你一样的电路,然后我写了一个程序来搜索所有可能的电阻值组合,所以当你按下按钮时,最终值尽可能地分开。你猜怎么了?我们被搞砸了,这是不可能的。就是这样,祝你有美好的一天。

我了解到开关的最佳电阻值接近 R、2R、4R、8R,分压器底部的值为 R。您的电路已经接近最佳电阻,您只需将 R7 替换为 10k电阻器。

但是有一个好消息要告诉你。由于您只需要设置一个地址(在设备运行时您不会操作开关),因此我建议使用 SPDT 开关和R2R 梯形图