为什么模拟引脚会互相影响?


8

我有一个传感器,它会产生一个模拟信号。

我正在读取所有模拟数据并将其发送到我的计算机。

在此处输入图片说明

uint8_t sensors[] = { A0,A1,A2,A3,A4,A5,A6 };
const int len = sizeof(sensors) / sizeof(sensors[0]);
void loop(void)
{
    for (size_t i = 0; i < len; i++)
    {
        auto sensor = sensors[i];
        int sensorValue = analogRead(sensor);
        // Convert the analogue reading (which goes from 0 - 1023) to a voltage (0 - 5V):
        float voltage = sensorValue * (5.0 / 1023.0);
        char t[100];
        sprintf(t, "%d:%d$\n", sensor, sensorValue);
        uint8_t t1[100];
        //PrintSerial.println(t);
        memcpy(t1, t, 100);
        wifi.send(t1, strlen(t));
    }
    delay(300);
}

我绘制了模拟读数。为什么图看起来像这样?

在此处输入图片说明


面包板在行与行之间具有一些电容
dandavis '17

Answers:


11

这是预料之中的。

其他引脚上没有任何连接,因此它们的电压是浮动的。

Arduino MCU只有一个ADC。要读取不同的模拟引脚,它使用多路复用器将您要读取的引脚连接到单个ADC。MCU内部的ADC内部具有一个“采样保持”电容器。

要读取引脚上的电压,它将连接该引脚,为样品充电并保持电容器。然后,它将一次断开一位并断开并测量样品和保持电容器的电压。

因此,在您的情况下,通过读取连接引脚上的电压,它将为电容器充电。然后它将读取未连接的引脚。但是,由于未连接任何东西,因此采样保持电容器将保持大约相同的电压,因为未连接的引脚既不会充电也不会将其放电。

测量采样保持电容器上的电压会稍微降低该电压,因此这就是为什么曲线中的线会比之前的测量值低。

PS另外,由于所有引脚都放置在试验板上,因此相邻引脚之间将具有一些电容耦合。


那么没有问题吗?如果有另一个引脚,不会降低精度吗?
erow

6
并不是的。除非您尝试读取的信号具有很高的输出阻抗。如果要获得更清晰的图形,可以将未使用的引脚接地。
Gerben

0

acc实际上是一个小电容器。切换通道时,acc电容器中的电荷会从一个输入通道传输到下一个输入通道。如果下一个输入通道具有非常高的阻抗或非常低的电容,则acc电容器上的电荷占主导,并且其电压变化很小。

另外,糟糕的代码也可能导致这种情况-通常是由于缺少足够的时间来完成添加。


您的意思是我需要在for循环中添加延迟吗?
erow
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.