ВОПРОС Программирование датчика скорости вращения FC-03

GarryG
Offline
Зарегистрирован: 23.09.2020

Здравствуйте!

Я новичок в теме Arduino, не судите строго.

Не получается получить корректно частоту вращения колеса.

На малых оборотах все ок.

При увеличении оборотов показания срываются в 0.

Датчик FC-03. Arduino Nano.

Заранее Спасибо!!!

СКЕТЧ такой

 
int intensity = 0;
int last = 0;
int reading;
int sensorIni;
 
 
int encoder_pin = 2;  // The pin the encoder is connected           
unsigned int rpm;     // rpm reading
volatile byte pulses;  // number of pulses
unsigned long timeold; 
 
unsigned int pulsesperturn = 20;
 
 void counter()
 {
    //Update count
      pulses++;    
 }
 
void setup()
{
 
   Serial.begin(9600);
   
   pinMode(encoder_pin, INPUT);
 
   pulses = 0;
   rpm = 0;
   timeold = 0;
 
   attachInterrupt(0, counter, FALLING);
}
 
void loop()
{
 
   intensity = rpm;
 
   if (millis() - timeold >= 100){  /*Uptade every one second, this will be equal to reading frecuency (Hz).*/
 
 
   rpm = 2  * pulses;
   timeold = millis();
   pulses = 0;
   
   //Write it out to serial port
   Serial.print("RPM = ");
   Serial.println(rpm,DEC);
        }                       
}

 

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017
Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Не мало byte для количества импульсов ?

if (millis() - timeold >= 100) - в секунде 1000 милисекунд

GarryG
Offline
Зарегистрирован: 23.09.2020

Я пробовал разные значения временного отрезка byte.

Мне нужно как можно быстрее измерять скорость вращения колеса. В идеале 20-50 мсек. И на малых оборотах все ОК.

Почему на больших оборотах происходит срыв?

Может Nano не успевает обрабатывать прерывания?

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Большие обороты это сколько по вашему ?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Пока код правильно не вставишь, обсуждать нечего. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

оригинальный скетч измеряет за 1000 миллисекунд:
 

#define PIN_DO 2 // Установка контакта используемого в Arduino
volatile unsigned int pulses;
float rpm;
unsigned long timeOld;
#define HOLES_DISC 15
 
void counter()
{
 pulses++;
}
 
void setup()
{
 Serial.begin(9600);
 pinMode(PIN_DO, INPUT);
 pulses = 0;
 timeOld = 0;
 attachInterrupt(digitalPinToInterrupt(PIN_DO), counter, FALLING);
}
 
