это Вы того... Перебираете. Я не это имел ввиду. Я к тому, что пусть люди изучают языки программирования. Может, тупых будет чуть меньше...е надо никого никуда толкать
толкнуть можно под машину или с горы, когда хочеш избавиться от кого-то
это Вы того... Перебираете. Я не это имел ввиду. Я к тому, что пусть люди изучают языки программирования. Может, тупых будет чуть меньше...е надо никого никуда толкать
толкнуть можно под машину или с горы, когда хочеш избавиться от кого-то
за 30 лет я так и не стал программистомНе верю, извините. Никак не верю.
ну это куда проще и быстрее, чем изучать программирование в кодеда не будет никто этого делать.
ну я и не говорил такого. Однако же не попробуешь - не узнаешь, правда? Так что пробовать надо, тем более если желание есть.как бы там кто ни говорил, что это легко и может любой, на самом деле не может
Ну почему же никто не будет...да не будет никто этого делать.
Занятная вещица!автор, для твоих задач идеально подходит флпрог
Ишь оно где запрятано)))ну дык сколько лет прошло
не, как раз attachInterrupt(0,sens,RISING); - было правильно, верни обратноНеправильно было
надоC++:attachInterrupt(0,sens,RISING); //подключить прерывание на 2 пин при повышении сигнала
C++:attachInterrupt(2,sens,RISING); //подключить прерывание на 2 пин при повышении сигнала
Уже вернул, работает.верни обратно
//-----------дисплей-----------
#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); //задержка для стабильности
}
Введи ещё одну переменную rawRPM, именно её рассчитывай в прерывании. А в основном цикле проверяй, нормальные ли показания в rawRPM, и если да, присваивай RPM = rawRPM.Вроде все работает как задумано, единственный косяк - периодически выскакивают значения оборотов от 19 000 до 30 000.
Выскакивают рандомно, иногда раз в сек, иногда по нескольку минут нет.
Причину пока не пойму, возможно ловит помехи (провода пока не экранированные).
На работу это сильно не влияет, мотор не успевает среагировать, но неприятно когда непонятно...
Если не найду причину, возможно ли прописать в коде что-то навроде "...если значение >10 000 держаться менее 0,3 сек., то считать, что значение в норме, т.е. 1330 (а лучше равно последнему значению)..."? Сам пока не соображу как...
к чему так сложно? Вы же знаете физические пределы оборотов своего мотора? - у дизеля наверно больше 4-5 тысяч и быть не может. Просто считайте любые показания выше 5 тыс ошибкой, без всяких там задержек в 0.3 секунды и умной логикиесли значение >10 000 держаться менее 0,3 сек., то считать, что значение в норме,
это и есть костыль, когда кодом пытаются исправить непонятные ошибкиЕсли не найду причину, возможно ли прописать в коде
//-----------дисплей-----------
#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);
}
}
Пока не все понял, попробую разобраться...А попробуй такой мод
А это для чего, вроде по умолчанию INPUT должно быть?pinMode(2, INPUT); //3 пин как выход на датчик холла
Это второй пин, для прерывания который. коммент прост скопировался из соседней строки.А это для чего, вроде по умолчанию INPUT должно быть?
Совсем без делея тоже плохо, экспериментировал с ноутом у генератора от "без делея" до delay(1500) с шагом в 50, наиболее стабильно работает с delay(200).В скетче я только убрал делей
электромагнитные выбросы, наводки на соплии что в теории вызывает такие скачки в десятки тысяч?
Т.е. экран мое спасение?наводки на сопли
Так у меня на генераторе уже везде разъемы, экраны и метал.корпуса на каждый элемент есть, че бы не использовать готовое)))проще все на плате развести и в металлический корпус засунуть
Такой пойдет?дц-дц конвертеры
GND сажать на корпус или лучше тянуть отдельный "-" на каждый элемент?
Может еще ферритовые кольца на все VCC?
нет, он же гальванически связанТакой пойдет?