нужна помощь со счетчиком изменения оборотов

Тема в разделе "Arduino & Shields", создана пользователем Volf, 27 фев 2015.

  1. Volf

    Volf Нерд

    Нужна помощь, нужно сделать так, чтобы ардуино считал кол-во оборотов в минуту с помощью оптического энкодера, а не просто выдавал значения 1 и 0, помогите, пожалуйста)
    Код (Text):
    #define reed 7
    int reedVal;
    void setup()
    {
      Serial.begin(9600);
    }
    void loop()
    {
      reedVal = analogRead(reed);
      Serial.println(reedVal);
    delay(10);  
    }
    пока это все, что у меня есть(
     
  2. vvr

    vvr Инженерище

    а какой у тебя энкодер?
    пока ты написал код чтения данных с потенциометра
     
  3. Volf

    Volf Нерд

     

    Вложения:

    • IeEDTsH0NpQ.jpg
      IeEDTsH0NpQ.jpg
      Размер файла:
      156,9 КБ
      Просмотров:
      825
  4. vvr

    vvr Инженерище

    ну а какое колесо ?
     
  5. vvr

    vvr Инженерище

  6. Volf

    Volf Нерд

    какое колесо будет точно известно только на днях, я думаю, программу можно будет пока без него написать, с произвольными данными, а потом изменить их. В колесе будет только одно отверстие
     
  7. vvr

    vvr Инженерище

    тебе нужно написать простой счётчик по прерываниям на восходящем фронте.
    когда прорезь входит в зону светового луча на цифровом пине будет 1 и значение оборотов увеличится на 1.
     
  8. vvr

    vvr Инженерище

    вот набросал на прерываниях по нисходящему фронту

    Код (Text):

    #define PIN  2          ////  прерывания на 2 и 3 пинах
    volatile boolean count = false;
    int rot = 0;

    void setup()
    {
      pinMode(PIN, INPUT);
      attachInterrupt(0, isr, FALLING);
      Serial.begin(9600);
    }

    void loop()
    {
      Serial.println(rot);
    }

    void isr()
    {                                          
      if(digitalRead(PIN) == HIGH && count == false)
      {  
        count = true;                                  
      }
      if(digitalRead(PIN) == LOW && count == true)
      {      
        count = false;                                
        rot ++;
      }
    }


     
     
  9. X-Dron

    X-Dron Гик

    vvr, тс нужно не количество оборотов, а количество оборотов в минуту, т.е. скорость.
    Код будет примерно такой:
    Код (Text):
    #define PIN  2          ////  прерывания на 2 и 3 пинах
    boolean FirstInt;
    float Speed1 = 0;    //в оборотах в секунду
    float Speed2 = 0;    //в оборотах в минуту
    long LastMs;

    void setup()
    {
      pinMode(PIN, INPUT);
      attachInterrupt(0, isr, RISING);
      FirstInt = true;
      Serial.begin(9600);
    }

    void loop()
    {
      Serial.print(Speed1);
      Serial.print("    ");
      Serial.println(Speed2);
    }

    void isr()
    {
      long CurrMs = millis();
      if(FirstInt)
      {
        FirstInt = false;                                
      }else{
        Speed1 = 1000/float(CurrMs - LastMs);
        Speed2 = Speed1 * 60;
      }
      LastMs = CurrMs;
    }
    По первому вызову прерывания только фиксируем текущие миллисекунды (можно и микросекунды, но думаю, такая точность не понадобится). Во все остальные вызовы вычитаем из текущих миллисекунд сохраненные. Это будет период имульсов в миллисекундах.
    1000/float(CurrMs - LastMs) это сокращенное от 1/(float(CurrMs - LastMs)/1000)
    float(CurrMs - LastMs)/1000 - период имульсов в секундах. Если 1 поделить на это значение, то получится частота в герцах.

    По Вашему коду, насколько я понимаю, прерывание это и есть фронт сигнала. И если написано
    attachInterrupt(0, isr, FALLING);
    то
    Код (Text):
      if(digitalRead(PIN) == HIGH && count == false)
      {
        count = true;                                
      }
    выполняться никогда не будет. Не?
    Вообще, в прерываниях, повешанных на дискретный вход опрашивать этот вход не нужно
     
  10. vvr

    vvr Инженерище

    я написал код по подсчёту оборотов, про об в мин , если честно, упустил:)
     
  11. Volf

    Volf Нерд

    Спасибо огромное!)) все вычисляет)))
     
  12. X-Dron

    X-Dron Гик

    Для вывода float с десятичной точкой попробуй такой Loop
    void loop()
    {
    Serial.print(Speed1, 3);
    Serial.print(" ");
    Serial.println(Speed2, 1);
    }