void loop()
{
 if (millis() - timeOld >= 1000)
 {
 detachInterrupt(digitalPinToInterrupt(PIN_DO));
 rpm = (pulses * 60) / (HOLES_DISC);
 Serial.println(rpm);
 
 timeOld = millis();
 pulses = 0;
 attachInterrupt(digitalPinToInterrupt(PIN_DO), counter, FALLING);
 }
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

Пока код правильно не вставишь, обсуждать нечего. 

как нечего! мерять обороты ФАЛЛИНГАМИ это куда? А?

GarryG
Offline
Зарегистрирован: 23.09.2020

int intensity = 0;
int last = 0;
int reading;
int sensorIni;


int encoder_pin = 2;  // The pin the encoder is connected           
unsigned int rpm;     // rpm reading
volatile byte pulses;  // number of pulses
unsigned long timeold; 

unsigned int pulsesperturn = 20;

 void counter()
 {
    //Update count
      pulses++;    
 }

void setup()
{

   Serial.begin(9600);
   
   pinMode(encoder_pin, INPUT);

   pulses = 0;
   rpm = 0;
   timeold = 0;

   attachInterrupt(0, counter, FALLING);
}

void loop()
{

   intensity = rpm;

   if (millis() - timeold >= 100){  /*Uptade every one second, this will be equal to reading frecuency (Hz).*/
 

   rpm = 2  * pulses;
   timeold = millis();
   pulses = 0;
   
   //Write it out to serial port
   Serial.print("RPM = ");
   Serial.println(rpm,DEC);
        }                       
}

 

GarryG
Offline
Зарегистрирован: 23.09.2020

вот такое пробное устройство. если просто крутнуть пальцами происходит срыв который видно на следующей картинке

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

заменить и посмотреть

volatile unsigned int pulses;
float rpm;

 

GarryG
Offline
Зарегистрирован: 23.09.2020

GarryG
Offline
Зарегистрирован: 23.09.2020

ua6em пишет:

заменить и посмотреть

volatile unsigned int pulses;
float rpm;

 

 

Спасибо! Не помогло

GarryG
Offline
Зарегистрирован: 23.09.2020

Мне не нужно мерить обороты в секунду. 

Нужно померить кол-во импульсов за малый промежуток времени.

Далее я уже домножу до необходимого. или через map 

sadman41
Offline
Зарегистрирован: 19.10.2016

Чтение переменной pulses неатомарно. См. ATOMIC_BLOCK

b707
Offline
Зарегистрирован: 26.05.2017

GarryG пишет:

Спасибо! Не помогло

покажите код после исправления

GarryG
Offline
Зарегистрирован: 23.09.2020



int intensity = 0;
int last = 0;
int reading;
int sensorIni;


int encoder_pin = 2;  // The pin the encoder is connected           
float rpm;     // rpm reading
volatile unsigned int pulses;
unsigned long timeold; 

unsigned int pulsesperturn = 20;

 void counter()
 {
    //Update count
      pulses++;    
 }

void setup()
{

   Serial.begin(9600);
   
   pinMode(encoder_pin, INPUT);

   pulses = 0;
   rpm = 0;
   timeold = 0;

   attachInterrupt(0, counter, FALLING);
}

void loop()
{

   intensity = rpm;

   if (millis() - timeold >= 100){  /*Uptade every one second, this will be equal to reading frecuency (Hz).*/
 

   rpm = 2  * pulses;
   timeold = millis();
   pulses = 0;
   
   //Write it out to serial port
   Serial.print("RPM = ");
   Serial.println(rpm,DEC);
        }                       
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

а в датчике точно 393 микросхема?

и таки да, присваивать надо атомарно
 

ATOMIC_BLOCK ( ATOMIC_FORCEON ){
 rpm = 2  * pulses;
 pulses = 0;
 timeold = millis();
  }

 

GarryG
Offline
Зарегистрирован: 23.09.2020

393

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

GarryG пишет:

393

должно работать, двигатель сколько оборотов даёт?

GarryG
Offline
Зарегистрирован: 23.09.2020

про атомарность первый раз слышу. нужно разобраться.

а как тогда будет выглядеть скетч?

спасибо!

GarryG
Offline
Зарегистрирован: 23.09.2020

не могу точно сказать обороты.

кручу пока пальцами

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

GarryG пишет:

не могу точно сказать обороты. кручу пока пальцами...

"берёшь чистый палец..." )))
PS из фильма

GarryG
Offline
Зарегистрирован: 23.09.2020

Добрый вечер

Посмотрел осциллографом выходы датчика FC-03

на аналоговом все ок

а на цифровом на высоких оборотах сигнал обрывается в 0.

т.е. дело не в програмной части

В чем может быть проблема?

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Высокие - это сколько? Миллион? Миллиард? Какая частота на фотоэлементе?

GarryG
Offline
Зарегистрирован: 23.09.2020

период импульсов при быстром вращении 1-1,2 ms

 

GarryG
Offline
Зарегистрирован: 23.09.2020

и еще

на аналоговом выходе с оптопары сигнал зависит от частоты

при больших оборотах амплитуда уменьшается до 2 вольт

 

GarryG
Offline
Зарегистрирован: 23.09.2020

может быть компаратор в датчике не срабатывает на малую амплитуду?

как это исправить?

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

а на выходе датчика точно меандр, если нет то там не 393 компаратор, а что-то другое, у меня в генераторе к катушке Мишина частота до 400 килогерц и меандр изумительный

посмотрел схему датчика, сделан по этой говняной схеме, работать без переделки не будет, можно попробовать уменьшить ёмкость до 1000 пикофарад, но это всё равно костыли

GarryG
Offline
Зарегистрирован: 23.09.2020

точно 393. и до срыва меандр тоже хороший

sadman41
Offline
Зарегистрирован: 19.10.2016

Оптосенсор тормозной?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:
Оптосенсор тормозной?

не думаю, он нагружен на ёмкость 100нан, тау одна миллисекунда, и как это должно работать?

GarryG
Offline
Зарегистрирован: 23.09.2020

спасибо попробую

GarryG
Offline
Зарегистрирован: 23.09.2020

уменьшить емкость помогло. Заработало так как необходимо

Спасибо ОГРОМНОЕ!!!!!!!!!

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

GarryG пишет:

уменьшить емкость помогло. Заработало так как необходимо

Спасибо ОГРОМНОЕ!!!!!!!!!

Это ты так думаешь, на самом деле надо использовать второй компаратор, чего он там без дела валяется И, кто знает, с какой интенсивностью смычком шоркать будешь )))

GarryG
Offline
Зарегистрирован: 23.09.2020

а где можно схему найти?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

GarryG пишет:

а где можно схему найти?

она секретная, в интернете не видел )))