首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Arduino中使用霍尔传感器计算旋转次数?

如何在Arduino中使用霍尔传感器计算旋转次数?
EN

Stack Overflow用户
提问于 2021-01-13 23:31:16
回答 1查看 312关注 0票数 0

我想用霍尔传感器来计算按下按钮时的旋转次数。所以为了计数,我写了下面的代码:

代码语言:javascript
复制
const int hallPin = D3;
boolean lastRevolutionPin = LOW;
boolean currentRevolutionPin = LOW;
unsigned long Count = 0;
    
void setup() {
  pinMode (hallPin, INPUT);
  Serial.begin(9600);
}
    
void loop() {
  currentRevolutionPin = check(lastRevolutionPin, hallPin);
  if (lastRevolutionPin == HIGH && currentRevolutionPin == LOW) {
    Count++;
    Serial.println(Count)
  }
  lastRevolutionPin = currentRevolutionPin;
}
    
boolean check(boolean last, int pin) {
  boolean current = digitalRead(pin);
  if (last != current) {
    delay(5);
    current = digitalRead(pin);
  }
  return current;
}

现在这段代码可以工作了,但是当我尝试使用它作为一个函数,开始计数并在几轮之后返回反馈时,该函数进入无限循环,并且我得到了一个软WTD重置。

所以请告诉我如何创建一个计算旋转次数的函数,并在特定的旋转后返回一个值,然后我可以在固定的旋转次数后对其执行另一个操作。

这是我试图让一个函数计数的代码,但它进入了无限循环并导致看门狗重置。

代码语言:javascript
复制
const int hallPin = D3;
boolean lastRevolutionPin = LOW;
boolean currentRevolutionPin = LOW;
unsigned long Count = 0;
    
void setup() {
  pinMode (hallPin, INPUT);
  Serial.begin(9600);
}
    
void loop() {
  Serial.println(pleasecountaccurate());
  Count = 0;
}
    
int pleasecountaccurate() {
  while (Count < 20) { // I want to return only when it completed 20 rotations 
    currentRevolutionPin = check(lastRevolutionPin, hallPin);
    if (lastRevolutionPin == HIGH && currentRevolutionPin == LOW) {
      Count++;
    }
    lastRevolutionPin = currentRevolutionPin;
  }
  return Count;
}
    
boolean check(boolean last, int pin) {
  boolean current = digitalRead(pin);
  if (last != current) {
    delay(5);
    current = digitalRead(pin);
  }
  return current;
}
EN

回答 1

Stack Overflow用户

发布于 2021-01-14 10:25:30

在为小型嵌入式设备编码时,您应该避免使用任何阻塞代码。这样做会造成各种各样的问题,包括缺乏响应能力,无法做简单的事情,如闪烁的LED,以及与看门狗的问题。

每当您退出loop()时,看门狗都会被重置,因此如果您打开了看门狗,则必须始终避免阻塞。

如果你不阻塞,你不应该错过霍尔传感器的任何脉冲。

你试过这个吗?

代码语言:javascript
复制
constexpr int hallPin = D3;       // using constexpr here saves 2 bytes of RAM.

unsigned char turnsCount = 0;
bool lastHallState = false;

// note that variables are passed by reference, making this function
// available for any number of hall sensors.
bool CheckTurnsCount(int pin, bool& lastState, unsigned char& count, unsigned char maxCount)
{
    bool curState = digitalRead(pin); 

    count += (lastState && !curState);  // tests and comparisons return either 0 or 1
    lastState = curState;

    if (count < maxCount)
        return false;

    count = 0;
    return true;
}

void setup() 
{
    pinMode (hallPin, INPUT);
    Serial.begin(9600);
    lastHallState = digitalRead(hallPin);
}

void loop()
{
    if (CheckTurnsCount(hallPin, lastHallState, turnsCount, 20))
        Serial.println("tick");

    // here you should still have plenty of cpu time for other controls ;)
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65704973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档