使用Arduino同时读取两个模拟输入

时间:2013-12-17 00:22:06

标签: arduino analog-digital-converter

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

温度传感器都连接到我自己的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);
 }

4 个答案:

答案 0 :(得分: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(),这可能很重要。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

在快速连续读取多个模拟传感器之前,我已经遇到了这个问题。一个可能的原因(也是我经历过的一个原因)是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);
  }