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

tpga2008
Offline
Зарегистрирован: 19.04.2020
 
Уважаемые мастера, добрый день.
Прошу проверить скетч для регулятора оборотов диз.двигателя (сам я новичок в этом деле, поэтому прошу помощи у более опытных спецов))).
Для контроля оборотов планируется датчик холла, который считывает обороты с зуб.колеса (фото)
За один оборот коленвала над датчиком пройдет 5 зубов.
Управление подачей топлива осуществляется моторчиком на ТНВД.
Моторчик будет управляться через релюшки, которыми будем управлять 8 и 9-м пинами.
 
Скетч:
 
//-----------дисплей-----------
#include <Arduino.h>
#include <TM1637Display.h>
 
// Контакты для подключения модуля (цифровые контакты)
#define CLK 5
#define DIO 4
 
 
 
TM1637Display display(CLK, DIO);
//--------дисплей-------
unsigned long lastflash;
int RPM;
 
void setup() {
Serial.begin(9600); //открыть порт
 
//-------Счетчик оборотов на датчике холла----------
 
attachInterrupt(0,sens,RISING); //подключить прерывание на 2 пин при повышении сигнала
pinMode(3, OUTPUT); //3 пин как выход
digitalWrite(3, HIGH); //подать 5 вольт на 3 пин
}
void sens() {
RPM=60/((float)(micros()-lastflash)/1000000); //расчет
lastflash=micros(); //запомнить время последнего оборота
}
 
void loop() {
display.setBrightness(2);
display.showNumberDec(RPM/5, false); //вывод на дисплей оборотов коленвала (обороты зуб.колеса делим на 5)
if ((micros()-lastflash)>1000000){ //если сигнала нет больше секунды
RPM=0; //считаем что RPM 0
}
//---------контроль оборотов-------
 
if (RPM>8050){ //если обороты увеличатся на 10 об/мин
digitalWrite(8, HIGH); //подать 5 вольт на 8 пин для вкл мотора ТНВД на уменьшение оборотов;
}
if (RPM=8000){ //когда обороты уменьшатся до 1600 (1600*5=8000)
digitalWrite(8, LOW); //снять 5 вольт с 8 пина для откл мотора ТНВД на уменьшение оборотов;
}
if (RPM<7950){ //если обороты уменьшатся на 10 об/мин
digitalWrite(9, HIGH); //подать 5 вольт на 9 пин для вкл мотора ТНВД на увеличение оборотов;
}
if (RPM=8000){ //когда обороты увеличатся до 1600 (1600*5=8000)
digitalWrite(9, LOW); //снять 5 вольт с 9 пина для откл мотора ТНВД на увеличение оборотов;
}
Serial.println(RPM); //вывод в порт
delay(1000); //задержка для стабильности
}
SLKH
Offline
Зарегистрирован: 17.08.2015
tpga2008
Offline
Зарегистрирован: 19.04.2020

//-----------дисплей-----------
#include <Arduino.h>
#include <TM1637Display.h>
 
// Контакты для подключения модуля (цифровые контакты)
#define CLK 5
#define DIO 4
 
 
 
TM1637Display display(CLK, DIO);
//--------дисплей-------
unsigned long lastflash;
int RPM;
 
void setup() {
Serial.begin(9600); //открыть порт
 
//-------Счетчик оборотов на датчике холла----------
 
attachInterrupt(0,sens,RISING); //подключить прерывание на 2 пин при повышении сигнала
pinMode(3, OUTPUT); //3 пин как выход
digitalWrite(3, HIGH); //подать 5 вольт на 3 пин
}
void sens() {
RPM=60/((float)(micros()-lastflash)/1000000); //расчет
lastflash=micros(); //запомнить время последнего оборота
}
 
void loop() {
display.setBrightness(2);
display.showNumberDec(RPM/5, false); //вывод на дисплей оборотов коленвала (обороты зуб.колеса делим на 5)
if ((micros()-lastflash)>1000000){ //если сигнала нет больше секунды
RPM=0; //считаем что RPM 0
}
//---------контроль оборотов-------
 
if (RPM>8050){ //если обороты увеличатся на 10 об/мин
digitalWrite(8, HIGH); //подать 5 вольт на 8 пин для вкл мотора ТНВД на уменьшение оборотов;
}
if (RPM=8000){ //когда обороты уменьшатся до 1600 (1600*5=8000)
digitalWrite(8, LOW); //снять 5 вольт с 8 пина для откл мотора ТНВД на уменьшение оборотов;
}
if (RPM<7950){ //если обороты уменьшатся на 10 об/мин
digitalWrite(9, HIGH); //подать 5 вольт на 9 пин для вкл мотора ТНВД на увеличение оборотов;
}
if (RPM=8000){ //когда обороты увеличатся до 1600 (1600*5=8000)
digitalWrite(9, LOW); //снять 5 вольт с 9 пина для откл мотора ТНВД на увеличение оборотов;
}
Serial.println(RPM); //вывод в порт
delay(1000); //задержка для стабильности
}

 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

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

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

