实时读取大量模拟传感器

电器工程 ADC 大气压 复用器 迷笛 即时的
2022-01-20 04:07:36

我正在尝试构建一个类似 MIDI 的控制器,它的琴颈像吉他。在那个脖子上,有一个巨大的压力传感器矩阵。控制器将模拟 3 个字符串。

它的工作原理是:有3条长条双面铜带(宽0.5厘米,与脖子一样长)连接到电源(可能是3.3V或5V,暂时无所谓)。在这些条带上是一层 Velostat,它会根据压力改变电阻率。在 velostat 的顶部将是另一层铜带行或单元,连接到某物,通过 velostat 层吐出电压读数。由于脖子长约40厘米,至少有80行。

如果您将底部的 3 条铜带想象成沿着颈部的图表的列,则传感器将是单元格或行,具体取决于测量方法(我认为也可以复用列,然后可能有行。)有一些特殊条件可能会使这更容易:因为这是一个类似吉他的控制器,所以不需要测量每个交互!只有最靠近控制器主体的触摸才重要。8位的分辨率也应该足够准确。无论如何,255 的压力水平可能超过了所需的水平。

现在困难的部分:

测量需要足够实时以检测锤击等(不知道需要多高的采样率 - 估计为几 kHz 以获得良好的测量和可玩性)并且控制器的数字输出应该是MIDI(在 3 个单独的通道上 - 每个字符串一个)或可以用 Raspberry Pi 处理的数字信号。

现在由于我的知识非常有限,我想不出合适的工具来完成这项工作。我所知道的是:这是可能的。有一个相似但不同的控制器使用非常相似的技术(我实际上对其进行了逆向工程,直到我注意到他们拥有专利并且关于他们如何做到这一点的信息并不像我想象的那样神秘),它被称为 ROLI海岸。

TL;博士:

  • 大约 240 个传感器

  • 可以分成80个一组,由同一条线路供电

  • 这是一个实时应用程序,我需要在每个传感器被触摸时获取压力(某些条件适用,见上文)

在此先感谢,我知道要阅读的内容很多。我很感谢您的任何建议,如果您能帮助我完成我打算制作的可怕烂摊子,我将非常高兴!

到目前为止我想到的事情:

多路复用行和列,使用 MCP3008 或更大的 ADC 读取每个单元并链接(菊花链或树状)ATmegas,这只会将位置方面的最低交互推到最终信号,但根据我的计算,这可能会受到瓶颈通信开销。还有一个早期的型号包括带状电位器,我已经放弃了,因为设计很糟糕(几次尝试,不够酷)。

编辑/更新:

感谢您迄今为止提出的好建议!多亏了他们,我现在能够更清楚地表达我的问题:

我有一个 80 行 * 3 列压力传感器的矩阵。当人与传感器矩阵交互时,附近的几个传感器会接收到触摸,但只能沿着一列。柱是机械分离的。传感器的电阻在 100 Ohm 和 1 kOhm 之间。所有这些传感器都需要以 8 位的深度进行读取、处理,并且需要以至少 1 kHz 的速率发送结果。因此,单个读取/处理需要不到一毫秒的时间。每列的最终输出需要是:float32 为 4 个字节,uint8 为 1 个字节。float32 将指示第一次交互沿列的平均位置。交互被定义为压力高于某个阈值的连续传感器集群。这是处理进入混合的地方:该列将向下遍历,直到读数超过阈值。这将被视为交互的开始。每个传感器的压力和位置都会被记住,直到第一个传感器低于阈值,最多(可能)4 个连续传感器。在记录的交互的所有传感器中,只有两个传感器将被处理 - 一个读取最高压力(最低电阻)的传感器,以及直接在其上方或下方的最高传感器。浮点位置是通过对两个传感器位置的压力加权来计算的。交互的整体压力将只是将两个压力夹在 0 到 255 之间的加法(将 unit8 的两个压力添加到 uint16 中并除以 2 而不四舍五入,丢弃不需要的位 - 这应该很快)。这需要发生在每一列。然后,15 字节大小的结果将通过 SPI 发送到充当合成器的小型计算机 (Raspberry Pi B3)。我没有设置传输方法。如果 SPI 不是适合这项工作的工具,我愿意采用 Raspberry Pi 可以处理的任何通信方法。由于这是一个音乐交互应用程序,延迟是至关重要的。

