Многопоточность в ардуино

acces969
Offline
Зарегистрирован: 22.01.2017

Добрый день. Дисплей выводит информацию не так быстро, как нужно для нормальной работы устройства - проблема в том, что считывание датчиков нужно каждую миллисекунду, а при отрисовке итерация цикла производится дольше, чем 1мс (отрисовка 3 раза в секунду). Вопрос - как можно решить подобную проблему? чтобы цикл крутился, как ему положено, и дисплей рисовал не подтормаживая основной цикл

ZIA
ZIA аватар
Offline
Зарегистрирован: 04.02.2017

всё что в лупе не относящееся к дисплею вынести отдельно и зацепить на таймер к примеру или датчики цеплять на прерывание, по одному датчику и на таймер и на прерывание лично сам пробовал, а более - специалисты подскажут

arDubino
Offline
Зарегистрирован: 12.01.2017

постановка самого вопроса дебильная.

зачем опрашивать раз в мс если вы все равно выводите не быстрее 3 раз в секунду.

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

acces969
Offline
Зарегистрирован: 22.01.2017

Почему же дебильная? Глупо говорить такое, не узнав зачем это нужно.

За одну секунду работы двигателя на холостом ходу с сигнального провода поступает 28 импульсов (14 оборотов двигателя в секунду * 60 = 840 оборотов в минуту) + лишние пульсации напряжения, из за которых пришлось усложнить обработку входящего сигнала. Выходит, обработчик должен обрабатывать до 200 импульсов в секунду, и это всего лишь тахометр!

И если с этим более менее закончено, то сейчас приступаю к анализу питания форсунок, а с ними еще сложнее. Впереди еще датчики АБС. При опросе датчиков даже с переодичностью в 10 мс уже ничего не получится. 

uni
uni аватар
Offline
Зарегистрирован: 24.09.2015

Многопоточность сделать можно, но это сложно. Лучше сначала всё-таки попробовать конечные автоматы оптимизировать.

Logik
Offline
Зарегистрирован: 05.08.2014

Опросы датчиков засунуть в прерывания по таймеру. Про многопоточность - проще исходить из её невозможности, хоть это не совсем так. Не знаю что там за экран, но вероятно перерисовываете его целиком, что плохо.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

acces969 пишет:

Почему же дебильная? Глупо говорить такое, не узнав зачем это нужно.

За одну секунду работы двигателя на холостом ходу с сигнального провода поступает 28 импульсов (14 оборотов двигателя в секунду * 60 = 840 оборотов в минуту) + лишние пульсации напряжения, из за которых пришлось усложнить обработку входящего сигнала. Выходит, обработчик должен обрабатывать до 200 импульсов в секунду, и это всего лишь тахометр!

И если с этим более менее закончено, то сейчас приступаю к анализу питания форсунок, а с ними еще сложнее. Впереди еще датчики АБС. При опросе датчиков даже с переодичностью в 10 мс уже ничего не получится. 

У Вас неверная логика работы.

Для тахометра не нужно обрабатывать все 200 импульсов в секунду - вполне достаточно замерить расстояние между фронтами двух соседних импульсов. Т.е. цикл измерения длится всего 5 мс.

Ну и вопросы Вы тоже неверно задаете. 

В Вашей задаче важно то, что цель измерения результатов совсем не отображение из на экране. Вы об этом не упомянули, а это принципиально важно: без этого уточнения Ваша задача неразрешима (по крайней мере, на используемом Вами "железе").

erav
Offline
Зарегистрирован: 28.12.2016

Я подобное организовал на 2 ардуинах. 1 отрабатывает логику, вторая выводит картинку на экран. соеденил их через RX-TX

acces969
Offline
Зарегистрирован: 22.01.2017

Интересный способ. Спасибо за информацию

AlexeySh
Offline
Зарегистрирован: 16.01.2017

acces969 пишет:

Почему же дебильная? Глупо говорить такое, не узнав зачем это нужно.

За одну секунду работы двигателя на холостом ходу с сигнального провода поступает 28 импульсов (14 оборотов двигателя в секунду * 60 = 840 оборотов в минуту) + лишние пульсации напряжения, из за которых пришлось усложнить обработку входящего сигнала. Выходит, обработчик должен обрабатывать до 200 импульсов в секунду, и это всего лишь тахометр!

И если с этим более менее закончено, то сейчас приступаю к анализу питания форсунок, а с ними еще сложнее. Впереди еще датчики АБС. При опросе датчиков даже с переодичностью в 10 мс уже ничего не получится. 

Элементарно. Настраиваете внешнее прерывание по импульсу тахометра, цепляете к нему счетчик, считаете число импульсов например за 0,5 сек, умножаете на 2, выводите на дисплей, считаете за следующие 0,5 сек, умножаете на 2, выводите на дисплей. А пульсации напряжения сглаживаете внешней цепочкой.

А если импульсов мало, то правильнее будет считать по 0,5 сек, а выводить число отсчетов за последнее 0,5 сек + предыдущие 0,5 сек.

Можно конечно и длину интервалов считать, но учитывая что у вас пульсации напряжения имеют место быть, показания будут сильно прыгать. Придется ещё цифровой фильтр для сглаживания показаний приделывать. Что существенно усложнит вашу программу.

acces969
Offline
Зарегистрирован: 22.01.2017

перепробовав несколько вариантов, остановился на самом "устойчивом" и точном. Засекаю время, за которое происходит 20 импульсов (10 оборотов двигателя). Единственное не комильфо - обновление данных тем чаще, чем быстрее крутится двигатель. Если он вовсе остановится, система "зависнет", поэтому поставил ограничение на таймер. По поводу пульсаций - сигналы беру не с катушки зажигания, где можно "поймать" все, хоть ближайшую радиостанцию, а с блока управления двигателем. Но даже тут не все чисто оказалось... Увидел лишь визуально на импровизированном осцилографе: 

Белые полоски - шаг в 10 мс,
Зеленые шпалы - питание есть, черные - питания нет (тут и происходит искра в свече зажигания),
В нижней части дисплея частые прерывания - переключил режим с 10 мс на 100, в общем не обращайте внимания.

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

acces969
Offline
Зарегистрирован: 22.01.2017

В общем с тахометром легко. Тема создавалась из за другой проблемы - как считать накапливаемые данные. А именно с датчиков АБС, т.е. показателей движения автомобиля. Необходимо не только показать с их помощью текущую скорость автомобиля, но и сохранять накопленный километраж, сколько проехал автомобиль. Как это реализовать при редком опросе датчиков, пока не придумал.