По хорошему нужна сладкая парочка ШИМ+ПИД а не реле)))))))))))))))))))

tpga2008
Offline
Зарегистрирован: 19.04.2020

Это старый советский генератор и скорость регулирования оборотами достаточно медленная (примерно 3-5% в сек.).

Если заплавает, можно не 10, а 20 поставит, хотя и этого хватит.

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

Регулятор - пожелание клиента, которому надоели участившиеся подгорания контактов 50-летних релюшек, а на заводской контроллер типа dkg-253 ему жалко тратить двадцатку. О надежности ардуинки и возможных последствиях он предупрежден и готов с ними мириться.

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


 

SLKH
Offline
Зарегистрирован: 17.08.2015

tpga2008 пишет:


//-----------дисплей-----------
#include <Arduino.h>
#include <TM1637Display.h>
 
// Контакты для подключения модуля (цифровые контакты)
#define CLK 5
#define DIO 4
 
 
 
TM1637Display display(CLK, DIO);
//--------дисплей-------
unsigned long lastflash;
int RPM;
 
void setup() {
Serial.begin(9600); //открыть порт
 
//-------Счетчик оборотов на датчике холла----------
 
attachInterrupt(0,sens,RISING); //подключить прерывание на 2 пин при повышении сигнала
pinMode(3, OUTPUT); //3 пин как выход
digitalWrite(3, HIGH); //подать 5 вольт на 3 пин
}
void sens() {
RPM=60/((float)(micros()-lastflash)/1000000); //расчет
lastflash=micros(); //запомнить время последнего оборота
}
 
void loop() {
display.setBrightness(2);
display.showNumberDec(RPM/5, false); //вывод на дисплей оборотов коленвала (обороты зуб.колеса делим на 5)
if ((micros()-lastflash)>1000000){ //если сигнала нет больше секунды
RPM=0; //считаем что RPM 0
}
//---------контроль оборотов-------
 
if (RPM>8050){ //если обороты увеличатся на 10 об/мин
digitalWrite(8, HIGH); //подать 5 вольт на 8 пин для вкл мотора ТНВД на уменьшение оборотов;
}
if (RPM=8000){ //когда обороты уменьшатся до 1600 (1600*5=8000)
digitalWrite(8, LOW); //снять 5 вольт с 8 пина для откл мотора ТНВД на уменьшение оборотов;
}
if (RPM<7950){ //если обороты уменьшатся на 10 об/мин
digitalWrite(9, HIGH); //подать 5 вольт на 9 пин для вкл мотора ТНВД на увеличение оборотов;
}
if (RPM=8000){ //когда обороты увеличатся до 1600 (1600*5=8000)
digitalWrite(9, LOW); //снять 5 вольт с 9 пина для откл мотора ТНВД на увеличение оборотов;
}
Serial.println(RPM); //вывод в порт
delay(1000); //задержка для стабильности
}

 

1. строки 41 и 47 никуда не годные. В Си принято извращение: знак "=" означает не равенство, как у нормальных людей, а присваивание. 

Применять "==" тоже нельзя. Поставь там "<" или ">", где как надо по логике.

2. delay() желательно убрать. см. BlinkWithoutDelay

3. замени реле на выходах на транзисторные ключи. нежелательно часто чваркать контактами при индуктивной нагрузке.

Да, выходные пины сконфигурируй в setup. 

 

 

tpga2008
Offline
Зарегистрирован: 19.04.2020

[

Применять "==" тоже нельзя. Поставь там "<" или ">", где как надо по логике.

[/quote]

Прошу простить дилетанта: мне нужно, чтобы питание с релюшек (вернее теперь с тр.ключей) снималось по достижении заданных оборотов.

Т.е. моторчик работает пока RPM не достигнет 8000, после чего остановится.

Как правильно написать команду?

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

1) если хотите нормально решить вопрос, лучше заказать код

