Посоветуйте! Как использовать LCD без задержек?
- Войдите на сайт для отправки комментариев
Добрый день, уважаемые!
Посоветуйте!
Кручу Мегой 6 шаговиков по dir, step, enable через драйверы с микрошагом 1/4.
Библиотека AccelStepper
http://www.airspayce.com/mikem/arduino/AccelStepper/classAccelStepper.ht...
У каждого шаговика своя задача. Но вот выявилась проблема. Как только пытаюсь 1 раз в секунду выдать данные на LCD http://amperka.ru/product/text-lcd-20x4, получаю затык в частоте импульсов. Такой сбой в частоте импульсов создает предпосылки для пропуска шагов... (инерция роторов 57 шаговиков велика). LCD подключал и по 4 и по 8, особой разницы не замечено...
Может кто посоветует "многозадачную" библиотеку LCD без delay-ных задержек?
Или подскажет, будут ли задержки в частоте импульсов при подключении LCD по I2C ?
Диапазон используемых скоростей от 200 импульсов в секунду до 3000... "Затык" чувствуется на любых скоростях.
Зарание спасибо за опытные советы.
mills, по моему тут главный виновник -сама библа степпера, она не использует таймеры, не использует прерывания.. ей все всегда будут мешать.
dimax,
Возможно, но у нее разгон и торможение есть. При других вычислениях и 8ми веточных кейсах, а так же опросах клавиатуры ничего не мешает. Работает как нужно. Просаживается частота импульсов при работе сразу 6 моторов, но плавно. Думаю, как раз delayная реализация в LCD библиотеке мешает.
В дальнейшем моторы планирую крутить на DUE, должно хватить частоты для максимальных скоростей и осутствия просадки, но подозреваю, что при обращении к lcd будет тот же "затык", т.к. снижение максимальной скорости решает проблему просадки частоты, но не убирает "затык" от LCD... :(
Могу предложить другой подход - прикрутить к LCD Ардуино Про Мини (вообще - не важно какую Ардуину) и пусть она занимается выводом данных на экран. Можно и конопки туда прикрутить. А Мега пусть занимается шаговиками.
Один из вариантов "многозадачности" это делать вывод по таймеру. Шаг таймера не меньше минимальной задержки при выводе на экран. Тогда можно для дисплея выделить место в памяти под строки и выводить постоянно (пример есть у Di Halt, но там ассемблер, обновление всего экрана, если не ошибаюсь несколько раз в секунду).
Т.о. когда надо что то отобразить, мы меняем буфер в памяти, а он уже своим ходом отобразится на экране в прерываниях таймера.
Разумеется это не даст 100% результат, всё равно степпер будет плавать, однако влияние будет меньше, потому что задержек не будет при выводе на экран, плюс постоянный вывод на экран - это вывод без задержек, т.е. в обработчике нужно взять указатель на буфер, считать значение, выдать в регистр дисплея, увеличить указатель и сохранить его до следующего раза. Ну и в конце буфера перекинуть его на начало.
В этой реализации нужно обратить особое внимание, если нужна очистка экрана или другие тягомотные функции, их нужно по возможности исключить, либо так же выполнять в обработчике таймера.
Кстати, задержки можно с помощью этого же таймера реализовать, т.е. если нужна задержка, то пропускаем столько обработчиков, на сколько нужна задержка.
UPD: Я ошибся, у Di Haltа тоже есть задержки. Надо будет провентилировать этот вопрос да написать свой такой вЕлик. Вроде должно всё получиться. Немного гемора есть, но не так уж и много. А всего то лишь конечный автомат немного подумать, немного помаять ардуину.
А вообще правильно говорят, если система критична к задержкам, нужно дисплей отдельным модулем делать, со своим МК.
http://arduino.ru/forum/programmirovanie/upravlenie-shagovym-dvigatelem
пост №7
Могу предложить другой подход - прикрутить к LCD Ардуино Про Мини (вообще - не важно какую Ардуину) и пусть она занимается выводом данных на экран. Можно и конопки туда прикрутить. А Мега пусть занимается шаговиками.
Один из вариантов "многозадачности" это делать вывод по таймеру...
...А вообще правильно говорят, если система критична к задержкам, нужно дисплей отдельным модулем делать, со своим МК.
Вот тоже подумал, что это будет проще и надежней всего :))
http://arduino.ru/forum/programmirovanie/upravlenie-shagovym-dvigatelem
пост №7
Тема в точку... Спасибо. Пробовали библу https://github.com/Void1509/lcdLib1602 от sva1509 ?
Попробую на досуге.
По сабжу выяснил, что частоте мешайт и реализация keypad 4х4 :)) getKey заметно сказывается. Поменял ее на простой digitalRead c антизвоном. Думаю на DUE не увидел бы. Вывод на LCD сделал в том месте где "незаметно". Благо нашлось такое место :)
Про скорость вывода на LCD по I2C надо бы проверить, но пока нету под рукой модуля к сожалению. Если кто знает, просветите.
Однако в рамках проекта все решил, Благодаря Вам уважаемые! Спасибо чистосердечное!