我的确切问题是:可以用一个微控制器解决这个问题而不会破坏银行吗?我买不起价值几百美元的 IC 来做一个爱好项目。你会推荐什么硬件?有没有我需要警惕的不明显的警告?

到目前为止,我从答案中得出的方法是单独为每列供电,然后通过 SPI 连接到 Arduino 的 5 个 16 通道 ADC (ADS7961) 读出行。我担心这可能不是最简单/最便宜的方法,或者速度不够快,无法达到 >1 kHz 的速率。

免责声明:在电气工程方面,我通常是一名理论化学家和一个糟糕的业余爱好者,我所知道的一切都是自学的,没有任何专业背景(这反过来也是我向更有知识的人寻求帮助的原因)。不过,我确实知道我在软件方面的方式。任何关于软件的事情,我会在足够的时间里弄清楚。另外,我是德国人,所以请原谅偶尔的语法缺陷。

4个回答

显而易见的答案是多路复用,这意味着您可以动态地制作电气路径。因此,只需遍历整个矩阵,一次一个,或尽可能多的 ADC(模数转换器)输入。

如果您有 3 个 ADC,那么您可以一次读取一行,然后将输入更改为多路复用器,瞧,您现在正在读取第二行,然后继续。这个设置的问题是你有 80 行,而且我知道没有任何 80:1(一个输入的 80 个输入)多路复用器。但是您可以将16:1 多路复用器放在一起以获得 16*5=80 个输入。

它看起来像这样:

row  0-15 [16:1 mux]____________ 5 inputs in [8:1 mux]-ADC
row 16-31 [16:1 mux]_| | | |
row 32-47 [16:1 mux]___| | |
row 48-63 [16:1 mux]_____| |
row 64-79 [16:1 mux]_______|

16:1 多路复用器的 4 个输入信号可以连接在一起。

所以最后你有一个带有这种模式的控制信号的字节:

Grouped up:
0, 3 bits for the 8:1 mux, 4 bits for the 16:1 mux

Bit for bit:
0,8:1 MSB, 8:1 LSB+1, 8:1 LSB, 16:1 MSB, 16:1 LSB+3, 16:1 LSB+2, 16:1 LSB+1, 16:1 LSB

这意味着您将需要 5 × 16:1 多路复用器和一个 8:1 多路复用器 = 6 个 IC,

将其乘以 3,因为您可能希望一次读取一行。

这意味着您将拥有 18 个 IC,7 个控制信号。如果您想增加模拟输入的数量,您可以减少 IC 的数量。只有 3 个模拟输入,它是 18 个。

如果您改为使用 240/16 = 15 个 IC,那么您会从 15 × 16:1 多路复用器获得 15 个模拟输出。然后你可以用 16:1 多路复用器或 16:8 多路复用器级联它。如果您使用 16:1 多路复用器“优化”它,最终将是 16 个 IC。但这意味着您的软件解决方案不会像上面那样......优雅,它会是纵横交错的模数和其他东西,但是嘿,你节省了 2 个 IC。

因此,您将读取一行,处理它,然后转到下一行,处理它,然后是下一行,依此类推。如果给每一行 10 µs,那么您将在 0.8 ms 内完成 80 行,即 \$\frac {1}{0.8ms}=1.25 kHz\$,这在您考虑的范围内。

这是可能的,但这不是一个好的设计。

让我们以另一种……更节省空间和金钱的方式解决这个问题。

*20 分钟后* 嗯...我想出的所有解决方案要么太难设置和/或需要一些高级校准...

哦,好吧,那么我假设您的设计适合您手头的任务。

祝你好运。


我想知道其他解决方案是什么。愿意分享吗?– 熊猫98

OP 想要测量位置和压力​​。这是两个参数。这意味着我们需要将该信息打包到电压信号中,以便我们可以读取并破译它。或者我们需要把它打包成其他单位,比如欧姆、电感、电容。

这是我的一些想法,我只考虑一栏。只需将这个想法乘以 3,您就有了 3 柱吉他的完整解决方案。

第一个想法:

