• 0

cmeuchel

    问题

      我是这个硬件和C编程的新手。我刚刚购买了带有类似物的UNO32。我正在运行有效的通行程序。我也想显示输入电压,但我无法从获得的数字数字中计算出来。在0V时,我得到-32693计数。在1.587V(AA电池)时,我得到-22377。在-1.587V,我得到22533。在-3.127,12159。在3.167,-11989计数。因此,在较低的电压下,我的计数更高。我认为这是我缺乏知识。希望有人可以帮助我。

      Thanks!

      int count = 0;
      float val = 0;
      void loop()
      {
      count =模拟。阅读(0);//阅读标记为“ In0”的端口
      // count = count;
      float电压= count*(5.0/65535.0);
      val =地图(计数,-32768.0,32768.0,0.0,5.0);
      模拟write(0,count);//在标有“ OUT0”的端口上写出值
      Serial.println("count ");
      serial.println(count);
      serial.println(“地图-32768,32768,0,5”);
      Serial.println(val);
      serial.println(“电压为65535超过5V”);
      serial.println(电压);
      Serial.println(" ");
      //serial.println("count”);
      //serial.println(Analog.Read(1);
      //serial.println("voltage”);
      //serial.println(v);
      延迟(10000);
      }

      链接到评论
      在其他网站上分享

      2 answers to this question

      推荐的帖子

        嗨,Cmeuchel,
        我相信我已经找到了您最初的问题的根源。
        您遇到的问题是Analog.Read()函数返回未签名的16位值的事实。但是,您的计数被称为“ int”,这意味着它是签名(+/-)值。因此,由于您将未签名的值分配给签名值,因此最重要的位(最大的值是所有更高电压)不再解释为数字,而是So-sopeats,而是作为负号,弄乱正确解释该值的任何尝试。
        因此,当您读取0V时,模拟。Read()函数将返回一个略大于32767的值,例如32842(更大的75)。但是,由于最高位被解释为负符号,而不是二进制编号的“ 1”,因此C语言将额外75的第一个数字视为负符号(将其变为-32767),其余的74在75个额外的值中,在额外的值中,您打印的最终值-32693。(-32767 + 74 = -32693)。使用更高的电压,这种负值将继续越来越接近“ 0”的值。
        解决此问题的最简单方法是简单地将您的变量计数声明为无符号整数:
        unsigned int count = 0;
        这将在更高的电压下修复您的计数值。
        我还发现了您的Map()函数的另一个问题。
        地图功能的第二个和第三个参数分别是您期望从要“扩展”的值中获得的最小值和最大值(在这种情况下为计数)。但是,作为模拟函数仅返回0和65535之间的无符号int值(零值对应于-5V,而65535值对应于 +5V),因此您永远不会给出-32767的映射函数-32767。
        因此,有几种方法可以解决此问题,您已经在一定程度上做到了这一点,但是为了解释,我无论如何都会列出它们。
        一个是当您从模拟计算电压时。阅读值使用
        电压= count *(10.0 / 65535.0)-5;
        equation in order to account for the fact that the 0 to 65535 range that analog.read gives is associated with -5V to +5V (a 10 V range). The -5V will then get the voltage back to the correct polarity. You would then also want to change the map function to say
        val = map(count, 0.0, 65535.0, -5.0, 5.0);
        另外,如果您真的想将-32767和32767保留为MAP()函数中的第二值和第三值,则可以从“计数”变量中减去32767,然后再将其授予MAP()函数。
        count =模拟。阅读(0)-32767;
        val = map(count, -32767.0, 32767.0, -5, 5);
        然后,这将“映射”您的计数到-5V至5V刻度,而模拟()函数正在工作。
        让我知道您是否有任何疑问。
        Thanks,
        詹姆士
        链接到评论
        在其他网站上分享

          这是解决问题的原因(可能有一种更优雅的方式):

          count =模拟。阅读(0);//阅读标记为“ In0”的端口
          if(count<0)
          {val = count+32767;
          }
          别的
          {val=count-32767;
          };
          float电压= val*(10.0/65535.0);
          链接到评论
          在其他网站上分享

          存档

          该主题现在已存档,并已关闭以进一步答复。