[uquote="BOB51",url="/forum/viewtopic.php?p=4711175#p4711175"]Немножко дополнительного садомазохизма в попытке поднять максимальное быстродействие (количество считанных импульсов) для пародии на частотомер в рамках ардуиньего референса (а заодно и симулятор погонять)...
Условие - не использовать ничего за рамками "стандарно - адуринко" - ни таймеры в режиме счета, ни дополнительные фокусы с дополнительным генератором 1mS на Т0, ни отказа от LOOP()...
Захват входного сигнала проводится обычным чтением лапок, а вот формирование измерительного окна чуток с извратом - использована генерация tone c последующей обработкой счетчика в прерывании от INT0.
Ну и компаратор по количеству входных импульсов - поставлено 33 - если меньше выход D8 = 1, ежли больше D8 = 0.
При такой схемке максимум корректно считанных импульсов возможен для условия
длительность активной части импульса (0) = 1100 микросекунд,
длительность пассивной части импульса (1) =1150 микросекунд.
Собственно несколько измененная схемка:
https://img.radiokot.ru/files/20529/3qzplyk6yn.GIF
скрин окна симулятора с максимальным количеством корректно считываемых импульсов
1746258262837_144dpi_75%.pdf
скрин окна симулятора с количеством импульсов ниже пороговой величины
1746258027399_144dpi_75%.pdf
и текст исходника (taho.ino)
Спойлер
Код: Выделить всё
/* проект taho
простейший автомат селектор количества импульсов в секунду
диапазон контроля от 0 до 200 импульсов в секунду (120 км/час)
ориентировочный порог (уставка) 33 импульса в секунду
решение для ардуино нано в рамках средств референса
параметры входных импульсов не известны, но
оговорено:
1. отсутствие дребезга фронтов (аппаратный антидребезг в источнике сигнала)
2. длительность активной части импульса не менее 1.1 милисекунд
3. длительность паузы не менее 1.15 милисекунд
точность сработки +/- 2 импульса */
// линия водного сигнала
#define Taho 6 // D6
// активный уровень входного сигнала исключительно LOW
//byte AlTaho = LOW;
// линия выходного сигнала
#define RelOut 8 // D8
// активный уровень выходного сигнала
byte AlRelOut = LOW;
// выход тактового сигнала на формирователь счетного окна
#define tonout 4 // D4
// вход тактового сигнала на формирователь счетного окна
#define toninp 2 // D2 (= INT0)
// флаг захвата фронта начала импульса или начала паузы
byte Fl = 0;
// флаг начала окна измерительного интервала
byte Fw = 0;
// счетик - накопитель импульсов
int cntTaho = 0;
// пороговое значение контрольной уставки количества импульсов
#define MaskTaho 33
// контрольный накопитель формирователя счетного окна
byte tmslot = 0;
// пороговое значение контрольной уставки накопителя формирователя счетного окна
#define MaskCtms 50
// функция бработчика прерывания формирователя счетного окна
void timeslot();
//----------
void setup() {
// put your setup code here, to run once:
pinMode(toninp, INPUT_PULLUP);
digitalWrite(tonout, HIGH); pinMode(tonout, OUTPUT);
pinMode(Taho, INPUT_PULLUP);
digitalWrite(RelOut, !AlRelOut); pinMode(RelOut, OUTPUT);
Fl = 0; Fw = 0; cntTaho = 0; tmslot = 0;
noInterrupts();
attachInterrupt(digitalPinToInterrupt(toninp), timeslot, FALLING);
interrupts();
}
void loop() {
// put your main code here, to run repeatedly:
while(LOW == digitalRead(Taho))
{
if(!Fl)
{
Fl = 1;
if(!Fw){ Fw = 1; tone(tonout, 50); } //cntTaho = 0;
}
}
Fl = 0;
while(HIGH == digitalRead(Taho))
{
if(!Fl)
{
Fl = 1;
if(Fw){ cntTaho++; }
}
}
Fl = 0;
}
//----------
// функция бработчика прерывания формирователя счетного окна
void timeslot()
{
tmslot++;
if(tmslot == MaskCtms)
{
noTone(tonout); digitalWrite(tonout, HIGH);
if(cntTaho < MaskTaho){ digitalWrite(RelOut, !AlRelOut); }
else{digitalWrite(RelOut, AlRelOut);}
tmslot = 0; cntTaho = 0; Fw = 0;
}
}
//----------
В принципе для релюшки, срабатывающей на требуемый порог вполне сгодится.
Для частотомера явно не особо пригодное решение, разве что обороты считать.
Но и исходные требования к входным импульсам зверские - от постоянного 0 до постоянной 1 при старте (и в любой момент работы)...
Да плюс тренировка мозгам и навыков пользования симулятором.

[/uquote]
Собственно, неясно только, почему вогнали себя в рамки- ОДНОЙ секунды опроса. Каюсь- это я так в самом начале ляпнул, но 1 сек- не логма, можно посчитать 66 импульсов за 2 сек, или 99- за три, имхо.
Я так понимаю, что, даже если приборчик и за 5 сек поймет, что скорость 20 км установлена, то плохо от этого никому не будет. Зато возможности Ардуино раздвигаются.
С другой стороны, функция отслеживания скорости не обязательна. У него одна функция: подать лог1 при скорости 20 км час, ине подавать ее- при скорости ниже 20 км час.