2) для регулирования оборотов лучше использовать Н-мост т.к. крутить мотор требуется в обе стороны

3) никакого ШИМ вам не требуется ввиду большой инерционности системы и отсутствия требований к суперточности.

4) строка 31 лишняя в лупе,ее место в сетапе. 

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

 

tpga2008
Offline
Зарегистрирован: 19.04.2020

Так я ж он самый и есть новичок, и готов учиться.

А мост ни к чему, моторчик старый простейший коллекторный, к тому же на 27в, пара релюшек будет переключать обмотку возбуждения в разные стороны.

b707
Онлайн
Зарегистрирован: 26.05.2017

tpga2008 пишет:

 моторчик работает пока RPM не достигнет 8000, после чего остановится.

Как правильно написать команду?

вместо вот этого

if (RPM>8050){ //если обороты увеличатся на 10 об/мин
digitalWrite(8, HIGH); //подать 5 вольт на 8 пин для вкл мотора ТНВД на уменьшение оборотов;
}
if (RPM=8000){ //когда обороты уменьшатся до 1600 (1600*5=8000)
digitalWrite(8, LOW); //снять 5 вольт с 8 пина для откл мотора ТНВД на уменьшение оборотов;
}
if (RPM<7950){ //если обороты уменьшатся на 10 об/мин
digitalWrite(9, HIGH); //подать 5 вольт на 9 пин для вкл мотора ТНВД на увеличение оборотов;
}
if (RPM=8000){ //когда обороты увеличатся до 1600 (1600*5=8000)
digitalWrite(9, LOW); //снять 5 вольт с 9 пина для откл мотора ТНВД на увеличение оборотов;
}

пишите например так:

if (RPM>8050){ //если обороты увеличатся на 10 об/мин
digitalWrite(8, HIGH); //подать 5 вольт на 8 пин для вкл мотора ТНВД на уменьшение оборотов;
}
else if (RPM<7950){ //если обороты уменьшатся на 10 об/мин
digitalWrite(9, HIGH); //подать 5 вольт на 9 пин для вкл мотора ТНВД на увеличение оборотов;
}
else { //когда обороты больше 7950 и меньше 8050
digitalWrite(9, LOW); //снять 5 вольт с 8 и 9 пина для откл мотора ТНВД на увеличение оборотов
digitalWrite(8, LOW);;
}

 

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

строки 26 и 33 на кой там такая точность с такими константами? там и millis  достаточно и упростите константы. 

tpga2008
Offline
Зарегистрирован: 19.04.2020

Просто счетчик оборотов я списал с удачно получившегося тахометра, который на прошлой неделе сделал))))

tpga2008
Offline
Зарегистрирован: 19.04.2020

b707 пишет:

 

}

пишите например так:

e { //когда обороты больше 7950 и меньше 8050
digitalWrite(9, LOW); //снять 5 вольт с 8 и 9 пина для откл мотора ТНВД на увеличение оборотов
digitalWrite(8, LOW);;
}

 

 

А не получится, что отключатся моторчик будет при 7951 и 8049?

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

если честно,  b707, предложил правильную запись, но я бы организовал гистерезисом весь функционал т.е. при срабатывании любого реле, я бы гнал значение до среднего (8000). Проще всего такое сделать через флаги. Попробуйте, это не сложно. 

tpga2008
Offline
Зарегистрирован: 19.04.2020

Гриша пишет:

если честно,  b707, предложил правильную запись, но я бы организовал гистерезисом весь функционал т.е. при срабатывании любого реле, я бы гнал значение до среднего (8000). Проще всего такое сделать через флаги. Попробуйте, это не сложно. 

А можно пример? (не расписать конкретно мой кривенький "шедевр", а чтонить похожее, чтобы я понял как это работает)

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

tpga2008 пишет:

А можно пример? (не расписать конкретно мой кривенький "шедевр", а чтонить похожее, чтобы я понял как это работает)

логическое И где второй параметр и есть флаг. т.е. if выполняется если оба условия верны. Ну а по выполнении флаг скинуть. 

b707
Онлайн
Зарегистрирован: 26.05.2017

Гриша пишет:

я бы организовал гистерезисом весь функционал т.е. при срабатывании любого реле, я бы гнал значение до среднего (8000). Проще всего такое сделать через флаги.

