Многопоточность в ардуино
- Войдите на сайт для отправки комментариев
Вс, 19/02/2017 - 19:19
Добрый день. Дисплей выводит информацию не так быстро, как нужно для нормальной работы устройства - проблема в том, что считывание датчиков нужно каждую миллисекунду, а при отрисовке итерация цикла производится дольше, чем 1мс (отрисовка 3 раза в секунду). Вопрос - как можно решить подобную проблему? чтобы цикл крутился, как ему положено, и дисплей рисовал не подтормаживая основной цикл
всё что в лупе не относящееся к дисплею вынести отдельно и зацепить на таймер к примеру или датчики цеплять на прерывание, по одному датчику и на таймер и на прерывание лично сам пробовал, а более - специалисты подскажут
постановка самого вопроса дебильная.
зачем опрашивать раз в мс если вы все равно выводите не быстрее 3 раз в секунду.
тем более может оказаться что датчики сами по себе тоже инертны и н смогут вам за 1мс и получить запрос и замерить и отправить обратно данные. да и сигнал могут держать на выходе тоже опред.время. скажем сигнал висит там секунду. а вы 1000 раз будете его колошматить и получать один и тот же сигнал.
Почему же дебильная? Глупо говорить такое, не узнав зачем это нужно.
За одну секунду работы двигателя на холостом ходу с сигнального провода поступает 28 импульсов (14 оборотов двигателя в секунду * 60 = 840 оборотов в минуту) + лишние пульсации напряжения, из за которых пришлось усложнить обработку входящего сигнала. Выходит, обработчик должен обрабатывать до 200 импульсов в секунду, и это всего лишь тахометр!
И если с этим более менее закончено, то сейчас приступаю к анализу питания форсунок, а с ними еще сложнее. Впереди еще датчики АБС. При опросе датчиков даже с переодичностью в 10 мс уже ничего не получится.
Многопоточность сделать можно, но это сложно. Лучше сначала всё-таки попробовать конечные автоматы оптимизировать.
Опросы датчиков засунуть в прерывания по таймеру. Про многопоточность - проще исходить из её невозможности, хоть это не совсем так. Не знаю что там за экран, но вероятно перерисовываете его целиком, что плохо.
Почему же дебильная? Глупо говорить такое, не узнав зачем это нужно.
За одну секунду работы двигателя на холостом ходу с сигнального провода поступает 28 импульсов (14 оборотов двигателя в секунду * 60 = 840 оборотов в минуту) + лишние пульсации напряжения, из за которых пришлось усложнить обработку входящего сигнала. Выходит, обработчик должен обрабатывать до 200 импульсов в секунду, и это всего лишь тахометр!
И если с этим более менее закончено, то сейчас приступаю к анализу питания форсунок, а с ними еще сложнее. Впереди еще датчики АБС. При опросе датчиков даже с переодичностью в 10 мс уже ничего не получится.
У Вас неверная логика работы.
Для тахометра не нужно обрабатывать все 200 импульсов в секунду - вполне достаточно замерить расстояние между фронтами двух соседних импульсов. Т.е. цикл измерения длится всего 5 мс.
Ну и вопросы Вы тоже неверно задаете.
В Вашей задаче важно то, что цель измерения результатов совсем не отображение из на экране. Вы об этом не упомянули, а это принципиально важно: без этого уточнения Ваша задача неразрешима (по крайней мере, на используемом Вами "железе").
Я подобное организовал на 2 ардуинах. 1 отрабатывает логику, вторая выводит картинку на экран. соеденил их через RX-TX
Интересный способ. Спасибо за информацию
Почему же дебильная? Глупо говорить такое, не узнав зачем это нужно.
За одну секунду работы двигателя на холостом ходу с сигнального провода поступает 28 импульсов (14 оборотов двигателя в секунду * 60 = 840 оборотов в минуту) + лишние пульсации напряжения, из за которых пришлось усложнить обработку входящего сигнала. Выходит, обработчик должен обрабатывать до 200 импульсов в секунду, и это всего лишь тахометр!
И если с этим более менее закончено, то сейчас приступаю к анализу питания форсунок, а с ними еще сложнее. Впереди еще датчики АБС. При опросе датчиков даже с переодичностью в 10 мс уже ничего не получится.
Элементарно. Настраиваете внешнее прерывание по импульсу тахометра, цепляете к нему счетчик, считаете число импульсов например за 0,5 сек, умножаете на 2, выводите на дисплей, считаете за следующие 0,5 сек, умножаете на 2, выводите на дисплей. А пульсации напряжения сглаживаете внешней цепочкой.
А если импульсов мало, то правильнее будет считать по 0,5 сек, а выводить число отсчетов за последнее 0,5 сек + предыдущие 0,5 сек.
Можно конечно и длину интервалов считать, но учитывая что у вас пульсации напряжения имеют место быть, показания будут сильно прыгать. Придется ещё цифровой фильтр для сглаживания показаний приделывать. Что существенно усложнит вашу программу.
перепробовав несколько вариантов, остановился на самом "устойчивом" и точном. Засекаю время, за которое происходит 20 импульсов (10 оборотов двигателя). Единственное не комильфо - обновление данных тем чаще, чем быстрее крутится двигатель. Если он вовсе остановится, система "зависнет", поэтому поставил ограничение на таймер. По поводу пульсаций - сигналы беру не с катушки зажигания, где можно "поймать" все, хоть ближайшую радиостанцию, а с блока управления двигателем. Но даже тут не все чисто оказалось... Увидел лишь визуально на импровизированном осцилографе:
Белые полоски - шаг в 10 мс,
Зеленые шпалы - питание есть, черные - питания нет (тут и происходит искра в свече зажигания),
В нижней части дисплея частые прерывания - переключил режим с 10 мс на 100, в общем не обращайте внимания.
Если приглядется, в зеленых шпалах можно заметить крохотное прерывание напряжения - оно мелкое, в один пиксель. Оно скорее всего быстрее миллисекунды. Вот из за него обороты и были в два раза больше, и из за него я все время перепроверял свои множители раз за разом...
В общем с тахометром легко. Тема создавалась из за другой проблемы - как считать накапливаемые данные. А именно с датчиков АБС, т.е. показателей движения автомобиля. Необходимо не только показать с их помощью текущую скорость автомобиля, но и сохранять накопленный километраж, сколько проехал автомобиль. Как это реализовать при редком опросе датчиков, пока не придумал.