Тахометр с входом синхронизации

Demeter
Offline
Зарегистрирован: 08.03.2020

Доброго времени суток.

Интересует тахометр, но с измерением не в об/мин а об/импульс.

То есть измеритель количества импульсов на входе 1 в промежутке времени между импульсами на входе 2.

Надеюсь доступно обьяснил.

Может кто подскажет ссылку на похожее.

Спасибо!

З.Ы. Если тему создал не в том разделе, прошу модератора перенести в соответствующий. Спасибо за понимание. Я новичек.

bwn
Offline
Зарегистрирован: 25.08.2014

Demeter пишет:

З.Ы. Если тему создал не в том разделе, прошу модератора перенести в соответствующий. Спасибо за понимание. Я новичек.

Пока что, просится "Ищу исполнителя", вы готовы оплатить работу?

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

Demeter, вариантов сразу просится куча - считаем импульсы одним таймером (внешнее тактирование), отсекаем другим (прерывание по захвату). Или отсечные импульсы ловить внешними прерываниями...
А дальше уже нужна конкретика. Для этого я сейчас слегка нетрезв:)

Demeter
Offline
Зарегистрирован: 08.03.2020

У меня два датчика.

Один на валу двигателя, второй на валу после вариатора (редуктор с изменяемым передаточным числом).

Нужно измерить количество оборотов на валу после вариатора относительно одного оборота двигателя.

Теоретически, нужен тахометр, но вместо тактирования по времени, нужно тактирование по входу (датчику на двигателе) 

По идее, можно применить скетч тахометра, но с изменениями.

Думал, что кто-нить видел нечто подобное, или может оно по другому называется, и я не могу найти.

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

Вы хотите разобраться сами или получить готовое решение?

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

Странно, что автомобилисты сюда пишут, а не на drive2

Demeter
Offline
Зарегистрирован: 08.03.2020

Хочу разобратся, немного умею ИЗМЕНЯТЬ скетч для своих нужд.

Но с ноля не готов написать.

Погуглю "тахометр для ардуино на 1602" может выложу скетч и кто поможет.

А вообще - я мыслю в правильном направлении на счет тахометра? Или там скетч жестко привязан к времени? 

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

Там - это где?

Demeter
Offline
Зарегистрирован: 08.03.2020

sadman41 пишет:
Странно, что автомобилисты сюда пишут, а не на drive2

Да не автомобилист я. Станок на работе хитрый имеется. Вот и просит оператор сделать нечто подобное. Реально ему облегчит настройку станка.

А тахометр - потому что другое название в голову не приходит... счетчик импульсов... опять не то...

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

Да дело-то незамысловатое, если просто импульсы в промежутке посчитать. Вопрос только в скорости и точности.

Demeter
Offline
Зарегистрирован: 08.03.2020

Скорость, от 40 до 90 импульсов после вариатора к одному импульсу до вариатора, в зависимости от сорости вращения мотора - это будет примерно 30-300 импульсов в секкунду.

Точность - 1-2 импульса, не критично. Просто должно быть сообщение, к примеру "70мм" где 1 импульс = 1мм

Demeter
Offline
Зарегистрирован: 08.03.2020

Вот, к примеру, из соседней ветки


volatile unsigned int int_tic=0; 
volatile unsigned long tic; 
#include <LiquidCrystal.h> 
LiquidCrystal lcd(8, 9, 3, 4, 6, 7);

void setup() {
lcd.begin(16, 2);
TCCR1A=0; TIMSK1 = 1<<TOIE1; //прерывание по переполнению
}
ISR (TIMER1_OVF_vect){ int_tic++; }

void loop() {

pinMode (5,INPUT); // вход сигнала T1 (only для atmega328)
TCCR1B = (1<<CS10)|(1<<CS11)|(1<<CS12);//тактировани от входа Т1
delay(500);
TCCR1B=0;
tic= ((uint32_t)int_tic<<16) | TCNT1; //сложить что натикало
int_tic=0; TCNT1 = 0; 
lcd.setCursor(0, 0);
lcd.print("RpS= ");
lcd.print(tic);
lcd.print("      ");
int RpM = tic*60;
lcd.setCursor(0, 1);
lcd.print("RpM= ");
lcd.print(RpM);
lcd.print("      ");
}

 