使用两条平行线(低电阻)从吉他底部连接到吉他琴颈。将地线连接到吉他底部的一根电线。制作一个 LR 测量系统并测量另一根导线的电感和电阻,也在底部。

当你用手指触摸两条线时,你将连接两条线,这里会有一些电感。您触摸的吉他越往上,电路就越长,您测量的电感也就越多。你按得越用力,两根电线之间的表面积就越大,它的电阻就越小。

它不必是两条“线”,可以是两条导电胶带或其他东西。

为什么我之前没有分享这个:为了让它可靠,你需要为每个人校准传感器,因为每个人的皮肤都有不同的电阻量。每当你玩的时候,你都会出汗,因此阻力会进一步降低,所以你需要对此进行补偿。每个人的出汗量都不一样,所以这也必须根据每个人进行校准。

所以电感=>手指的位置。阻力 => 你的压力有多大。

您将测量的值的偏差将在纳米 Ω 和纳米 H 中,这意味着您将需要一些有关 CMRR 和 SNR 的适当知识。否则,您将看到的只是电源电压,假设这将在室内完成。或者来自 wifi 或灯或其他一些噪声源的其他频率。所以也许需要一个合适的数字滤波器。而且......它可能已经超出了 OP 的能力和可接受的脑力劳动范围。所以这个想法被抛弃了。

第二个想法:

在连接到地的吉他上制作一个平坦的导电表面。

使用一根电线或导电胶带或仅使用扁平导体。在上面涂一些不导电的油漆,或者在上面涂上一些普通的不导电胶带。

将它从底部到吉他的颈部穿过吉他。将吉他底部的电线连接到数百 MHz 范围内的高频。现在您将开始得到明显的反射。因为从技术上讲,您的传输线很差,只有一侧被屏蔽。

因此,您将发送一些短方波脉冲并测量由于您的手指放在绝缘线顶部而产生的反射,它需要多长时间才能返回。然后你测量吉他底部反射尖峰的幅度。所以旅行时间=>手指的位置。反射的幅度 => 你按的力度。

这不是最简单的设置...如果您不知道自己在做什么。再说一次,这对于 OP 来说可能是一个太多的努力来解决。所以这个想法被抛弃了。


它看起来像这样:

在此处输入图像描述

我假设特性阻抗为 150 Ω,换句话说,传输线非常糟糕。实际上它可能更糟,我不知道我从来没有这样做过。

这是链接,以防有人想乱七八糟。

最困难的部分之一是将端点与一些电阻相匹配,为此您可能需要示波器或其他一些昂贵的仪器。

另一个困难的部分是实际测量 TOF(飞行时间),那里有一些 IC,但它们并不便宜。但你总是可以制作一个恒流源并填充一个小电容器,然后就可以了读取电压。

这里的想法是,当手指靠近电线时,您的手指将成为电路的一部分并充当电容器。手指越近,电容越大。这就是为什么手指点的阻力会下降的原因。

https://en.wikipedia.org/wiki/Transmission_line向下滚动一点,您会看到电容参数是分母的一部分。

每当电线上的某个点不匹配时,就会出现反射,您可以在信号来源的“输出”处读取它。如果任何地方都没有反射,那么您的信号将在任一端点终止。

你越用力向下推,手指的面积就会变平=>由于面积而产生的电容越大。此外,电线和手指之间的任何非导电材料都会受到轻微挤压,以进一步增加电容。

第三个想法:

在吉他内插入一个特雷门并测量频率和幅度。我不确切知道theremin会输出什么,但肯定可以使用一些东西。

在这一点上,我已经没有想法了,说我已经花了 20 分钟。实际上,我可能花了 10 美元。哦,好吧。现在我肯定又花了 10 分钟来写这篇文章,所以这一切都加起来了。

根据您的价格范围,您可能需要考虑在 Raspberry Pi 和 ADC 之间使用 FPGA,例如DE0-Nano Board,它作为入门级 FPGA 开发板得到了很好的支持。该解决方案的优点是允许您编写代码,这些代码将同时为多个/多个 ADC 提供时钟,并以可呈现给 Raspberry Pi 的方式格式化您的数据。

