Считывание показаний с ДПКВ

fre
Offline
Зарегистрирован: 18.09.2022

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

помогите, пожалуйста, отредактировать скетч ниже

для снятия импульсов с этого датчика:

 

сигнальный провод датчика выдает 12 В относительно +питания (или замыкает на минус) при касании металла

в отсутствии металла сигнальный провод ни на что не завязан (разрыв цепи)

ардуино не читает сигнал датчика, подключал по схеме (резисторы 10 кОм):

 

скетч:

 
 
 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

1. Вставьте код как положено (как положено написано в первой теме раздела "Песочница"

2. Вставьте картинки как положено (как положено написано там же), не надо никаких ссылок, тем более ведущих на сообщение 404, как Ваша вторая.

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

fre
Offline
Зарегистрирован: 18.09.2022
byte n = 22;      
float r = 100;  
 
#include "LCD_1602_RUS.h"
LCD_1602_RUS lcd(0x3f, 16, 2);
 
float r_speed, rev_time;
volatile unsigned long lastflash, flash, lastshow;
unsigned int RPM;
String spaces = "       ";
 
void setup() {
  Serial.begin(9600);                
  attachInterrupt(0, sens, RISING);  
  pinMode(3, OUTPUT);                
  digitalWrite(3, HIGH);              
  lcd.init();              
  lcd.backlight();        
  lcd.setCursor(0, 0);      
  lcd.print(L"Обороты: ");  
  lcd.setCursor(0, 1);      
  lcd.print(L"Скорость: ");  
}
void sens() {
  flash = micros() - lastflash;  
  lastflash = micros();          
}
 
void loop() {
  if (micros() - lastflash > 1000000) {
    RPM = 0;                          
    r_speed = 0;
  } else {
    rev_time = (float) flash / 1000000 * n;            
    RPM = (float) 60 / rev_time;                      
    r_speed = (float) 2 * 3.1415 * r / 100 / rev_time * 3.6;
  }
  if (millis() - lastshow > 300) {  
    lcd.setCursor(9, 0);  
    lcd.print(RPM);      
    lcd.print(spaces);  
    lcd.setCursor(10, 1);
    lcd.print(r_speed);  
    lcd.print(spaces);  
    lastshow = millis();
  }
}

 

fre
Offline
Зарегистрирован: 18.09.2022

не удается прикрепить изображения

вторую ссылку обновил

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

там не сложно, но размер файла ограничен, дерзайте

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

fre пишет:

не удается прикрепить изображения

Значит, Вам не повезло. Это входной тест, который Вы пока не прошли. Как пройдёте, поговорим.

А по поводу программы, Вы хоть прокомментировать её можете? Что она у Вас делает?

fre
Offline
Зарегистрирован: 18.09.2022

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

fre
Offline
Зарегистрирован: 18.09.2022

fre
Offline
Зарегистрирован: 18.09.2022

fre
Offline
Зарегистрирован: 18.09.2022

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

этот сигнал надо пересчитать в количество оборотов вала

но сигнал не воспринимается ардуино

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016
attachInterrupt(0, sens, FALLING);  

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

fre пишет:

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

Я спросил, можете ли Вы прокомментировать программу. Что и где в ней делается? Ну, вот, например, для чего строки №34-36 исполняются херову тучу раз с одним и тем же значением flash (т.е. считается одно и то же). Зачем? Мне непонятно.

Можете прокомментировать?

И вообще, из Вас всё клещами вытаскивать? В другом месте Вы таки сказали, что не видит сигнала. Откуда сделан такой вывод? 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

fre пишет:

Это схема? Может хоть выводы транзистора подпишете? Они у разных транзисторов в разным местах.

Если слева коллектор, то почему нет нагрузочного резистора? Вы открытый коллектор к входу цепляете или что?

Может всё же схему нарисуете?

fre
Offline
Зарегистрирован: 18.09.2022
byte n = 22;      // число зубов на диске
float r = 80;   // радиус колеса В САНТИМЕТРАХ

#include "LCD_1602_RUS.h"
LCD_1602_RUS lcd(0x27, 16, 2);

float r_speed, rev_time;
volatile unsigned long lastflash, flash, lastshow;
unsigned int RPM;
String spaces = "       ";

void setup() {
  Serial.begin(9600);                  // открыть порт
  attachInterrupt(0, sens, RISING);    // подключить прерывание на 2 пин при повышении сигнала
  pinMode(3, OUTPUT);                  // 3 пин как выход
  digitalWrite(3, HIGH);               // подать 5 вольт на 3 пин
  lcd.init();                 // инициализация дисплея
  lcd.backlight();            // включить подсветку
  lcd.setCursor(0, 0);        // курсор слева 1 строчка
  lcd.print(L"Обороты: ");    // слово Обороты
  lcd.setCursor(0, 1);        // курсор слева 2 строчка
  lcd.print(L"Скорость: ");   // слово Скорость
}
void sens() {
  flash = micros() - lastflash;   // вычислить время между двумя оборотами
  lastflash = micros();           // запомнить время последнего оборота
}

void loop() {
  if (micros() - lastflash > 1000000) { // если сигнала нет больше секунды
    RPM = 0;                            // считаем, что всё стоит и не крутится
    r_speed = 0;
  } else {
    rev_time = (float) flash / 1000000 * n;             // время одного оборота в секундах, с учётом числа лопастей
    RPM = (float) 60 / rev_time;                        // обороты в минуту
    r_speed = (float) 2 * 3.1415 * r / 100 / rev_time * 3.6;  // скорость точки на радиусе, км/ч
  }
  if (millis() - lastshow > 300) {  // кадждые 300 миллисекунд
    lcd.setCursor(9, 0);  // курсор 9 слева 1 строчка
    lcd.print(RPM);       // выводим RPM
    lcd.print(spaces);    // очищаем цифры с прошлого вывода
    lcd.setCursor(10, 1); // курсор 10 слева 2 строчка
    lcd.print(r_speed);   // выводим скорость
    lcd.print(spaces);    // очищаем цифры с прошлого вывода
    lastshow = millis();  // сброс таймера
  }
}

 

fre
Offline
Зарегистрирован: 18.09.2022

-NMi-
Offline
Зарегистрирован: 20.08.2018

А зачем там транзистор? Подавай сигнал прямо с датчика через делитель. Прикручивай к ноге с прерыванием и считай количество импульсов за единицу времени. Или период. Фсё.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

fre пишет:

Повторяю вопрос про нагрузочный резистор. Его нет, как понимаю? И на пин идёт открытый коллектор? И чего Вы от него ждёте?

fre
Offline
Зарегистрирован: 18.09.2022

питание датчика 12 В

чтобы не убить вход ардуино ставим транзистор

fre
Offline
Зарегистрирован: 18.09.2022

резистора нет

схему поменяем

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

Можно включить внутреннюю подтяжку не меняя схемы.

nik182
Offline
Зарегистрирован: 04.05.2015

Komandir пишет:

Можно включить внутреннюю подтяжку не меняя схемы.

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

-NMi-
Offline
Зарегистрирован: 20.08.2018

fre пишет:

питание датчика 12 В

чтобы не убить вход ардуино ставим транзистор


Тебе бы в схеме ЭБУ, например Я7.2 глянуть, как там все сделано, там компаратор стоит на входе...

MaksVV
Offline
Зарегистрирован: 06.08.2015

в январь 7.2. сигнал дпкв идуктивный и достигает овер 40В. а ТС пишет про 12В, значит скорее всего имеет место датчик Холла. Достаточно делителя . подаем сигнал  на пин 2 через 22К и от него же на GND 10К. Скетч примерно такой

volatile uint16_t freq = 0;
volatile uint32_t prevfrreq = 0;

void setup() {
pinMode (2, INPUT);
attachInterrupt (0, zahvatDPKV, RISING);
Serial.begin (115200);
}


void zahvatDPKV()
{
uint32_t cur= micros(); freq = 1000000UL/(cur-prevfrreq);
prevfrreq = cur;
}

void loop() {

//-----вывод в терминал
 static uint32_t prevtime = 0;
 if (millis() - prevtime>1000){
  prevtime = millis();
  Serial.print ("Freq=");
  cli(); Serial.println(freq); sei(); Serial.println();
  }
//------

//-----обнуление частоты при отсутствии импульсов
cli();
if (micros() - prevfrreq>300000UL){freq = 0;}
sei();
//------
}

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

fre пишет:

Уважаемый, вам уже несколько раз посоветовали прижать вход 2 Ардуинки или к верху или к низу. Но Вы как баран публикуете эту схему.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

fre пишет:

резистора нет

схему поменяем

Простите, Вы здоровы?

Вы писали, что 

fre пишет:
сигнал не воспринимается ардуино

Вам объяснили, что без резистора он и не должен восприниматься.

Так надо не говорить "поменяем", а поменять, попробовать и сказать нам, что мол "проблема решилась" или "сигнал воспринимается, но работает не так" или ещё что.

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

-NMi-
Offline
Зарегистрирован: 20.08.2018

MaksVV
Какая хер разница, шо индуктивный, шо прямоугольный? Один хер, будем "нули" отслеживать. Это первое.
Второе: он не просил частотомер, он просил именно считывание, а там не просто пачка импульсов, там есть промежуток (и).

Посему сдаёцца мне шо не сдюжит дуня на миллсах сей скилл

Kakmyc
Offline
Зарегистрирован: 15.01.2018

-NMi- пишет:

Посему сдаёцца мне шо не сдюжит дуня на миллсах сей скилл

Все зависит от оборотов, но учитывая , что там ещё отрисовка и расчеты, показывать в любом случае будет хз что

MaksVV
Offline
Зарегистрирован: 06.08.2015

ТС, озвучьте какую машину мучаете, и цель обработки сигнала дпкв.  может и не нужен вам совсем сигнал дпкв. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

-NMi- пишет:
MaksVV Какая хер разница, шо индуктивный, шо прямоугольный? Один хер, будем "нули" отслеживать. Это первое. Второе: он не просил частотомер, он просил именно считывание, а там не просто пачка импульсов, там есть промежуток (и). Посему сдаёцца мне шо не сдюжит дуня на миллсах сей скилл

ну например в посте #7 речь шла про прямоугольный сигнал. А разница в том, что если там сигнал прямоугольный , амплитудой до 16В, то достаточно делителя. 

-NMi-
Offline
Зарегистрирован: 20.08.2018

Мне очень малоинтересны ваши деццкие игры в транзюки-резюки и делите их хоть на 1024, п#хх.  Мне больше интересен алгоритм, которым этот сигнал будет "разбираться на кирпичики". Подожду, мошт чо срастёццо)))

MaksVV
Offline
Зарегистрирован: 06.08.2015

какие кирпичики, ТСу только обороты нужны. таже если там есть пропуски зубьев, ввести счетчик фронтов, и считать/запоминать время только например на 58том фронте (при формуле 60-2).  

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

-NMi-
Offline
Зарегистрирован: 20.08.2018

Дык я её вааще на голом асме пейсал, обработчик таймера. 720 градусов (т.к. РВ крутицца 1/2 КВ) и занимала она со всеми плюхами до 300 команд или тактов (нипомню) прям весь конечный автомат в одном векторе. И нихера нихватило проца. Мошт я там чо и не знаю, в таймерах этих, но, йопси я с ней недели две.

Да, там почти голый луп (кнопки + экран) , всё основное на таймере висело...  у меня НЕ получилось более 1300-1500 об/мин.

Значит я херовый гамер, ну и х#й с ним.   )))

fre
Offline
Зарегистрирован: 18.09.2022

Знакомый делает болотоход

использует указанный датчик импульсов

нужно снимать в реальном времени сигнал с датчика на редукторе

 

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

тогда подключайте как описано в #22 и будет работать. частоту в обороты сами перевёдете. 

fre
Offline
Зарегистрирован: 18.09.2022

отсчет сам по себе идёт

MaksVV
Offline
Зарегистрирован: 06.08.2015

приведите схему подключения

MaksVV
Offline
Зарегистрирован: 06.08.2015

песец, скорость терминала 115200, он и будет идти там раз в секунду вывод настроен

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

fre пишет:

отсчет сам по себе идёт

Значит, проблема

fre пишет:
сигнал не воспринимается ардуино

решена.

Поздравляю.

Выясняйте всё ли нормально или что-то опять не так, и, если не так, выкладывайте актуальные версии схемы и кода вместе с описание "что не так".

fre
Offline
Зарегистрирован: 18.09.2022

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

вы перепутали направление делителя напряжения на схеме

К средней точке надо подключать ардуино, а не ДПКВ

fre
Offline
Зарегистрирован: 18.09.2022

MaksVV
Offline
Зарегистрирован: 06.08.2015

схема неверна. В #22      "от него же на GND 10К" имелось ввиду с пина 2 ардуино 10К на gnd

MaksVV
Offline
Зарегистрирован: 06.08.2015

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

fre
Offline
Зарегистрирован: 18.09.2022

исправил. ситуация не изменилась

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

fre пишет:

исправил. ситуация не изменилась

показывайте, что исправили, веры вам на слово нет никакой

MaksVV
Offline
Зарегистрирован: 06.08.2015

возможно вход 2 успел сгореть.  подключите теперь правильно на пин 3. В скетче поменять pinMode (3. INPUT ); и attachInterrupt (1, блабла); Если не заработает , отключить провод от датчика и просто на плюс 12В проводом позамыкать . 

 

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

MaksVV пишет:

просто на плюс 12В проводом позамыкать . 

 

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

fre
Offline
Зарегистрирован: 18.09.2022

проблема датчика в том, что сигнал с него либо "-", либо разрыв

MaksVV
Offline
Зарегистрирован: 06.08.2015

тогда  резисторов не надо , а  диод от пина  3 в сторону датчика . и в скетче pinMode(3, INPUT_PULLUP);

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

fre пишет:

проблема датчика в том, что сигнал с него либо "-", либо разрыв

блин... какой разрыв нах?

Вам уже 20 раз советовали подтянуть датчик к питанию!

MaksVV
Offline
Зарегистрирован: 06.08.2015

b707 пишет:

MaksVV пишет:

просто на плюс 12В проводом позамыкать . 

 

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

тогда придецца еще ардуинами затарится - цена  обучения