Официальный сайт компании Arduino по адресу arduino.cc
VirtOs - Самый простой двухлучевой осциллограф осциллограф на Arduino
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Чт, 01/09/2016 - 10:56
Пример того, как иногда бывает полезно не слушать мнение других.
Все началось с того, что я решил попробовать программировать Ардуинки. Начал с GSM модуля и выяснил, что у меня нет такой важной вещи в быту, как осциллограф. Первым делом пошерстил по сети и нашел «Мини осциллограф Arduino на LCD 5110». Экрана у меня не было и решил создать свой проект «Выжимаем максимум. USB осциллограф на Arduino». Вроде все получилось, но апетиты росли. - Надо внешний АЦП.
Тут стал вопрос. Городить свой колхоз, или спаять уже готовую схему из сети и не парится. Принято решение делать что то самому, но при этом начать с нуля, никого не слушать и не подсматривать как делают другие. Вот у меня родилась схема входного тракта с плавным масштабированием диапазона и автоматической подстройкой нуля. Схему развел на макетке, вроде все работает, но удовлетворение не приходит.
По своему незнанию, что так делать нельзя и никто так не делает, я решил испробовать входной тракт с виртуальной землей.
Задумка такова:
Зачем делать смещение сигнала и потом ловить ноль, если можно сместить щупов землю на необходимое напряжение. То есть земля щупа подключается не к общей земле прибора, а к виртуальной земле, которая поддерживается ОУ.
Что мне это дало:
Плюсы:
1. Из входного тракта пропал один ОУ, который отвечает за смещение сигнала.
2. Опорное напряжение теперь можно плавно изменять в диапазоне 100%-300%, у меня пока только 100%-200%
3. Можно сделать второй луч абсолютно симметричным первому. Смещение будет общим.
4. Общее опорное напряжение для обоих АЦП (внешнего и внутреннего).
5. Смещение можно плавно регулировать. Землю можно притянуть к низу шкалы, таким образом смотреть только положительный сигнал, или к верху, тогда можно смотреть только отрицательное плече. Также его можно плавно смещать на необходимое значение и смотреть не симметричный сигнал на всю шкалу.
6. Отсутствует генератор отрицательно напряжения.
7. Из за отсутствия отрицательного напряжения, нет возможности спалить АЦП при выходе за диапазон.
8. Ну конечно, как вы догадались, два луча.
Минусы:
1. Нет общей земли с прибором, потому работа только от аккумулятора.
2. Максимальная чувствительность прибора 0,016В на пиксель, при шкале 0В-4В.
Вот упрощенная схема входного тракта:
Необходимый уровень смещения земли поддерживается ОУ U1. Опорное запитано с внешнего АЦП. Тут вроде все работает, но аппетиты росли и хотелось чего то большего. Решил изменять опорное 2В переменником, а также изменять смещения земмли.
Тут меня ждал нежданчик. Мощности опорного напряжения, после прохода через переменник 10к явно не хватало. Начинались проседания и взаимопроникновения каналов. Долго бился над проблемой. Добавлять еще один ОУ не хотелось.
В один вечер, при повторном изучении АЦП AD9280, меня осенило. Ведь в АЦП есть свой ОУ, обратная связь которого выведена наружу. Пошаманив несколько часов, получил работающий пример.
Тут надо немного объяснить. Как я понял, обратная связь тут не обычная. До какого то момента все идет по плану, но на грани притягивания REF SENSE к земле, срабатывает тригер в самом АЦП, вход обратной связи REF SENSE отключается и начинает работать как логический вход. Добавил резистор R2 и все стало на свои места. Уменьшая R2, можно добится опорного вплоть до напряжения питания.
Программная и аппаратная часть.
Долго думал какой дисплей выбирать. Решил испробовать черно-белый жидкокристаллический дисплей. Библиотеку похерал как Бог черепаху. Переделал под SPI, убрал чего не нужно, прибрал пару багов по переполнению переменных. Вроде заработало.
Дисплейчик примечателен тем, что он жутко инерционный, и потому отрисовка луча подобно как на ЕЛТ. На высоких частотах до 1мГц, можно даже увидеть сам сигнал. - Мне понравилось. Благо, на дисплее есть свой стабилизатор питания на 3,3В.
Управление энкодером. Тут нечего добавить.
Питание от китайских готовых преобразователей типа DC-DC Step UP.
Скетч. Тут все просто. АЦП тактируется от таймера Т1 частотой 8 000 000 Гц. Максимальный захват за четыре такта 4 000 000 выб/с. Немного повозился с синхронизацией. Второй канал захватывается на высоких частотах линейной функцией, на низких через таймер Т2. На высоких частотах отключаю все прерывания. От использования переменных типа float отказался сразу – нечего там пробразовывать. Подписывать пункты меню не стал. Их всего пять и можно запомнить.
Внимание!!!!
На схеме ошибка.
Должно быть так:
Посчитал смету прибора. Вышло намного больше, чем я думал.
Посчитал смету прибора. Вышло намного больше, чем я думал.
=))по стоимости равен китайскому дешевому ослику
Посчитал смету прибора. Вышло намного больше, чем я думал.
=))по стоимости равен китайскому дешевому ослику
DSO138
На первый взгляд стоит так-же, НО
--в нем нет DC-UP нужно докупить
--в нем нет AKB нужно докупить
--в нем нет зарядки нужно докупить
и он в 4 раза медленней и на один луч.
Вот добавил, как обещал, новые видео и фото.
ВИДЕО
Внешний вид и разборка.
Сигнал 100 кГц, 400 кГц , 666 кГц
Сигнал 1мГц, 2мГц.
Сигнал 100кГц и увеличение 1х1.
Низкие частоты и двухканальный режим.
Вот добавил, как обещал, новые видео и фото.
хороший результат!!!! походу нужно заказывать еще один дисплей)))
Спасибо, Xumuk.
Прибор и прошивка довольно сырые, но усложнять не хотелось. Кому надо, тот еще чего то добавит.
Для начинающего любителя больше и не надо. Потыкать и посмотреть сигнал - самое то. Прибор можно собрать на коленке и не сложен в наладке.
Поправил. Если надо ещё что-то редактировать, обращайтесь.
Классно получилось молодец!!!!!
Okmor не могли бы вы, на схеме, на переменных резистрах указать где какое напряжение должно бить при настройке? А то ацп не хочется спалить.
Классно получилось молодец!!!!!
Okmor не могли бы вы, на схеме, на переменных резистрах указать где какое напряжение должно бить при настройке? А то ацп не хочется спалить.
АЦП здесь нету возможности спалить. Здесь нет отрицательного напряжения. АЦП выдерживает на входе все, что меньше напряжения питания, а болшему негде взятся. Так, что ставте все в среднее положение, и вперед.
И еще вопросик. Я хочу попробовать подключить другой дисплей. Мне нужно освободить A0 перенести на A6 где искать в скетче.
Или как вообще убрать 2 канал покаместь. Что бы место в ардуине освободить. Вы уже знаете где что, а то я не хочу что не буть нужное удалить.
И еще вопросик. Я хочу попробовать подключить другой дисплей. Мне нужно освободить A0 перенести на A6 где искать в скетче.
Или как вообще убрать 2 канал покаместь. Что бы место в ардуине освободить. Вы уже знаете где что, а то я не хочу что не буть нужное удалить.
Если я правельно понял
void
setADCSRA ()
это второй канал.Да. setADCSRA () подготавливает АЦП к захвату. Измененя эту функцию, можно переназначить вход АЦП.
Зачем? Используйте А6 для дисплея.
Зачем? Используйте А6 для дисплея.
А6 и А7 это только аналоговый вход АЦП. Так разработчикам AVR захтелось добавить в TQFP и MLF корпус 2 ноги АЦП.
А0-----А5 можно настроить как аналоговые или цифровые порты ввода/вывода.
Кстати. Посмотрите как сделано у меня. Я ногу CS от дисплея тупо посадил на землю. Дисплей один и пусть всегда работает. Ногу RST подтянул к питанию через RC задержку. Не знаю почему, но сбрасывать надо с задержкой.
Итого, экономия двух ног.
Okmor Пологите пожалуйста у меня уже кипят мозги. Уберите с скетча все что касается второго канала и что лишнее на схеме. Выложите или скиньтена почту vetalst777(собака)gmail.com.
Залил сюда. Я не пробовал, но должно работать.
Там есть две функции с задержками. Задержки надо подобрать єкспериментально для точного отображения периода сигнала.
Спасибо.
Okmor не могли бы вы подсказать в какой версии программы компилировали свой скетч, а то у меня в Arduino 1.6.11 при компиляции выскакивает ошибка 'freeRam' was not declared in this scope. В чем может быть причина?
У меня 1.6.5.
Относительно freeRam.
Не знаю почему у вас эта функция не поддерживается, но ее можно без ущерба выбросить из скетча, а также все ее упоминания в нем. Функция используется для отладки, что бы видеть оставшуюся оперативную память.
Выбросить вот это и все, где ругается на ее использование.
Вот что происходит при компиляции скетча даже в 1.6.5. Выбрасывание этого куска не помогло. Компилирую в ардуино нано АТМега 328. Что еще может быть?
UpgaradeLibSPI.ino: In function 'void setup()':
UpgaradeLibSPI:70: error: 'freeRam' was not declared in this scope
'freeRam' was not declared in this scope
Почему-то скрин экрана загрузился, но не передался. Программа останавливается в
void setup() {
SPI.begin() ;
gicd.begin(12) ;
glcd.display(); delay(500); glcd.clear();
glcd.drawstringS(0, 0, "MEMORY= " + String(freeRam())) ;
На этой строке встает и пишет 'freeRam' was not declared in this scope
Уберите строку
glcd.drawstringS(0, 0, "MEMORY= " + String(freeRam())) ;
После того, как убрал эту строку появились следующие ошибки:
UpgaradeLibSPI.ino: In function 'void __vector_4()':
UpgaradeLibSPI.ino:181:18: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
UpgaradeLibSPI.ino:184:19: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
UpgaradeLibSPI.ino: In function 'void DravValue()':
UpgaradeLibSPI.ino:288:18: warning: unused variable 'kU' [-Wunused-variable]
D:\Моя папка\Arduino\Версии программы Ардуино\arduino-1.6.5-r5\libraries\ST7565\ST7565.cpp:29:77: fatal error: c:\Program Files\Arduino\hardware\arduino\avr\libraries\SPI\SPI.h: No such file or directory
#include <c:\Program Files\Arduino\hardware\arduino\avr\libraries\SPI\SPI.h>
^
compilation terminated.
Ошибка компиляции.
Уважаемый Okmor, не могли бы вы выложить портабельную версию ардуино, в которой компилировали с вашей библиотекой. Подозреваю, что дело только в этом, т.к. в разных версиях разные ошибки.
gun-58
В библиотеке ST7565 откройте файл ST7565.CPP программой блокнот Notepad++. найдите строчку #include <c:\Program Files\Arduino\hardware\arduino\avr\libraries\SPI\SPI.h> это путь к файлу SPI.h в библиотеке SPI. Вам нужно прописать #include < D:\Моя папка\Arduino\Версии программы Ардуино\arduino-1.6.5-r5\hardware\arduino\avr\libraries\SPI\SPI.h> и сохранить файл.
UpgaradeLibSPI.ino: In function 'void __vector_4()':
UpgaradeLibSPI.ino:181:18: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
UpgaradeLibSPI.ino:184:19: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
UpgaradeLibSPI.ino: In function 'void DravValue()':
UpgaradeLibSPI.ino:288:18: warning: unused variable 'kU' [-Wunused-variable]
D:\Моя папка\Arduino\Версии программы Ардуино\arduino-1.6.5-r5\libraries\ST7565\ST7565.cpp:29:77: fatal error: c:\Program Files\Arduino\hardware\arduino\avr\libraries\SPI\SPI.h: No such file or directory
#include <c:\Program Files\Arduino\hardware\arduino\avr\libraries\SPI\SPI.h>
^
compilation terminated.
Ошибка компиляции.
У вас arduino-1.6.5 лежит на диске D D:\Моя папка\Arduino\Версии программы Ардуино\arduino-1.6.5-r5 и в самой Arduino 1.6.5 есть библиотека SPI находиться в папках hardware\arduino\avr\libraries\SPI\SPI.h .Некоторые версии Arduino ID могут глючить из за названий папок на русском по пути к программе Arduino ID.
Arduino 1.6.11 у меня без проблем все компелирует. НО ЕЙ НЕ НРАВИТЬСЯ ДЛИННЫЙ ПУТЬ К СКЕТЧУ (папка в папке и так далие) когда есть папки с названиями написаных на русском языке, только цифры или англ. Я просто кидаю скетч в папке на рабочий стол и нет больше ни каких ошибок. А сначала тоже было куча ошибок, и я подумал что глючьная какая то новоя весия, и холел удалить ее нафиг.
Arduino 1.6.11 хочет чтобы Структура программы была написана по порядку. Сначала наши какие то функции ( int freeRam(void) ) и т.д, Потом void setup() и в конце скетча void loop(). Хотя у меня сейчас глотает все скетчи написанны как угодно, и процентов на 5 -7 уменьшает код по сравнению с 1.6.5 и 1.6.7.
VetalST спасибо за разъяснение. Нашел ошибку в библиотеке SPI. Сейчас компиляция проходит, только пишет, что недостаточно памяти и программа может работать не стабильно.
Okmor приветствую! Пытаюсь заказать детали для повторения вашего устройства. Подскажите пожалуйста, а зачем в перечне деталей нужен кварц?
И у меня к вам тоже вопрос. По мимо кварца ????? Собрал пытаюсь переделать на другой дисплей показывает но. Какие два из перемннных резистров 1 смещение земли, 2 Диапазон 1-2в, 3 подстройка измерителя опорного, вынесены на корпус прибора ???? И не большие проблемы с энкодором. У вас я так понял энкодер 24 такта на оборот, а у меня 20 такта на оборот. Поэтому показания перепрыгивают через один, и попадаю в нужное меню струдом. Как это исправить программно не пойму, перепробывал почьти все. Так что в списке деталей уточните какой энкодер.
Это список для сборки без ардуинки на голом камне. Иначе кварца не надо.
Подстройка измерителя опорного спрятана внутри.
Смещение земли и диапазон наружу.
Увас энкодер с двойным щелчком. Должно лечится:
static boolean n=0; if (n=!n){return;} // снять ремарку для энкодеров с двойным щелчком
Это не ошибка, а предупреждение, что может нехватить оперативной памяти. Для этого и включил функцию freeRam(void). Я ею проверял всюду ли хватает памяти.
Можно поинтересоватся под какой дисплей вы переделываете.
Можно поинтересоватся под какой дисплей вы переделываете.
могу предположить что под ls020
Я тоже присматривался к этим дисплеям, но им по схеме нужно питание 9В на подсветку. - Забросил. Лежат три штуки без дела.
Я тоже присматривался к этим дисплеям, но им по схеме нужно питание 9В на подсветку. - Забросил. Лежат три штуки без дела.
думаю step-up в корпус пихнуть не проблема, я щас плату делаю под корпус для этого дисплея и ардуино ослика, с прошивкой от VetalST
Энкодер почьти поборол но на большых частотах все равно успевает иногда впоймать второй щелчк. Нужно ставить номальный как у вас.
Экран да ls020. Но никак не могу побороть полностью мерцание, оно то и не мешает но неприятно. Спаял на плате разводил как умею я не спец. Микросхема МРС 6022 была под рукой, думал паять "хамелеон". Сегодня проверил в качестве генератора шим как в пультоскопе и в самодельном "Тестер полупроводников". Шим сигнал 100 кгц, 250 кгц идеольно 500 кгц надо подстроить переменным кондером на (5 рФ) нет под рукой впаял на 3 рФ. Хотя можно и микросхему поменять на AD823 может будет еще лутше.
Теперь о проблемах.
Не определяет частоту после 30 кгц где копать ????
Не могу разобратся полностью с сеткой и нормально с шкалалой. Библиотека под ls020 получается что начало координат Y 0 и X 0 снизу в левом углу, в верх Y 131 и в право X 175. Поэтому все через задницу. Как обычно 0 X 0 Y в верху с лева, X длинна а Y ширина высота экрана. Вот здесь я и запутался. Сегодня поишу как инвертировать экран, или изменю в библиотеке викину все лишнее и оставлю только пиксель линию и печать текста. Okmor может у вас есть нормалная библиотека под ls020. И не могли бы вы прокоментировать в скетче где что для екрана и желательно все остальное.
Не определяет частоту после 30 кгц где копать ????
Все заработало. Позаимствовал с вашей библиотеки функцию drawstringS и скрестил с своей библиотекой.
Теперь нужно разобратся с экраном. Нужно придумать как не закрашивать экран полностью, а затирать только сам график.
Я тоже присматривался к этим дисплеям, но им по схеме нужно питание 9В на подсветку. - Забросил. Лежат три штуки без дела.
Надо копировать буфер захвата, если память позволит.
Затирать график получилось. Теперь нужно разобратся с сеткой и немного помелочам. Попозже освобожусь еще помучаю контроллеры. А то я уже умудрился, залочить две самодельные ардуины, програмировал через usb бар все в зборе. Пришлось доктором мк востанавливать.
Затирать график получилось. Теперь нужно разобратся с сеткой и немного помелочам. Попозже освобожусь еще помучаю контроллеры. А то я уже умудрился, залочить две самодельные ардуины, програмировал через usb бар все в зборе. Пришлось доктором мк востанавливать.
Okmor Как расчитать сетку что бы была на весь экран ?????? Библиотека стандартная X0, Y0 в верху слева.
return constrain((((255 - Y)>>Scale)- BiasY-((127 >> Scale) - 95)) , 0 , 255) ; методом тыка опустил вниз и все. Сетка на пол экрана и дальше у меня уже мозги кипят.
return constrain((((255 - Y)>>Scale)- BiasY-((127 >> Scale) - 95)) , 0 , 255) ; методом тыка опустил вниз и все. Сетка на пол экрана и дальше у меня уже мозги кипят.
Функция ScalePint масштабирует изображение и зеркалирует ось Y.
Scale - делитель масштаба. при Scale = (0, 1, 2) масштаб делится на (/1, /2, /4) соответственно.
(255 - Y)>>Scale - переворачивает изображение и масштабирует его
BiasY - это возможность сдвигать график вверх/вниз при большом масштабе.
(127 >> Scale) - 31) - это поправка для того, чо бы график всегда был по центру, а не масштабировался от нулевой точки. Для вас будет (127 >> Scale) - 62)
При высоте дисплея 132 точки, у вас будет только две градации маштаба Scale = (0, 1)
поправте здесь:
Я могу ошибатся, тотому, что сам чуть голову не сломал избегая делений и типа float.
Вот убогое видео https://youtu.be/DLu7stRZ8K8 того что получилось
Это видео https://www.youtube.com/watch?v=5UyFiLwjZNM проблеммы с разверткой и синхронезацией. Как это можно исправить. И как она вообще работает и как ее перещитать.
Вот видео https://youtu.be/gyQD55e4lJU Без синхронезации чистый график на всеж режимах развертки.
Меняя в //" for (int i = 4; i <= 253 ; i++) // тут //// i = 6 ИЗМЕНЯЛ на 4"// меньше 4 появляются шумы в начале графика когда нет сигнала.
StartPoint = 4;// = 6 ИЗМЕНЯЛ на 4 и if ((i-StartPoint)>110 ) { break;}// 125 ИЗМЕНЯЛ на 110
Уменишились шумы. На меньшей развертке шумов нет вообще.
А развернуть еще шире шумы появляются до пол экрана
КАК ЭТО МОЖНО ИСПРАВИТЬ ???????
" Зачем делать смещение сигнала и потом ловить ноль, если можно сместить щупов землю на необходимое напряжение."
а у вас при этом между землей осцилографа и землей измеряемого сигнала разности напряжения не получится? ток не потечет?
В посте выше добавил видео без синхронезации чистый график на всеж режимах развертки.
Ток не потечет, если осциллограф питается от аккумулятора. Это цена которую придется платить за простоту.
Читайте мануал. Я до конца не понял, но преобразование происходит за четыре такта. Тоесть конвеером. Потому первые четыре измерения надо отбрасывать.
Это не шумы, а конец захваченого кадра. У нас отсутствует аппаратный тригер, потому мы тупо захватываем кадр и потом чмещаем на значение синхронизации. Побороть можно увеличив буфер. В осциллографе без экрана, тоесть USB, недостающую часть я дополнял предварительным кадром.
Осторожно подделка!!!
Заказал для пробы два ОУ AD823
На картинке усиление синуса коэфициент 1:1. Графики раздвинул для наглядности.