您提到您正在考虑使用 MCP3008。该芯片是 SPI,因此您可以在同一总线上使用不同的 CS 引脚将几个设备连接在一起。假设您将三个芯片连接到一条总线,这样每 6 个引脚(三个数据线和三个 CS 线)就有 24 个 ADC 通道。这意味着 60 个引脚有 240 个通道,这很容易在 FPGA 的能力范围内。

如果您以 2MHz 的最大频率运行 MCP3008 时钟线,则需要 (15 个时钟/通道) * (8 个通道/芯片) * (3 个芯片/总线) * (1/2000000 秒/时钟) = 0.18ms读取所有 240 个传感器,对应于 5.56kHz 的采样率。

三个想法:

1.在供应端做一些复用

实际上,您所描述的电路是大量可变电阻,每个电阻的一端与电源电压共用。您想读出所有电阻值,到目前为止,其他回复大多建议了在模拟端复用信号的方法。

但是您也可以在供应端进行部分或全部多路复用,方法是将供应“轨道”划分为n 个部分。将多组n 个传感器焊盘连接在一起,每个传感器焊盘都有不同的电源轨。现在一次只为一个供电轨供电,并使用一个 ADC 输入来读取每组焊盘。(这就是读取计算机键盘的电路通常的工作方式,开关的接线方式通常称为“交叉点开关”。)最终,您可以只使用一个连接到所有“导轨”的 ADC,然后执行通过依次将电源连接到每个焊盘来实现所有多路复用。

唯一需要注意的是,所有其他焊盘都需要与电源轨隔离,而不是接地,如果您只为每个焊盘使用数字输出,就会出现这种情况。有几种方法可以解决这个问题,包括通过二极管、双极晶体管或 FET 连接每个焊盘,或者 - 我不知道这在实践中可以做到多快,但原则上是可能的 - 使用微控制器并将其设置为输出高电平或输入,当它应该具有相对较高的阻抗时。

与使用单个固定电压源和高质量模拟多路复用器相比,通过这种技术测量传感器的精度可能并不完美,但我怀疑它会足够好,特别是因为我确信压力传感器在它们的电阻 - 您可能需要使用参考力为每个传感器校准它。

2. 使用一些具有大量 ADC 输入的微控制器

例如,PICAXE 40X2有 27 个引脚可用作模拟输入,因此您可以使用其中的 9 个引脚来满足您的需求。它是用一种简单的 BASIC 语言编程的,可以充当 i2c 从机——所以你可以用另一个微控制器读出 9 个芯片——或者你可以将每个芯片的输出作为串行数据发送,然后读入主机通过串行到 USB 转换器。我不能确切地保证它会走多快,但我认为如果你以最大速度(64 MHz,使用 16 MHz 外部谐振器)为 PICAXE 计时,它应该可以正常工作。当然,如果您对 C 中的微控制器编程感到满意,那么您可以使用 PICAXE 所基于的 PIC18F45K22 来做同样的事情。

3. 使用现成的模拟输入单元

最后,如果您不介意花钱来节省时间,并且便携性不是一个高优先级 - 例如,如果仪器可以通过一些粗电缆拴在设备机架上 - 您可以购买足够高的 -通道数模拟输入设备可同时测量所有传感器。例如,Measurement Computing USB-2633读取 64 个模拟输入,价格略高于 1000 美元。

可能值得考虑蛮力信号调理(可能是被动的),然后是小型 ADC 或 MCU/ADC,每个具有 16 个或更多 MUX'd ADC 输入。那只有40个筹码。一个可能工作的芯片示例是ADS7961QDBTRQ1,它具有自动增量通道模式和 16 个输入。

即使在 4kHz 采样率和每个样本 240 字节的情况下,总体数据速率也约为 1MB/s,这并不太可怕。可能是一个带有 10MHz 或 20MHz SPI 总线的主 CPU 与从机通信。如果带宽不存在,请使用 2 条 SPI 总线。上面提到的部分工作在 20MHz,所以单个 SPI 就可以了。

或者,也许您可​​以使用单个 TI 芯片- DDC2256AZZF,它具有 64 通道同时采样和 256 个输入。但它并不是特别便宜(约 350 美元)并且采用 14x14mm 323 针 LFBA 阵列,所以它不会使用白色插件板面包板。