Да. поддерживаю. Это можно из без флагов сделать - просто последнее else в моем коде #10 заменить на else if (RPM > 7990 && RPM < 8010)

tpga2008
Offline
Зарегистрирован: 19.04.2020

Так?

01
if (RPM>8050){ //если обороты увеличатся на 10 об/мин
02
digitalWrite(8, HIGH); //подать 5 вольт на 8 пин для вкл мотора ТНВД на уменьшение оборотов;
03
}
04
else if (RPM<7950){ //если обороты уменьшатся на 10 об/мин
05
digitalWrite(9, HIGH); //подать 5 вольт на 9 пин для вкл мотора ТНВД на увеличение оборотов;
06
}
07
else if (RPM > 7990 && RPM < 8010){ //когда обороты больше 7950 и меньше 8050
08
digitalWrite(9, LOW); //снять 5 вольт с 8 и 9 пина для откл мотора ТНВД на увеличение оборотов
09
digitalWrite(8, LOW);;
10
}

 

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

чет элементарная вещь, а бошка не варит... не могу в уме посчитать конечный автомат на 2 шага :)))))))))))))

в принципе пост 17 прост для понимания, но я не люблю оставлять области, в которых состояние системы не определено. В данном случае это не критично... 

tpga2008
Offline
Зарегистрирован: 19.04.2020

Так сработает?

  
//-----------дисплей-----------
#include <Arduino.h>
#include <TM1637Display.h>
 
// Контакты для подключения модуля (цифровые контакты)
#define CLK 5
#define DIO 4
 
 
 
TM1637Display display(CLK, DIO);
//--------дисплей-------
unsigned long lastflash;
int RPM;
 
void setup() {
Serial.begin(9600); //открыть порт
display.setBrightness(2);
 
//-------Счетчик оборотов на датчике холла----------
 
attachInterrupt(0,sens,RISING); //подключить прерывание на 2 пин при повышении сигнала
pinMode(3, OUTPUT); //3 пин как выход
digitalWrite(3, HIGH); //подать 5 вольт на 3 пин
}
void sens() {
RPM=60/((float)(micros()-lastflash)/1000000); //расчет
lastflash=micros(); //запомнить время последнего оборота
}
 
void loop() {

display.showNumberDec(RPM/5, false); //вывод на дисплей оборотов коленвала (обороты зуб.колеса делим на 5)
if ((micros()-lastflash)>1000000){ //если сигнала нет больше секунды
RPM=0; //считаем что RPM 0
}
//---------контроль оборотов-------
 
if (RPM>8050){ //если обороты увеличатся на 10 об/мин
digitalWrite(8, HIGH); //подать 5 вольт на 8 пин для вкл мотора ТНВД на уменьшение оборотов;
}
else if (RPM<7950){ //если обороты уменьшатся на 10 об/мин
digitalWrite(9, HIGH); //подать 5 вольт на 9 пин для вкл мотора ТНВД на увеличение оборотов;
}
else if (RPM > 7990 && RPM < 8010){ //когда обороты больше 7950 и меньше 8050
digitalWrite(9, LOW); //снять 5 вольт с 8 и 9 пина для откл мотора ТНВД на увеличение оборотов
digitalWrite(8, LOW);;
}

Serial.println(RPM); //вывод в порт
delay(1000); //задержка для стабильности
}
Гриша
Offline
Зарегистрирован: 27.04.2014
tpga2008 пишет:
 
Так?
 
01
if (RPM>8050){ //если обороты увеличатся на 10 об/мин
02
digitalWrite(8, HIGH); //подать 5 вольт на 8 пин для вкл мотора ТНВД на уменьшение оборотов;
03
}
04
else if (RPM<7950){ //если обороты уменьшатся на 10 об/мин
05
digitalWrite(9, HIGH); //подать 5 вольт на 9 пин для вкл мотора ТНВД на увеличение оборотов;
06
}
07
else if (RPM > 7990 && RPM < 8010){ //когда обороты больше 7950 и меньше 8050
08
digitalWrite(9, LOW); //снять 5 вольт с 8 и 9 пина для откл мотора ТНВД на увеличение оборотов
09
digitalWrite(8, LOW);;
10
}

 

 
 
 
пойдет... если мусор убрать... есть еще нюанс -  в сетапе определить состояние ног явно, чтоб избежать ложных сработак при включении и реле защитить от одновременного включения... - зависит от схемы, но в любом случае, просчитать одновременное срабатывание, чтоб КЗ не случилось  
b707
Онлайн
Зарегистрирован: 26.05.2017

