【问题标题】:Simultanously Reading Two Analog Inputs with Arduino使用 Arduino 同时读取两个模拟输入
【发布时间】:2014-01-04 14:16:53
【问题描述】:

我们正在模拟一个烤箱。电位器设置所需的温度,传感器读取作为“烤箱”的小铜板的当前温度。

两个温度传感器都连接到我的 arduino uno 上它们自己的模拟输入引脚。单独地,我得到了有意义的电位计和温度传感器的值(我正在监视串行窗口上的值)。但是,当我调整电位器时,它会显着改变传感器读数。

例如:

  • 电位器处于 0 位置,传感器处于室温空气中。串口显示 TempSensor = 22 C, TSet = 0 C。这是正常的。
  • 然后当我打开锅时:TempSensor= 40 C, TSet=55 C. - 但温度传感器仍在室温空气中!因此,电位器值 TSet 会按应有的方式上升,但也会影响传感器读数,即使温度并没有真正改变。

任何建议将不胜感激。谢谢!

 void setup() {    
     Serial.begin(9600); 
 }

 void loop() {  
     int sensorValue = analogRead(A3);
     float tsens =  map(sensorValue, 0, 1023, 0, 500); 

     int sensorValue2 = analogRead(A1);
     float tset =  map(sensorValue2, 0, 1023, 0, 70);

     Serial.println(tsens); 
     Serial.println(tset);
 }

【问题讨论】:

  • 电路的接线图对调试很有帮助。

标签: arduino analog-digital-converter


【解决方案1】:

您的温度传感器很可能存在未接地或接线错误的接地。 Arduinos 中模拟引脚上的引脚配置彼此非常靠近,因此当附近引脚施加电压时,浮动电压会向上或向下移动。如果传感器的接地连接(或电源,虽然一开始是正确的,它可能是接地)断开或固定到高阻抗线路,模拟电压将在整个地方移动,因为其他通常很小的电压源将主导信号寻路。如果您也将手指放在A3 引脚附近,它可能会大幅波动。

【讨论】:

    【解决方案2】:

    我最近遇到了一个类似的问题,我的搜索表明在读取之间插入延迟会有所帮助。在this question 上,我发现this answerthis answer 特别有用。

    这个想法是,您需要在读取后等待一段时间,然后在 ADC 稳定后再次读取。这是我一直在使用的一个函数:

    int safeAnalogRead(int pin)
    {
      int x = analogRead(pin);  // make an initial reading to set up the ADC
      delay(10);                // let the ADC stabilize
      x = analogRead(pin);      // toss the first reading and take one we will keep
      delay(10);                // delay again to be friendly to future readings
      return x;
    }
    

    我仍然无法准确读取连接到配置为 vcc 和地之间的分压器的模拟引脚的几个电位器,但至少现在这些值是稳定的。

    顺便说一句,可以说,由于您在第一次阅读后有延迟,因此没有必要进行第二次延迟。如果您在两个不同的引脚上快速连续两次调用safeAnalogRead(),这可能很重要。

    【解决方案3】:

    是噪音还是价值不高?我做了一个小测试程序,查看一个引脚并将其与之前的最大值和最小值进行检查。每当出现新的边界值时,我都会将其打印到串行监视器上。如果错误值稳定,请检查电路。如果它在有效值附近有噪声,则数字低通滤波器效果很好。读取 34 个读数。找到最高和最低值并丢弃它们。然后取其余 32 个读数的平均值。我看到我的设置提高了 90%(40 个计数错误降至 3 个)。丢弃 2 个高和 2 个低的 36 个读数可能会进一步改善情况。如果你有时间,你可以做一个双通滤波器。重复同样的过程 34 次,然后扔掉高低并再次平均。所有这些都是 34 x 34 读数,因此噪音应该会消失,但是您需要很长时间才能获得样本,并且需要一段时间才能检测到锅的变化。为了节省时间,我在每次通过主循环时读取罐子并将每个值保存在循环缓冲区中。当我需要阅读锅时,我会查看历史上的 33 个读数以及第 34 个新读数。

    【讨论】:

      【解决方案4】:

      我之前在快速连续读取多个模拟传感器时遇到过这个问题。一个可能的原因(也是我经历过的一个)是 arduino 只有 1 个 ADC 并且它为电容器充电以获取该读数。该电容器可以在读数之间保持充电,从而使它们发生偏差。

      正如另一位用户指出的那样,引入延迟可能会对此有所帮助,但是我能想出的最简洁的解决方案是通过模拟读取第三个引脚来“重置”并为 ADC 电容器放电直接接地。

       int sensorValue;
       int sensorValue2;
       float tsens;
       float tset;
       int resetADC;
       
       void setup() 
       {    
           Serial.begin(9600);
           pinMode(A0,input);
           pinMode(A1,input);
           pinMode(A3,input); 
       }
      
       void loop() 
       {  
           resetADC = analogRead(A0);
           sensorValue = analogRead(A3);
           tsens =  map(sensorValue, 0, 1023, 0, 500); 
           
           resetADC = analogRead(A0);
           sensorValue2 = analogRead(A1);
           tset =  map(sensorValue2, 0, 1023, 0, 70);
      
           Serial.println(tsens); 
           Serial.println(tset);
        }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-05
        • 2019-09-04
        • 2022-07-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多