Всем здравствуйте! Сегодня у нас очень интересный материал от нашего товарища, коллеги и просто хорошего человека - Юрия Викторовича.
Самодельный осциллограф. Ниже будет весь текст от автора.
Конструкция выходного дня. Пробник «Ослик». Разрабатываем и собираем очередную шаробайку.
В последнее время увлекся я Ардуинами и вообще МК фирмы «Atmel» (теперь уже в составе бывшего конкурента «Microchip»). Но мигать лампочками и вертеть моторчиками, это детский сад.
Для начала решил разобраться с подключением дисплеев. С 1602 (их есть у меня) и так все ясно, да и возможности его так себе. Конечно, можно взять и заказать на любой вкус, но это долго и не спортивно. И тут натыкаюсь на библиотеку для работы с дисплеем от старого кнопочного телефона – Моторолы С350. Порылся в коробке с барахлом, а там аж два таких аппарата. Ну вот и отлично! А дальше Миша как раз статью про мелкий осциллограф написал, ну вот и появилась у меня идея – собрать осла! Даже не ради девайса, а так сказать потренировать мозги и руки. Пусть характеристики будут слабые, для основных ремонтов есть Хантек 5102. Зато этот умещается на ладони и дисплей прям на щупе. Будет полезен для ремонта различных балалаек: Сабов, китайских КАЛонок, автоусилков и даже телевизоров с пропавшим куда-то звуком. :) Ну, погнали!
Начало. Подключил дисплей к Ардуине, научился рисовать сетку и синусоиду. На самом деле довольно просто. Как говорится «глаза боятся, а руки делают». Только в данном случае, скорее не руки а мозги. В программизме я новичок.
Определился с внешним видом, разметкой, приделал показометры (тут пока ничего еще не показывают). Вместо «SCOPE» в дальнейшем будет быстрое меню. Vpk – пиковое напряжение, а вот Vrms (среднеквадратичное) я до сих пор не родил в коде, с математикой у меня туговато, по этому в последней версии это убрано. Может в будущем когда-нибудь допилю.
Версия 0.1 в железе. Навесной монтаж – наше все! Приклеил АТмегу и маленький аккумулятор к дисплею, на него плату зарядника, распаял проводки. Приклеил колодку для прошивки через ISP. Теперь надо приклеить кнопки и собирать входной делитель…
Но дальше случился Fail. :) При очередной прошивке от колодки отвалился GND и Мега залочилась! То есть во фьюзы (конфигурационные биты МК) прошилась лажа, и контроллер перестал видится через ISP программатор. Пришлось все распаивать, Мегу отклеивать и лечить на другой швейной машинке под названием TL866. Но это же не повод опустить руки, по этому…
Версия 1.0 в железе. Уже приклеены кнопки и делитель. Показометры еще показывают лажу – по программной причине недопила. :)
Сейчас меня закидают гнилыми помидорами, тухлыми яйцами, и горелыми микроконтроллерами, но делитель вот по такой схеме:
Сверху делитель. Снизу включалка-выключалка. По хорошему на вход надо ставить ОУ, но это надо колхозить двухполярный источник питания. А нам много не надо, по этому вот такая идиотская схема. :) Зато с такими номиналами девайс спокойно выдержит попадание щупом куда-нибудь в +30VDC. По идее и 220VAC должно выдержать, не проверял. :) Немного пояснений: осциллографу неплохо-бы видеть не только положительную составляющую, но и отрицательную. А Мега мерить в минус не умеет. По этому ноль у нас будет в середине между GND и VREF (опорное напряжение АЦП Меги). Соответственно ноль с АЦП будет равен минимальному отрицательному значению, 127 - нулю, а 255 – максимальному положительному. Из за всего этого, «минус» ослика не подключен к общему проводу схемы, а на нем устанавливается половина от VREF подстроечным резистором на 10КОм. Кнопка параллельно кондеру открывает-закрывает вход, для удобства расположил прямо на щупе. Диод с выхода D3 появился уже позже, это для простенького генератора. С включалко-выключалкой, думаю все ясно, при нажатии на кнопку открывается нижний полевик, дальше стартует проц, и программно выставляет на D1 низкий уровень. От чего открывается верхний полевик и держит питание , пока на D1 ноль. Для выключения просто выставляем на D1 высокий уровень. При таком раскладе элементарно реализуется крайне полезный для расп….ев вроде меня автрофф. :)
Приделал щуп. Корпус от авторучки, внутри кусок ВВГ 2.5, снаружи термоусадка. Клей «китайские сопли». Добавил индикатор батареи. Если засунуть одним концом в розетку, показывает кривой синус. :) Тут родилась идея добавить функционал индикаторной отвертки. Сказано – сделано!
AC finder, он же «индикаторная отвёртка» (ниже еще фото). К сожалению, в драйвере дисплея у знакогенератора нет русского языка, а сам я все буквы рисовать не осилю. Так что только басурманский.
Теперь немного отвлечемся, и рассмотрим как вообще работает цифровой осел.
Для начала нам нужно создать массив размером (в моем случае) в 80 байт – это длинна в точках рабочей области (развертка по X). В каждом элементе массива будет значение от 0 до 255 – это будет отклонение по Y. Не забываем, что ноль у нас 127, все, что меньше минус, а все, что больше - плюс. Но это все потом пересчитается, а пока нам нужно сделать сэмпл - заполнить массив данными полученными с АЦП. По началу я просто в цикле считывал значение ардуиновским analogRead. Это очень просто, но очень печально по скорости. Можно значительно ускорить это дело, просто переключив прескалер АЦП, но я решил покурить даташит и сделать по взрослому (на самам деле нефига, по взрослому – это на ассемблере!) и читать из АЦП в обработчике прерывания. Как это делается, рассказывать в рамках данной статьи смысла нет, все есть в сети, с примерами кода и т.д.
Ну и в комментах, если что, можно вопросы задавать, думаю Миша против не будет. :) - конечно я не против 😁👍
А вот для того, чтоб разные частоты видеть, надо наоборот вставлять задержку при заполнении массива. Изменяя время задержки получим аналог кручения-верчения ручки s/div (время\деление). Я даже сделал тут автомат как доп. опцию, об этом будет ниже. Итак массив заполнили, а дальше пересчитываем (чтоб в рабочую область попадало) и отрисовываем – выводим в цикле линии с координатами x, y1, x, y2 (получается вертикальные, «х» и начала и конца одинаковый), где y1 первое значение из массива (после пересчета, конечно), y2 – второе, далее увеличиваем х, теперь y1 – второе значение, y2 - уже третье и так далее до конца рабочей области. Для расчета частоты я сделал массив в четыре раза больше, для осциллографа используется только первая четвертинка. Но чтобы не пропадала зря драгоценная оперативка, попутно сделал функцию захвата импульсов «catcher». Активируется прям на ходу одной кнопкой. В этом режиме девайс ждет импульс (грубо говоря, триггер), после чего захватывает значения на 320 байт, заполняет весь массив, и потом выводит график на экран, и можно кнопками пролистать четыре страницы. Думаю, будет полезно для случаев «проверить жизнь на SPI флешке». Порог срабатывания триггера выставляется в настройках. Разрешение по времени тоже. Вернемся к частотомеру. Оказалось, что для подсчета частоты и этого буфера мало! Частотомер на низких частотах врал бессовестно. Сделал так - сначала просто пишем сэмпл и считаем, а если частота меньше 1КГц, снова пишем сэмпл уже с большей задержкой внутри цикла. Как подсчитывается? Проходим массив и ищем там «переход через ноль», точнее переход между значениями <127 и >127 (так как ноль у нас 127). Далее делим на коэффициент, который подобрал методом тыка (ох, и гемор это был). Для более точных показаний сделал усреднение значения каждые 10 проходов. Вот такой вот костыль. :) В итоге частоту кажет довольно точно, с транса обычного ровно 50 герц, с гены Хантека почти ровно килогерц. :) А когда нормально заработал частотомер, появилась идея сделать автоматическое переключение время\деление, что мы вручную крутим обычно на осциллографе под нужную частоту. Для этого задержка при захвате семпла расчитывается на основе данных частотомера. И это вполне сносно получилось, что довольно удобно. Разумеется, в настройках тоже отключается, если что.
Гена. Далее добавил простой генератор. Для ремонта китайских усилков пригодится, не мокрым пальцем-же «гудеть». :)
Из-за зверского делителя форма там далеко не прямоугольная получается, но и хрен с ним. Зато тоже выдержит попадание туда куда не надо. Частоту гены можно крутить кнопками с шагом 1 или 50.
Немного окультурил. Найди кот…Атмегу! :)
Решил сделать градусник. Да не простой, а чтоб график температуры строил. И опять сказано-сделано! Даже два. Один внешний цепляется, другой встроенный. Но брешут на пару градусов – по хорошему надо считать константы под терморезистор, а у меня с математикой туго, вот и взял из интернетов. На фотке я для наглядности погрел внешний датчик феном, вот красная линия вверх скаканула. Зеленая – встроенный датчик. Время между отсчетами можно менять, и шкалу тоже – или 0 - 50°С, или -20 - 120°С.
Ну и окончательный, на данный момент, вариант шарабайки : Версия 2.0.
Характеристики, конечно, игрушечные – кажет нормально примерно до 3-5Кгц, дальше прямоугольник превращается в пилу, спасибо зверскому делителю и тормознутости мега328 в сочетании с кривым кодом. :) Просто переменку до 20 КГц в принципе можно увидеть. Ну так я и не ожидал большего, тут чисто спортивный интерес.
Еще немного фоток девайса (на разных этапах постройки):
Листаем галерею.
Еще немного о питании. Vref для АЦП у меня сделан переключаемый. Просто чтобы чуйку программно менять. В Мега328 есть несколько вариантов источника опорного. Переключается в регистре ADCMUX. Я использовал два варианта: 1.1в внутренний источник, и 3.3в от напряжения питания МК. Так вот, при использовании второго, если питание от li-ion батареи, а стабилизатор в 3.3в поставить любимый 1117, то АЦП будет бессовестно врать! Так как падение у 1117 аж 1.25в. Я взял APL5708R, у которого падение 700мв. И даже в этом случае, особенно на верхних границах диапазона врет, когда аккум проваливается ниже 4в (что и следовало ожидать). Здесь пофигу, а в более-менее серьезном проекте это необходимо учитывать обязательно. А лучше сделать нормальный ИОН или хотя-бы использовать только внутренний на 1.1в.
По деталям и софту:
МК Atmega328P, прошивка писалась в Arduino-IDE, до AVR-студии пока не дорос. :)
Библиотека драйвера дисплея Motorola c350 отсюда: https://chipenable.ru/index.php/how-connection/11-podklyuchenie-lcd-ot-telefona-motorola-c350.html
Если кому придет в голову заниматься подобной ерундой – пишите, расскажу как адаптировать под ардуину и раскрою некоторые «подводные камни».
Сразу говорю: дисплей так себе, ибо CSTN. Лучше купить нормальный TFT от дяди Ляо. Уже заточенный под ардуину\мегу.
Также использована библиотека Алекса Гайвера «giver.timers». И вообще очень много информации получено с его сайта, за что ему огромное спасибо!
Затраты – 50р за зарядник tp4056, который, естественно был. Мега подгорелая из транзистор-тестера. Оказывается, при известном косяке выгорают только PORTC 2-3-4, остальное работает. Вот и пошла в дело. Все остальное найдено в закромах барахла. Батарейка, кажется, вообще от «электронного бычка».
Вот такая, не побоюсь этого слова, великолепная статья от нашего товарища Юрия Викторовича! И проделана реально серьёзная работа!
Честно говоря я бы так точно не смог. Ну или о-о-очень долго всё это делал, а потом и не доделав бросил бы в коробку , до лучших времён, а потом забыл 😁 ..........Хотя нет, не смог бы. В программировании я ноль без палочки 😁.
Юрию Викторовичу ОГРОМНОЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО!!!
А на этом пока всё чем хотел с вами поделиться.
Всем спасибо за внимание!
Если статья поможет вам в решении некоторых проблем, буду очень рад.
Остались вопросы или пожелания? Не стесняйтесь, пишите в комментариях, с удовольствием пообщаемся.
Ставьте лайк, ПОДПИСЫВАЙТЕСЬ на канал и вы всегда будете в курсе новых публикаций.
Приходите почаще будет много интересного, а также читайте и другие статьи нашей странички и смотрите видео.
Статьи носят ознакомительный характер и не являются руководством к действию.
Всем удачных ремонтов!