Регулятор оборотов диз.двигателя.

PiratFox

★★★★★✩✩
13 Фев 2020
1,695
472
е надо никого никуда толкать
толкнуть можно под машину или с горы, когда хочеш избавиться от кого-то
это Вы того... Перебираете. Я не это имел ввиду. Я к тому, что пусть люди изучают языки программирования. Может, тупых будет чуть меньше...
 
  • Лойс +1
Реакции: tpga2008

kalobyte

★★★✩✩✩✩
1 Янв 2020
726
146
Не верю, извините. Никак не верю.
за 30 лет я так и не стал программистом :ROFLMAO:
можно бренчать на гитаре возле падика, можно размазывать гавно по холсту, но вот при все желании стать музыкантом или художником не получится
с программистами такая же херня
как бы там кто ни говорил, что это легко и может любой, на самом деле не может
 
  • Лойс +1
Реакции: kostyamat

kalobyte

★★★✩✩✩✩
1 Янв 2020
726
146
да не будет никто этого делать.
ну это куда проще и быстрее, чем изучать программирование в коде
я посмотрел несколько роликов и понял концепцию соединения блоков и сам попробовал
конечные автоматы довольно легко делаются
все думаю купить этот сименс лого полный комплект и заняться его изучением
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,695
472
как бы там кто ни говорил, что это легко и может любой, на самом деле не может
ну я и не говорил такого. Однако же не попробуешь - не узнаешь, правда? Так что пробовать надо, тем более если желание есть.
 

tpga2008

✩✩✩✩✩✩✩
17 Апр 2020
35
2
да не будет никто этого делать.
Ну почему же никто не будет...
К примеру тот, кто "...учил по Белинскому..." (честно говоря понятия не имею кто это, я про людей когда то самостоятельно что-то изучавших по книгам) при необходимости отсмотрит и сотню часов, прочтет десяток книг, но в вопросе разберется.
А вот современное поколение не способно концентрироваться более получаса на чем то конкретном.
 
Изменено:

tpga2008

✩✩✩✩✩✩✩
17 Апр 2020
35
2
автор, для твоих задач идеально подходит флпрог
Занятная вещица!
С разбегу конечно не получится что то сделать, надо разбираться.
Я вот запнулся на том, что установленная версия проги отличается от той, что в роликах, например в ролике он использует блок "Преобразование строк", а в той, что я установил этого нет, или скорее всего это я пока не нашел

11.JPG
Ну ничего, по вечерам поковыряюсь..
 
Изменено:

kalobyte

★★★✩✩✩✩
1 Янв 2020
726
146
я тоже давно не открывал ее
просто глянул по менюшкам
 

b707

★✩✩✩✩✩✩
4 Июн 2020
54
18
Неправильно было
C++:
attachInterrupt(0,sens,RISING); //подключить прерывание на 2 пин при повышении сигнала
надо

C++:
attachInterrupt(2,sens,RISING); //подключить прерывание на 2 пин при повышении сигнала
не, как раз attachInterrupt(0,sens,RISING); - было правильно, верни обратно
 

tpga2008

✩✩✩✩✩✩✩
17 Апр 2020
35
2
Вроде все работает как задумано, единственный косяк - периодически выскакивают значения оборотов от 19 000 до 30 000.
Выскакивают рандомно, иногда раз в сек, иногда по нескольку минут нет.
Причину пока не пойму, возможно ловит помехи (провода пока не экранированные).
На работу это сильно не влияет, мотор не успевает среагировать, но неприятно когда непонятно...
Если не найду причину, возможно ли прописать в коде что-то навроде "...если значение >10 000 держаться менее 0,3 сек., то считать, что значение в норме, т.е. 1330 (а лучше равно последнему значению)..."? Сам пока не соображу как...
Скетч:
C++:
//-----------дисплей-----------
#include <Arduino.h>
#include <TM1637Display.h>

// Контакты для подключения модуля (цифровые контакты)
#define CLK 5
#define DIO 4



TM1637Display display(CLK, DIO);
//--------дисплей-------
volatile int unsigned long lastflash;
volatile int RPM;

void setup() {
Serial.begin(9600); //открыть порт
display.setBrightness(2);//яркость дисплея
// определить состояни ног 8 и 9 для исключения ложных сработок при включении
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
//-------Счетчик оборотов на датчике холла----------

attachInterrupt(0,sens,RISING); //подключить прерывание на 2 пин при повышении сигнала
pinMode(3, OUTPUT); //3 пин как выход на датчик холла
pinMode(8, OUTPUT); //8 пин как выход на ТНВД в -
pinMode(9, OUTPUT); //9 пин как выход на ТНВД в +
digitalWrite(3, HIGH); //подать 5 вольт на 3 пин
}
void sens() {
RPM=60/((float)(micros()-lastflash)/1000000); //расчет
lastflash=micros(); //запомнить время последнего оборота
}

