Простой осциллограф за 1 день

в 22:00, , рубрики: ATmega168, diy или сделай сам, осциллограф, Программинг микроконтроллеров, Электроника для начинающих, метки: ,

Здрасьте!
Ну нет у меня денег на нормальный осциллограф(и на нормальную камеру). Так что сильно не деритесь.
Но было 500 рублей на экран и простой 8-битный микроконтроллер.

Небольшое описание под катом.

Началось все с того, что на руках у меня появился графический LCD экранчик WG12864B фирмы WINSTAR. 128x64 пикселя, монохромный. Никогда с ними не работал, было интересно в нем разобраться (люблю копаться в даташитах, особенно, по Cortex M4 контроллерам в 1400 страниц).

Управление оказалось очень простым, мне показалось проще, чем управление символьными LCD экранами. Основная первоначальная сложность возникла лишь в том что экран поделен на 2 независимые части 64x64, каждая из которых управляется собственным контроллером. Об управлении писать не буду, в интернете тьма статей разных и библиотек.

Дак вот. Вывел я картинку, порадовался, показал маме. Что же делать дальше, с экраном вроде разобрался, дальше картинки рисовать уже скучно. Решил сделать осциллограф, потому что у меня его нету, и, наверное, еще долго не будет. И тут сразу вспомнилась одна функция этого экрана «Стартовая линия дисплея». Она служит, так сказать, смещением памяти. Если записать в память пиксель в точке (0,0) и сделать стартовую линию, например 5, то точка будет видна на экране на 5 линии горизонтально. Мне показалось это решением проблемы сдвига изображения вместо его перерисовки.

Решил что одну половину экрана я буду сдвигать вместе с изображением сигнала, а на второй будет показываться различная информация: напряжение и все такое.
Логика проста. Стираем строчку(старую точку которая хочет вылезти справа при сдвиге более 64 точек), строим точку, эквивалентную напряжению, сдвигаем на 1 пиксель влево изображение. Эффект соединенных точек сначала думал сделать через алгоритм Брезенхема, но потом подумал, что сдвигаем ведь всего на 1 пиксель и линии будут вертикальные.

Амплитудное значение определяется по формуле:
amp=63-(8-битное значение из АЦП) сдвинутое на 2 разряда вправо;

Сделал все это в бесконечном цикле, запустил, и… ничего не увидел. добавил задержку 100мс и получил то изображение, которое видно в видео. При уменьшении задержки изображение становится слаборазличимым. Тут я взгрустнул, так как сигналы частотой выше 10 Гц становятся совсем неразличимы. Это все из за метода сдвига экрана. Если стирать экран и записывать информацию блоками, а не пикселями, как это делал я, качество изображения значительно улучшится и ускорится отрисовка. Но делать это было, честно, неохота, особенно в сессию. И я оставил все как есть.

На нижней части экрана я нарисовал шкалу времени, подписал отрезок. Шкалу напряжения пришлось делать на нижнем экране, так как на сдвигающемся экране сложновато сделать несдвигающуюся шкалу, тем более, чтобы её было нормально видно.

Вот картинка, чтоб удобней было ориентироваться:
image

На текущий момент имеем 3 Вольта. Кому интересно, синус делал на ЦАПе МК Cortex M4 с периодом чуть больше 3 секунд. На экране видно, что пару значений не досчитал на пике.

Воот. А место-то еще осталось и добавил я еще пару аналоговых каналов. Работают они на прерываниях и чуть пошустрей аналогового, так как немного по другому принципу: отобразили сигнал слева-направо, стерли, отобразили снова. Тут уж можно просмотреть цифровой сигнал с частотой меньше 50 Герц. Например, проверить работоспособность какого-нибудь медленного интерфейса. Очень медленного:)

В общем все рассказал. Предложения и отзывы в комментариях. Только не разводите балаган, лучше купите мне осциллограф)
Счастья всем.

Автор: allswell

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js