Гриша пишет:

 в любом случае, просчитать одновременное срабатывание, чтоб КЗ не случилось  

очень правильное замечание, вот так будет надежнее:

if (RPM>8050){ //если обороты увеличатся на 10 об/мин
  digitalWrite(9, LOW); 
  digitalWrite(8, HIGH); //подать 5 вольт на 8 пин для вкл мотора ТНВД на уменьшение оборотов;
  
}
else if (RPM<7950){ //если обороты уменьшатся на 10 об/мин
  digitalWrite(8, LOW);
  digitalWrite(9, HIGH); //подать 5 вольт на 9 пин для вкл мотора ТНВД на увеличение оборотов;
  
}
else if (RPM > 7990 && RPM < 8010){ //когда обороты больше 7950 и меньше 8050
  digitalWrite(9, LOW); //снять 5 вольт с 8 и 9 пина для откл мотора ТНВД на увеличение оборотов
  digitalWrite(8, LOW);
 }

 

tpga2008
Offline
Зарегистрирован: 19.04.2020

b707 пишет:

Гриша пишет:

 в любом случае, просчитать одновременное срабатывание, чтоб КЗ не случилось  

очень правильное замечание, вот так будет надежнее:

if (RPM>8050){ //если обороты увеличатся на 10 об/мин
  digitalWrite(8, HIGH); //подать 5 вольт на 8 пин для вкл мотора ТНВД на уменьшение оборотов;
  digitalWrite(9, LOW); 
}
else if (RPM<7950){ //если обороты уменьшатся на 10 об/мин
  digitalWrite(9, HIGH); //подать 5 вольт на 9 пин для вкл мотора ТНВД на увеличение оборотов;
  digitalWrite(8, LOW);
}
else if (RPM > 7990 && RPM < 8010){ //когда обороты больше 7950 и меньше 8050
  digitalWrite(9, LOW); //снять 5 вольт с 8 и 9 пина для откл мотора ТНВД на увеличение оборотов
  digitalWrite(8, LOW);
 }

 

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

tpga2008
Offline
Зарегистрирован: 19.04.2020

b707 пишет:

Гриша пишет:

 в любом случае, просчитать одновременное срабатывание, чтоб КЗ не случилось  

очень правильное замечание, вот так будет надежнее:

if (RPM>8050){ //если обороты увеличатся на 10 об/мин
  digitalWrite(8, HIGH); //подать 5 вольт на 8 пин для вкл мотора ТНВД на уменьшение оборотов;
  digitalWrite(9, LOW); 
}
else if (RPM<7950){ //если обороты уменьшатся на 10 об/мин
  digitalWrite(9, HIGH); //подать 5 вольт на 9 пин для вкл мотора ТНВД на увеличение оборотов;
  digitalWrite(8, LOW);
}
else if (RPM > 7990 && RPM < 8010){ //когда обороты больше 7950 и меньше 8050
  digitalWrite(9, LOW); //снять 5 вольт с 8 и 9 пина для откл мотора ТНВД на увеличение оборотов
  digitalWrite(8, LOW);
 }

 

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

tpga2008
Offline
Зарегистрирован: 19.04.2020

Гриша пишет:

пойдет... если мусор убрать...   

А где я намусорил?)))

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

пост 21 строки 15 17 19 и иже с ними

 

 

tpga2008
Offline
Зарегистрирован: 19.04.2020

Исправляю...

 
//-----------дисплей-----------
#include <Arduino.h>
#include <TM1637Display.h>
 
// Контакты для подключения модуля (цифровые контакты)
#define CLK 5
#define DIO 4
 
 
 
TM1637Display display(CLK, DIO);
//--------дисплей-------
unsigned long lastflash;
int RPM;
 
