3

我正在 UNO r3 上创建我的第一个 Arduino 程序。我之前用过 Arduino Uno 玩过一些小示例程序等。我使用两个模拟输入来感应距离,使用 2 个具有 0-5vdc 缩放比例的激光传感器。这两个输入为 0-5vdc,我已确保自始至终共同接地。两个传感器分别命名为left和right,分别输入到A0和A1。我还有一个差分电位器,它使用 10K 欧姆电位器抽头电压作为 A2 的输入。该程序的原理是取左右激光器输入电压差的绝对值,然后确定结果是否大于或等于 POT 抽头 A2 引脚上的电压。根据得出的数学结果,通过晶体管驱动电路打开或关闭插入到引脚 D13 的继电器。

问题:我无法在引脚 A0、A1 或 A2 的刻度 (0-1023) 上实现准确的电压变化。我已经使用串行监视器来诊断这个问题。不知道问题是什么,任何帮助都会很棒。此外,我无法在上述任何模拟引脚上实现 0 值,即使是 POT 抽头!!!!

这是我的代码:

    const int lf_dist = A0;          //names A0
    const int rt_dist = A1;          //names A1
    const int differential = A2;     //names A2
    const int relay = 13;            // select the pin for the relay coil
    unsigned int left = 0;              // variable to store the value coming from the left    sensor
    unsigned int right = 0;             // variable to store the value coming from the right sensor
    unsigned int diff = 0;              // variable to store the value coming from the   differential POT for maximum distance differential
    unsigned int offset = 0;            // variable that stores the value between the two laser sensors

void setup() {
  Serial.begin(9600); 
  pinMode(A0, INPUT);
  pinMode(A1, INPUT);
  pinMode(A2, INPUT);
  pinMode(relay, OUTPUT);              // declare the relay pin as an OUTPUT: 
  analogReference(DEFAULT); 
}

void loop() 
{

  unsigned int left = 0;              // variable to store the value coming from the left sensor
  unsigned int right = 0;             // variable to store the value coming from the right sensor
  unsigned int diff = 0;              // variable to store the value coming from the differential POT for maximum distance differential
  unsigned int offset = 0;            // variable that stores the value between the two laser sensors



  left = analogRead(A0);          // read the value from the left laser  
  delay(5);
  right = analogRead(A1);         // read the value from the right sensor
  delay(5);
  diff  = analogRead(A2);    // read the value from the differential POT
  delay(5);

  offset = abs(left - right);

  if(offset >= diff)                   // does math to check if left and right distances are greater than the value clocked in by the differential POT
  {
    digitalWrite(relay, LOW);          // turns off the relay, opens the stop circuit, and turns on the yellow light
  }
  else
  {
    digitalWrite(relay, HIGH);        // turns on the relay if all is good, and that keeps the machine running      
  }
    Serial.print("\n left = " );                       
    Serial.print(left);
    Serial.print("\n right = " );                       
    Serial.print(right);
    Serial.print("\n differential = " );                       
    Serial.print(diff); 
    delay(1000);
 }
4

4 回答 4

2

事实上,这实际上应该是由于测量引脚周围的浮动引脚具有不稳定的值,从而扰乱了您的测量。您应该使用arduinoscope查看您的值,这将向您显示其他浮动引脚对测量引脚的干扰影响。

解决此问题的简单方法是将所有不使用的模拟输入引脚接地,并在两个输入之间放置尽可能多的空间,这样它们就不会相互干扰。

于 2013-06-19T11:35:59.903 回答
1

我意识到这个线程有点老了,但也许这会对某人有所帮助。如果你只用 5V 为 Arduino 供电,就像你说你用稳压器做的那样,你会得到非常不稳定的行为,尤其是来自模拟引脚的行为。这是因为您将开始使提供 AREF、3.3 和 5.0 输出的内部稳压器断电。我已经为我正在从事的机器人项目进行了测试,在大约 6.5 伏的电压下,一切都开始出错了。我想如果你总是提供 5.0 的输入电压,你可以补偿这种影响,但在我的情况下,我使用的锂聚合物电池的电压范围可以从 8.4 伏到 6.0 伏,而且在 6.5 伏时一切都变得疯狂。

于 2015-08-05T16:26:01.773 回答
0

arduino 在电位器采样期间吸收的最小电流不应干扰抽头处的实际开路输入电压。

于 2015-08-18T11:46:23.467 回答
-1

在上拉模式下初始化引脚以避免垃圾值或“浮动”引脚或在引脚上使用您自己的下拉/上拉电阻:)

于 2017-05-26T13:24:26.033 回答