void loop() {

display.showNumberDec(RPM, false); //вывод на дисплей оборотов коленвала (норма 1330)
if ((micros()-lastflash)>1000000){ //если сигнала нет больше секунды
RPM=0; //считаем что RPM 0
}
//---------контроль оборотов-------
//норма 2000 оборотов

if (RPM>1350){ //если обороты увеличатся на 20 об/мин
digitalWrite(9, HIGH);//защита от одновременного включения с 9 пином
digitalWrite(8, LOW); //подать 1 вольт на 8 пин для вкл мотора ТНВД на уменьшение оборотов;
}
else if (RPM<1310){ //если обороты уменьшатся на 20 об/мин
digitalWrite(8, HIGH);//защита от одновременного включения с 8 пином
digitalWrite(9, LOW); //подать 1 вольт на 9 пин для вкл мотора ТНВД на увеличение оборотов;
}
else if (RPM > 1325 && RPM < 1335){ //когда обороты больше 1325 и меньше 1335
  //подать 5 вольт на 8 и 9 пины для откл мотора ТНВД
digitalWrite(9, HIGH);
digitalWrite(8, HIGH);
}

Serial.println(RPM); //вывод в порт
delay(200); //задержка для стабильности
}
11.jpg
 
Изменено:

Александр Симонов

★★★★✩✩✩
2 Авг 2018
727
207
Вроде все работает как задумано, единственный косяк - периодически выскакивают значения оборотов от 19 000 до 30 000.
Выскакивают рандомно, иногда раз в сек, иногда по нескольку минут нет.
Причину пока не пойму, возможно ловит помехи (провода пока не экранированные).
На работу это сильно не влияет, мотор не успевает среагировать, но неприятно когда непонятно...
Если не найду причину, возможно ли прописать в коде что-то навроде "...если значение >10 000 держаться менее 0,3 сек., то считать, что значение в норме, т.е. 1330 (а лучше равно последнему значению)..."? Сам пока не соображу как...
Введи ещё одну переменную rawRPM, именно её рассчитывай в прерывании. А в основном цикле проверяй, нормальные ли показания в rawRPM, и если да, присваивай RPM = rawRPM.
 

b707

★✩✩✩✩✩✩
4 Июн 2020
54
18
если значение >10 000 держаться менее 0,3 сек., то считать, что значение в норме,
к чему так сложно? Вы же знаете физические пределы оборотов своего мотора? - у дизеля наверно больше 4-5 тысяч и быть не может. Просто считайте любые показания выше 5 тыс ошибкой, без всяких там задержек в 0.3 секунды и умной логики
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
как вариант считать дельту оборотов как новые обороты - старые обороты. и если значение какое то чудовищное , то новые не учитывать. Однако все верхние варианты имеют право на существование
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
А попробуй такой мод
небольшая цензура кода:
//-----------дисплей-----------
#include <Arduino.h>
#include <TM1637Display.h>

// Контакты для подключения модуля (цифровые контакты)
#define CLK 5
#define DIO 4

TM1637Display display(CLK, DIO);

volatile int RPM;

void sens() {
  int unsigned long lastflash = 0;
  if ((micros() - lastflash) > 1000000) RPM = 0;
  else  RPM = 60 / ((float)(micros() - lastflash) / 1000000.0);
  lastflash = micros();
}


void setup() {
  Serial.begin(9600); //открыть порт
  display.setBrightness(2);//яркость дисплея

  //-------Счетчик оборотов на датчике холла----------


  pinMode(3, OUTPUT); //3 пин как выход на датчик холла
  pinMode(8, OUTPUT); //8 пин как выход на ТНВД в -
  pinMode(9, OUTPUT); //9 пин как выход на ТНВД в +
 
  // определить состояни ног 8 и 9 для исключения ложных сработок при включении
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
  digitalWrite(3, HIGH);

  pinMode(2, INPUT); //3 пин как выход на датчик холла
  sens();
  attachInterrupt(0, sens, RISING); //подключить прерывание на 2 пин при повышении сигнала
}

