Тахометр

James
Offline
Зарегистрирован: 26.02.2016

Всем привет! Есть металический шкив, в нем есть 6 отверстий. Крутится он с макс скоростью 2000 об/м. Вопрос если взять индуктивный датчик приближения LJ12A3-4-ZBX, с него на оптрон, Arduino nano повесить на прерывания контакт с оптрона, добавить LCD 16x2, получится выводить обороты и с какой погрешностью?

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Посчитайте: сколько импульсов на оборот дает датчик.

a5021
Offline
Зарегистрирован: 07.07.2013

Че там считать? 200 герц -- частота следования импульсов.

James
Offline
Зарегистрирован: 26.02.2016

просто с какой точностью получится это? 2%?

a5021
Offline
Зарегистрирован: 07.07.2013

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

James
Offline
Зарегистрирован: 26.02.2016
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,16,2); 

unsigned long Tahometr_impulse_count;
float RPM;  
unsigned long Check_time ; 

void setup()
{ 
  Serial.begin(9600);    
  attachInterrupt(0, TahometrImpulse_on, FALLING);
  LCDinit();
 
}
void LCDinit()
{
  lcd.init(); // Инициализируем экран    
  lcd.backlight(); //включаем подсветку  
  lcd.setCursor(0,0);   
  lcd.print("RPM: ");//выводим строку 1    
}
void loop()
{
  delay(1000);   
  Calc_RPM();  
  lcd.setCursor(5,0);  
  lcd.print(ToString(RPM));
  
  
}

//**********************************************************************
void Calc_RPM(){
  
          

            detachInterrupt(0);                                        // запретили считать, на всякий случай, шоб не рыпался            
            int Taho_ChekTime = millis()-Check_time;                   // время между снятиями показаний счетчика              
            if (Taho_ChekTime > 0)  
            {                                                        // проверка на переполнение "милиса" ну вдруг больше  50 дней ))
              if (Tahometr_impulse_count ==6)                            // и  наличия насчитанных импульсов (на нолик делить не желательно.. будут запредельные значения в RPM)
              {                          
                  RPM=(((float)Tahometr_impulse_count/)/((float)Taho_ChekTime/1000))*30;  //подсчитываем среднее время периода, переводим в частоту, и приводим к об/минам уже деленым на 2
              }
                else
                  {
  		  RPM=0;							// если нет импульсов за время измерений  то  RPM=0
  		}
            }
             
              Tahometr_impulse_count = 0;                                //сбросили счетчик.
            Check_time = millis();                                     // новое время
            attachInterrupt(0, TahometrImpulse_on, FALLING);           // разрешили считать      
}
//**********************************************************************

 void  TahometrImpulse_on()
 { 
     Tahometr_impulse_count++;     
 }


String ToString(int i)
{
  String s =  String(i, DEC);
  while (s.length()<6) s=s+" ";
  return s;
}

ловить импульсы лучше при переходе 0-1? и считать их 6 штук - это будет один оборот, правильно?