void setup() {
Serial.begin(9600); //открыть порт
display.setBrightness(2);
digitalWrite(8, LOW);
digitalWrite(9, LOW);

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

display.showNumberDec(RPM/5, false); //вывод на дисплей оборотов коленвала (обороты зуб.колеса делим на 5)
if ((micros()-lastflash)>1000000){ //если сигнала нет больше секунды
RPM=0; //считаем что RPM 0
}
//---------контроль оборотов-------
 
if (RPM>8050){ //если обороты увеличатся на 10 об/мин
digitalWrite(8, HIGH); //подать 5 вольт на 8 пин для вкл мотора ТНВД на уменьшение оборотов;
digitalWrite(9, LOW);
}
else if (RPM<7950){ //если обороты уменьшатся на 10 об/мин
digitalWrite(9, HIGH); //подать 5 вольт на 9 пин для вкл мотора ТНВД на увеличение оборотов;
digitalWrite(8, LOW);
}
else if (RPM > 7990 && RPM < 8010){ //когда обороты больше 7950 и меньше 8050
digitalWrite(9, LOW); //снять 5 вольт с 8 и 9 пина для откл мотора ТНВД на увеличение оборотов
digitalWrite(8, LOW);;
}

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

 

b707
Онлайн
Зарегистрирован: 26.05.2017

строчки 43-44 поменяйте местами. и 47-48 так же. Чтобы сначала LOW , а потом HIGH.

Я в своем коде поправил

tpga2008
Offline
Зарегистрирован: 19.04.2020

Исправил...

 
//-----------дисплей-----------
#include <Arduino.h>
#include <TM1637Display.h>
 
// Контакты для подключения модуля (цифровые контакты)
#define CLK 5
#define DIO 4
 
 
 
TM1637Display display(CLK, DIO);
//--------дисплей-------
unsigned long lastflash;
int RPM;
 
void setup() {
Serial.begin(9600); //открыть порт
display.setBrightness(2);
digitalWrite(8, LOW);
digitalWrite(9, LOW);

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

display.showNumberDec(RPM/5, false); //вывод на дисплей оборотов коленвала (обороты зуб.колеса делим на 5)
if ((micros()-lastflash)>1000000){ //если сигнала нет больше секунды
RPM=0; //считаем что RPM 0
}
//---------контроль оборотов-------
 
if (RPM>8050){ //если обороты увеличатся на 10 об/мин
digitalWrite(9, LOW);
digitalWrite(8, HIGH); //подать 5 вольт на 8 пин для вкл мотора ТНВД на уменьшение оборотов;
}
else if (RPM<7950){ //если обороты уменьшатся на 10 об/мин
digitalWrite(8, LOW);
digitalWrite(9, HIGH); //подать 5 вольт на 9 пин для вкл мотора ТНВД на увеличение оборотов;
}
else if (RPM > 7990 && RPM < 8010){ //когда обороты больше 7950 и меньше 8050
digitalWrite(9, LOW); //снять 5 вольт с 8 и 9 пина для откл мотора ТНВД на увеличение оборотов
digitalWrite(8, LOW);;
}

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

 

SLKH
Offline
Зарегистрирован: 17.08.2015

tpga2008 пишет:

Цитата:

Применять "==" тоже нельзя. Поставь там "<" или ">", где как надо по логике.

Прошу простить дилетанта: мне нужно, чтобы питание с релюшек (вернее теперь с тр.ключей) снималось по достижении заданных оборотов.

Т.е. моторчик работает пока RPM не достигнет 8000, после чего остановится.

Как правильно написать команду?

правильно - больше или меньше.

ибо условие (RPM==8000) может никогда не совпасть с моментом проверки if.

tpga2008
Offline
Зарегистрирован: 19.04.2020

Так?

else if (RPM > 7990 && RPM < 8010){ //когда обороты больше 7950 и меньше 8050

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

tpga2008 пишет:

Так?

else if (RPM > 7990 && RPM < 8010){ //когда обороты больше 7950 и меньше 8050

как бы сказать, это и правильно и не правильно.... чисто теоретически, допустим, у вас произошел замер частоты 7990, а следующий показал 8010. в данном конкретном случае, событие маловероятное, НО.... Вы можете объяснить состояние системы при указанном событии? - это чисто для понимания.

Гриша
Offline
Зарегистрирован: 27.04.2014
SLKH пишет:
ибо условие (RPM==8000) может никогда не совпасть с моментом проверки if.
 
строгое равенство можно поймать только раза с десятого, при десятом проходе системы через это условие
SLKH
Offline
Зарегистрирован: 17.08.2015

Гриша пишет:

SLKH пишет:
ибо условие (RPM==8000) может никогда не совпасть с моментом проверки if.
 
строгое равенство можно поймать только раза с десятого, при десятом проходе системы через это условие

можно с десятого, а можно и с 210. или реже.