void loop() {
  static int old_RPM = 0;
  if (old_RPM != RPM)
  {
    if (abs(old_RPM-RPM)>1000) Serial.println("ERROR RPM!");
    
    display.showNumberDec(RPM, false);
    Serial.println(RPM); //вывод в порт
    old_RPM = RPM;
  }

  if (RPM > 1350) { //если обороты увеличатся на 20 об/мин
    digitalWrite(9, HIGH);//защита от одновременного включения с 9 пином
    digitalWrite(8, LOW); //подать 1 вольт на 8 пин для вкл мотора ТНВД на уменьшение оборотов;
  }
  else if (RPM < 1310) { //если обороты уменьшатся на 20 об/мин
    digitalWrite(8, HIGH);//защита от одновременного включения с 8 пином
    digitalWrite(9, LOW); //подать 1 вольт на 9 пин для вкл мотора ТНВД на увеличение оборотов;
  }
  else if (RPM > 1325 && RPM < 1335) { //когда обороты больше 1325 и меньше 1335
    //подать 5 вольт на 8 и 9 пины для откл мотора ТНВД
    digitalWrite(9, HIGH);
    digitalWrite(8, HIGH);
  }

}
 

tpga2008

✩✩✩✩✩✩✩
17 Апр 2020
35
2
А попробуй такой мод
Пока не все понял, попробую разобраться...

pinMode(2, INPUT); //3 пин как выход на датчик холла
А это для чего, вроде по умолчанию INPUT должно быть?


Кстати, когда питание на датчик шло с 3 пина, в мониторе вообще свистопляска была, попробовал взять питание со стороны (с другого блока питания) и стало более менее нормально, остался указанный косяк. Возможно дело в длинном проводе на датчик (около 3м еще и не экранированный)
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
А это для чего, вроде по умолчанию INPUT должно быть?
Это второй пин, для прерывания который. коммент прост скопировался из соседней строки.

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

tpga2008

✩✩✩✩✩✩✩
17 Апр 2020
35
2
В скетче я только убрал делей
Совсем без делея тоже плохо, экспериментировал с ноутом у генератора от "без делея" до delay(1500) с шагом в 50, наиболее стабильно работает с delay(200).
Меня все же гложет вопрос: какой сигнал в идеале должен приходить на 2 пин и что в теории вызывает такие скачки в десятки тысяч?
Я использую такой модуль, сигнал беру с D0, может попробовать с А0?
Или вообще взять только голый датчик?
Сегодня так же попробую использовать родные провода с генератора, там буквально каждый провод во всех цепях идет в своей экран.оплетке.
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
726
146
и что в теории вызывает такие скачки в десятки тысяч?
электромагнитные выбросы, наводки на сопли
ардуиновские платы не предназначены для работы нигде, кроме как стола разработчика, ибо являются платами разработчика
 
  • Лойс +1
Реакции: Arhat109

tpga2008

✩✩✩✩✩✩✩
17 Апр 2020
35
2
наводки на сопли
Т.е. экран мое спасение?
Так же модуль датчика будет в стальном корпусе, сама ардуинка с релейным модулем (цепи модуля развязаны оптопарами) так же будет в отдельном металлическом наглухо закрытом корпусе, все соединения через экранированные разъемы.
GND сажать на корпус или лучше тянуть отдельный "-" на каждый элемент?
Где то читал, что экран нужно цеплять на корпус только с одной стороны, только не помню с какой, со стороны датчиков или на корпус с платой?
Может еще ферритовые кольца на все VCC?
 
Изменено:

kalobyte

★★★✩✩✩✩
1 Янв 2020
726
146
проще все на плате развести и в металлический корпус засунуть
а датчик через оптопару развязать
для питания есть такие маломощные дц-дц конвертеры развязывающие питание
у меня котроллер чпу станка так и развязан
концевики через оптопары, а питание на светодиоды через такой конвертер
выходы на драйверы двигателей тоже развязаны, только оптопары на самих драйверах стоят

без развязок раньше от импульсных выбросов шаговиков срабатывали концевики
сделай еще фильтр на движок топливного насоса
 

tpga2008

✩✩✩✩✩✩✩
17 Апр 2020
35
2
проще все на плате развести и в металлический корпус засунуть
Так у меня на генераторе уже везде разъемы, экраны и метал.корпуса на каждый элемент есть, че бы не использовать готовое)))

дц-дц конвертеры
Такой пойдет?

Есть ли в этом смысл?:
GND сажать на корпус или лучше тянуть отдельный "-" на каждый элемент?
Может еще ферритовые кольца на все VCC?
 
Изменено:

kalobyte

★★★✩✩✩✩
1 Янв 2020
726
146
нет, он же гальванически связан
вот так выглядят гальванические развязки по питанию

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

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