Тут есть, как я понимаю, тактирование.

Не могу понять некоторые строки кода, например 8-ая

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

Читаете про attachInterrupt: https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/

В обработчике делаете  +1 volatile переменной, назовём её Counter1. Это будут импульсы на входе №1.

Второй вход читаете в лупе через digitalRead(). Дёрнулся - запоминаете в переменной startPulsesNum значение Counter1. Дёрнулся ещё раз - запоминаете в переменной endPulsesNum значение Counter1. Искомая величина - это endPulsesNum-startPulsesNum.

Через таймеры интересней, но наврядли сами справитесь.

bwn
Offline
Зарегистрирован: 25.08.2014

Кароч, пока в "Песочницу". ТС, почитайте начало приколоченной темы. Сделайте выводы, оцените свои силы.

Гриша
Offline
Зарегистрирован: 27.04.2014

ИМХО... проблема на стыке алгоритма обработки  (чистая математика) и аппаратных возможностей.

для повышения точности необходимо усреднение - не на 1 первичный импульс, а несколько. Соответственно измерение необходимо ограничить по времени (для малых оборотов). В первом приближении запустить 2 счетчика первый 3-5 отсчетов, второй соответственно останавливать по первому, а потом делить один на другой.

(это следствие того, что скорость двигателя переменная)

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

Адаптивный алгоритм — алгоритм, который пытается выдать лучшие результаты путём постоянной подстройки под входные данные. 

 

ВН
Offline
Зарегистрирован: 25.02.2016

Demeter пишет:
А тахометр - потому что другое название в голову не приходит... счетчик импульсов... опять не то...

То что хотите посчитать это будет текущим передаточным числом вариатора.

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

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

Помочь по простому, как садман41 подсказал или сами справитесь? (ну почти как)

#define SIGNAL1 2  //пин датчика двигателя
#define SIGNAL2 3  //пин датчика вариатора
#define LCD_I2C // Если дисплей подключен по I2C

#ifdef LCD_I2C
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 20, 4); // A0,A1,A2 -HIGH
/*
 * A0 A1 A2 PCF8574A
 * 0  0  0  - 0x38
 * 1  0  0  - 0x39
 * 0  1  0  - 0x3A
 * 1  1  0  - 0x3B
 * 0  0  1  - 0x3C
 * 1  0  1  - 0x3D
 * 0  1  1  - 0x3E
 * 1  1  1  - 0x3F 
 * 
 */
#else
#include <LiquidCrystal.h>
// Initialize the library with the numbers of the interface pins
LiquidCrystal lcd(4, 5, 6, 7, 8, 9);
#endif

// Требуемые переменные
volatile uint32_t count = 0;
volatile uint32_t count_1 = 0;
volatile uint32_t count_2 = 0;

void strobe(){
  count = count_2 - count_1;
  count_1 = count_2;
}

void counter(){
   count_2++;
}

void setup() {
#ifdef LCD_I2C
 lcd.begin();
 #else
 lcd.begin(16, 2);
#endif

 lcd.setCursor(0, 0);
 lcd.print("   VARIATOR   ");
 lcd.setCursor(6, 1);
 lcd.print(count);
 attachInterrupt(0, strobe, RISING);
 attachInterrupt(1, counter, RISING);
}

void loop() {
  lcd.setCursor(0, 0);
  lcd.print("   VARIATOR   ");
  lcd.setCursor(6, 1);
  lcd.print("           ");
  lcd.setCursor(6, 1);
  lcd.print(count);
  delay(100);
}

 

Demeter
Offline
Зарегистрирован: 08.03.2020

ua6em пишет:

Помочь по простому

Спасибо большое.

А как к этому добавить тахометр вала вариатора?

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

Demeter пишет:

ua6em пишет:

Помочь по простому

Спасибо большое.

А как к этому добавить тахометр вала вариатора?

видимо считать за определённый промежуток времени
Сами одолеете или помочь?