【问题标题】:Does arduino count++ has a limit and how to fix it?arduino count++ 是否有限制以及如何解决?
【发布时间】:2018-12-04 17:21:51
【问题描述】:

我需要为工作物品制作一个计米器,所以我决定只使用 Arduino。我找到了一个旧的编码器,找到/编写了一个简单的代码并将它们全部破解并遇到了一个意想不到的问题。

由于某种原因,我的计数器不会超过 8 米或 31991 个编码器脉冲。一旦达到这个 8m 的限制,数字变为负数并开始倒数,如 -7.9 > -7.8(即继续向上计数至 0)。
然后它达到零并再次计数到 8...

这对我来说很奇怪,我有限的编码知识无法解决它。

有谁知道如何解决这个问题或我可以做些什么来使它工作?

#include <LiquidCrystal.h>

#define inputA_in 6
#define inputB_in 7

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int inputA_V = 0;
int inputB_V = 0;
int inputA = 0;
int inputB = 0;
int counter = 0;
// smeni vrednost tuka pred run 
int console_frequency_milliseconds = 200; /// edna sekunda


int aLastState = 0;
int bLastState = 0;
float meters = 0.0;
unsigned long lasttime = 0;

int move_positive = 0;
int move_negative = 0; 

  int maximum_input_digital_v = 300;   //treba da citash od konzola i da gi setirash max i min
  int minimum_input_digital_v = 0;
  int logical_threshold_v = 150;       //brojkive se random staveni

void setup() {

  pinMode (inputA_in, INPUT);
  pinMode (inputB_in, INPUT);

  Serial.begin (9600);

  lcd.begin(16, 2);
  // Print a message to the LCD
  lcd.print("Metraza [m]");

  aLastState = inputA;
  bLastState = inputB;
  lasttime = 0;
}

void loop () {

  inputA = digitalRead(inputA_in);

  if (inputA != aLastState) {
    if (digitalRead(inputB_in) != inputA) {
      counter ++;
      aLastState = inputA;
    } else {
      counter --;
       aLastState = inputA;
    }
  }
   if (millis() - console_frequency_milliseconds > lasttime)//Detect once every 150ms
  {
    meters = 0.50014 * counter / 2000;
    Serial.print("Position: ");
    Serial.println(meters);
       lasttime = millis();

  lcd.setCursor(0, 1);
  //Print a message to second line of LCD
  lcd.print(meters);
  }

}

【问题讨论】:

标签: c++ count arduino counter limit


【解决方案1】:

你的计数器是一个简单的int

int counter = 0;

在您的系统上,它们似乎只有 16 位宽(最大值为 32767),这并不奇怪。
使用

long int counter = 0;

获得更广泛的变量。

您可能还想从

更改计算
meters = 0.50014 * counter / 2000;

meters = 0.50014 * counter / 2000.0;

以避免丢失精度和范围。即使使用 int 可以将您的范围从 31991 个编码器脉冲扩展到 32757 个编码器脉冲;和更大范围的模拟。

您可能还想尝试将counter 更改为unsigned intunsigned long int。我没有分析你的整个代码,但我认为你没有任何依赖负数表示的东西。因此,您可能可以再次将范围加倍。但不能保证,需经过测试。

【讨论】:

  • 谢谢你们,你们总是让我看起来很愚蠢 :) 我检查了 long int 背后的理论,它会为我完成这项工作,因为我只需要测量大约 2000m,再次感谢.
  • 我的荣幸。顺便说一句,你知道吗? stackoverflow.com/help/someone-answers
  • 你好@miloshIra。我看到您已经参与并且没有回应我的建议,以澄清您认为这个答案有帮助的缺失内容。如果这不是您要寻找的,那么您确实需要解释原因,因为(冒着看似徒劳的风险),您似乎不会得到另一个不同的答案。所以如果你在等什么,请告诉我。
猜你喜欢
  • 2015-09-07
  • 2011-10-06
  • 2012-06-24
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
相关资源
最近更新 更多