Множитель импульсов от датчика скорости автомобиля
- Войдите на сайт для отправки комментариев
Вс, 26/07/2020 - 12:17
Всем привет!
Что делает программа:
Считывает с 5 пина входной сигнал частоты в диапазоне 1-300 Герц, переделывает его x3 и выводит новый преобразованный сигнал на 9 пин . Сигнал имеет скважность 50%.
int highTime; int lowTime; float period; int freq; unsigned int newFreq; void setup() { pinMode(5, INPUT_PULLUP); pinMode(9, OUTPUT); } void loop() { highTime = pulseIn(5, HIGH); lowTime = pulseIn(5, LOW); delay(50); period = highTime + lowTime; if (period != 0) { freq = 1000000 / period; Serial.print("FrequencyInput="); Serial.println(freq); if (freq <= 40 || freq> 315) { goto outt; } else { digitalWrite(LED_BUILTIN, HIGH); newFreq = freq * 3; tone(9, newFreq); digitalWrite(LED_BUILTIN, LOW); } } else { outt: noTone(9); } }
Хочу выслушать замечания, также хотел бы оптимизировать код, чтобы выдаваемая частота была более плавной.
Ну начнем с того , что tone() ниже 31Гц не умеет.
Этого достаточно ?
строка 15 убивает всю идею
Вы хотите или Вы просите их высказать? А то вон Кикабидзе тоже Ларису Ивановну хотел.
Я не знаю такого свойства частоты как "плавность", потому не понимаю о чём это, но если хотите - делайте. Если кто спросит, скажете, что я разрешил.
Что делает программа:
Считывает с 5 пина входной сигнал частоты в диапазоне 1-300 Герц, переделывает его x3 и выводит новый преобразованный сигнал на 9 пин .
Она этого не делает и делать не может. Задержка в строке №15 пропускает сразу пятнадцать периодов частоты 300Гц в течение которых программа ни на что не реагирует. Это не говоря уже о том, что tone не умеет выдавать меандры меньше 31Гц .
Скважность в процентах не измеряется. Это безразмерная величина равная отношению периода следования импульсов к длительности импульса.
Ну, и ещё одно замечание: этот раздел предназначен для описания готовых проектов. Решительно непонятно, что делает в нём Ваш пост.
Нет конечно.
Бетон вот в зависимости от способа заливки набирает минимальную конструкционную прочность за ~35 суток. Но с бетоном можно "дагавариццо" и бетон может застыть да хоть за час... Так-шо в этой стране tone() может не только ниже 31Гц, а даже -31Гц.
Скважность в процентах не измеряется. Это безразмерная величина равная отношению периода следования импульсов к длительности импульса.
позвольте с Вами поспорить :)
процент - это величина, служащая для выражения отношения части к целому, то есть двух величин одной размерности, и, как следствие - безразмерная.
Вполне подходит для выражения отношения длины импульса к длине полного периода :)
позвольте с Вами поспорить :)
Спорьте. Скважность меандра назовите, пожалуйста. Просто числом. А потом спорьте.
Пока конструктива никакого не увидел. Поясню. Строка 15, действительно может быть лишней, но на отвал круиз контроля она никак не повлияла. Думаю ее потом либо убрать совсем, либо уменьшить до 10.
Ну начнем с того , что tone() ниже 31Гц не умеет. Это я знаю, смысл программы в том, что меньше 40 тут и не нужно ничего делать.
Код:
if
(freq <= 40 || freq> 315)
27
{
28
goto
outt;
29
}
Поясню смысл программы: Она была написана для круиз контроля опель омега, для шевроле Лачетти. У лачетти 6 импульсов датчика скорости на метр, у омеги 18. Поэтому была написана данная программа. Частоту ниже 40 герц мы исключили.
Пока конструктива никакого не увидел.
какого конструктива вы ждете при таком подходе? -
Подобные задачи решаются немного по другому - входной счетчик импульсов на прерывании, выходной генератор на таймере. И, конечно, никаких делей при счете.
То, что написано у вас - это не серьезно. Это даже "оптимизировать" нет смысла, ибо в программе практически нет правильного кода. Но если вас устраивает - то дело ваше, не понятно только, каких советов вы тогда ждете.
...
Частоту ниже 40 герц мы исключили.
Пока конструктива никакого не увидел.
какого конструктива вы ждете при таком подходе? -
Подобные задачи решаются немного по другому - входной счетчик импульсов на прерывании, выходной генератор на таймере. И, конечно, никаких делей при счете.
То, что написано у вас - это не серьезно. Это даже "оптимизировать" нет смысла, ибо в программе практически нет правильного кода. Но если вас устраивает - то дело ваше, не понятно только, каких советов вы тогда ждете.
Можно примеры? Ссылки? Я с ардуино неделю, выложил то, что работает. Поэтому и обратился сюда, чтобы узнать, есть ли более лучшее решение.
В общем, молодец, всё здорово делаешь!
(это ведь конструктив, пральна?)
Ещё конструктива:
period = highTime + lowTime;
highTime и lowTime это время в мкс.
Вопрос за каким МПХ понадобился float period ?
Да, здесь можно поправить на другой тип данных. Потихоньку смотрю про прерывания и таймеры. Если разберусь, выложу доработанную версию.
В общем, молодец, всё здорово делаешь!
(это ведь конструктив, пральна?)
Сюда обратился, чтобы узнать все ли нормально сделано. Понимаю, что пока нет. Это мне и нужно было узнать, далее буду копать тему и улучшать. Торопился, делал пока именно то, что будет хотя бы работать. Немного подсказали куда смотреть, спасибо.
Нифига ты не понял, смотреть нужно в сторону:"переписать все полностью"
Это и подразумевается) Набираю сейчас инфу для этого.
вот, к примеру, в этой теме можно найти примеры, как померить частоту через прерывания:
http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/chtenie-shim-5-kgts
Почитал про аппаратное прерывание.
Вот такой вариант:
Идея ПО следующая: Мне интересен только диапазон входной частоты от 50 до 300 герц.
Т.к. активация круиза происходит со 150 герц (т.е. 50*3).
Тут в одном цикле я проверяю флаг и по прерыванию обрабатываю входную частоту и умножаю на 3 с последующим выводом.
Подскажите какие проблемы могут возникнуть в этом примере?
Подскажите какие проблемы могут возникнуть в этом примере?
работать не будет :)
pulsIn() не работает в прерывании. насколько мне известно.
Кроме того, все переменные, изменяемые в прерывании - должны быть описаны как волатиле. И еще - прерывание должно выполнятся как можно быстрее, поэтому все лищнее из него надо убирать. В вашем примере - в прерывании надо оставить только строчки 27 и 28, а все вычисления перенести в loop()
вы смотрели примеры в ветке, на которую я давал ссылку? - там в прерывании буквально один-два оператора.
Подскажите какие проблемы могут возникнуть в этом примере?
работать не будет :)
pulsIn() не работает в прерывании. насколько мне известно.
Кроме того, все переменные, изменяемые в прерывании - должны быть описаны как волатиле. И еще - прерывание должно выполнятся как можно быстрее, поэтому все лищнее из него надо убирать. В вашем примере - в прерывании надо оставить только строчки 27 и 28, а все вычисления перенести в loop()
вы смотрели примеры в ветке, на которую я давал ссылку? - там в прерывании буквально один-два оператора.
Замечания понял, попробую доработать. Да, примеры смотрел, учусь)
Такой пример промежуточный.
Буду думать как заменить pulsein
Придется на micros переходить)
Такой пример промежуточный.
Буду думать как заменить pulsein
Придется на micros переходить)
Тебе же ссылку дали, читай. Там есть уже практически готовый код
Буду думать как заменить pulsein
Зачем? Вам же сказали, просто вынесите его из прерывания.
Правда в том виде, как у Вас написано, Вам ничто не поможет. Есть три вопроса для размышления:
1. Сколько раз успеет сработать прерывание за время выполнения строчек №№27 и 28?
2. Как изменится работа программы, при срабатывании прерывания по переходам 1->0 и 0->1 ?
3. Например, переменная period оказалась равной 19608 (в строке 29). Частота при этом получается 1000000 / 19608 = 50,999592. А у Вас она округлится до 51 или до 50?