Осцилоскопът показва как електрическите сигнали се променят във времето. Това е важен инструмент за електронно проектиране и експерименти, които включват сензори или изпълнителни механизми.
Високотехнологичните осцилоскопи, които измерват милиарди проби в секунда (Gs / s) или повече, могат да струват хиляди евро, но могат да се намерят осцилоскопи с по-ниски скорости за много по-малко.
Популярният микроконтролер Arduino (Uno R3) разполага с вграден аналогово-цифров преобразувател (ADC) за анализиране на аналогови електрически сигнали и по този начин може да се използва като елементарен осцилоскоп, когато е свързан с компютър за показване на следи. Всъщност можете да намерите няколко примера за тези, които се намират тук за инструктажи. Не успях обаче да открия такъв, който да не изисква допълнителен хардуер, мостри при максималната скорост на Arduino ADC (77ks / s) и работи както на Windows, Mac и Linux.
Осцилоскопът Arduino, описан в тези инструкции, има следните акценти:
- Без допълнителен хардуер, който да е свързан с Arduino към компютър
- Примерна честота до 77ks / s
- До шест входни канала
- 10-битова точност
- Два вертикални обхвата (0-5V или 0-1.1V)
- Задейства се на повдигащ се или падащ ръб
- Свободен ход или работа с един изстрел
- Вграден импулсен генератор
- Показване на екрана на компютъра с помощта на скица с отворен код
Въпреки че скоростта на вземане на проби е скромна, нейните приложения са много, за да назовем няколко:
- Отстраняване на грешки в електронните схеми с аудио-честотни сигнали
- Проучване на сигнални филтри
- Тестване на трансформатори, индуктори и високоговорители
- Тестване и характеризиране на сензори
- Изпитване и характеризиране на двигатели и други задвижващи механизми
- образование
градина:
Стъпка 1: Настройка
- Изтеглете и инсталирайте интегрираната среда за разработка на Arduino (IDE). Използвах версия 1.6.12.
- Изтеглете и инсталирайте IDE за обработка. Използвах версия 3.3.
- Свържете Arduino към компютъра с USB кабел
- Изтеглете скицата Arduino ArduinoOscilloscope_v1_0.ino и го качете в Arduino (предупреждението за ниска памет може да бъде игнорирано)
- Изтеглете скицата за обработка ArduinoOscilloscope_v1_0.pde и я стартирайте
- Свържете щифта D9 към A0 на Arduino
Последната стъпка изпраща сигнал от генератора на импулси към първия входен канал. Вече трябва да виждате на екрана на компютъра прозорец, показващ 1kHz сигнал, подобен на горната. Сигналът няма да бъде стабилен, тъй като скоростта на отчитане по принцип не съответства на цяло число на импулсите. Направете един изстрел или активирайте спусъка (следващата стъпка), за да стабилизирате следата.
Стъпка 2: Инструкции за употреба
Основният екран със следи е разделен на подразделения (div), които след това се разделят на подразделение с по-тънки линии. Времевата скала (ms / div) и скалата на напрежението (V / div) се отнасят за „пълните“ деления. Подразделенията са предназначени да подобрят точността на отчитане на времето и напрежението от основния екран.
Чрез кликване върху различни части на екрана настройките могат да се променят:
По подразбиране дисплеят непрекъснато актуализира сигнала. Ако вместо това искате да замразите сигнала, кликнете върху „изстрел“ и той ще направи едно почистване, което след това може да бъде изследвано тихо. За да предприемете още едно почистване, отново кликнете върху „изстрел“. За да се върнете към свободното пускане, кликнете върху „Пусни“
Активните входни канали са маркирани в сиво. Кликнете върху цифрите 0-5, за да изберете или откажете допълнителни канали. Каналите 0-5 поемат съответно входа си от пина Arduino A0-A5. Внимавайте Arduino вътрешно да има само един ADC, така че ако изберете повече от един канал, той завърта измерванията между различните канали, като по този начин намалява действителната честота на семплиране на всеки канал. Имайте предвид, че при скорост на предаване, 1ms / s, Arduino ADC не може да превключва достатъчно бързо между каналите, а многоканалното отчитане дава изкривени сигнали в случай, че сигналите се различават силно. Върнете се обратно към едноканална или по-бавна скорост на отчитане.
До номера на канала са два символа, съответно за нарастващ ръб и падащ ръб. Кликнете върху някой от тях, за да активирате задействането на ръба. Това ще стабилизира сигнала, тъй като фиксира еталонното време до точката, където сигналът преминава или над (нарастващ ръб) или под (падащ ръб) определен праг. Прагът се показва с малката стрелка в лявата част на екрана. Можете да го настроите по-високо или по-ниско, като кликнете върху (не плъзгате!) На друга височина над или под стрелката. Малката стрелка в горната част на екрана е отклонението на спусъка. Всичко вляво от стрелката се е случило преди спусъка, всичко вдясно от стрелката се е случило след спусъка. Отместването на спусъка също може да бъде променено чрез щракване (не плъзгане!) Наляво или надясно на стрелката. За да се върнете към пускане без пускане, щракнете върху символа на тригера (нарастващ или падащ), който е маркиран в сиво. Той отново ще стане черен и спусъка ще се изключи.
Най-бързото възможно разчитане на 77ks / s се избира чрез избор на 1ms / div. За да видите по-бавни сигнали за по-дълги времеви интервали, може да се избере по-голяма стойност на ms / div. Това ще забави скоростта на вземане на проби до 35.5ks / s за 2ms / div, 15.5 ks / s за 5ms / div и т.н. За най-бавните настройки, честотата на обновяване на екрана ще намалее, просто защото отнема повече от 1, 5s, за да направи пълен почистване на 100ms / div. (отново: имайте предвид, че скоростта при гладуване, 1ms / s, Arduino ADC не може да превключва достатъчно бързо между каналите, а многоканалното отчитане дава изкривени сигнали в случай, че сигналите се различават силно. по-бавни скорости на отчитане.)
По подразбиране броят на пробите е 1200. Това е близо до максимума, който Arduino може да съхрани в своята 2kB RAM памет. Този номер може да бъде намален до 600 или 300, за да увеличите много бързи сигнали или да увеличите честотата на опресняване на дисплея.
Arduino има две препратки към напрежението, които могат да се използват без допълнителен хардуер: 5V USB захранване или вътрешно 1.1V референтно напрежение. По подразбиране, пълната скала се отнася до 5V (разделена на 5 дивизии по 1V всяка), но за да увеличите по-малки сигнали, кликнете върху 0.2V, което ще намали пълната скала до 1.1V.
Arduino има вградени хардуерни таймери, които могат да се използват за генериране на сигнали. Тук се използва изход А на таймер 1, който дава импулсни сигнали на пин D9. Този сигнал може да се подава директно на всеки от аналоговите входове, за да се тества осцилоскопа, или да се използва за активиране на други компоненти (например RC филтър), чийто изход може да бъде изследван на всеки от другите аналогови входове. Барът на пулсора има четири реда. Горните два реда са за избор на период / честота и долните два реда, за да се избере дължината на импулса / работния цикъл.
Стъпка 3: Технически бележки за изпълнението
Тук споменавам някои от съображенията за техническото изпълнение. Чувствайте се свободни да преминете към следващите раздели с примерни измервания.
ADC, вграден в ATMEGA328 микроконтролера на Arduino, е от последователен тип приближение и се нуждае от 13 ADC-часовника, за да завърши измерването. 16MHz Arduino часовникът е прекалено бърз, за да може ADC да работи правилно, затова трябва да бъде прекален. Могат да се изберат коефициенти на предварителна настройка от 1 (без предварителна настройка) до 128. По подразбиране, Arduino IDE задава prescale на 128, което води до ADC-часовник период от 128 / 16MHz = 8 микросекунди, и по този начин период на семплиране от 13 * 8 = 104 микросекунди. Много тестове показват, че намаляването на прецизността до 16 води до лека загуба на прецизност, докато дори по-бързите часовници водят до боклук. Затова най-бързото възможно измерване, при 1ms / div настройка, съответства на ADC prescale от 16, ADC-часовник на 1MHz, време за вземане на проби от 13 микросекунди и скорост на вземане на проби от 1/13 микросекунди = 76.92ks / s. При настройките 2, 5 и 10ms / div prescale се увеличава до 32,64 и 128 съответно. Така пълната 10-битова прецизност се очаква да бъде постигната за времеви скали от 10ms / div и повече. Но дори и при 1ms / div следите изглеждат добре с малко видим шум.
Arduino ADC може да работи в режим на единично или свободно движение. Стандартната функция analogRead () прави еднократно придобиване и връща стойността, когато ADC е готов. Дори и с по-бърз ADC часовник, това никога не може да доведе до най-високата възможна честота на дискретизация, тъй като е необходимо известно време за обработка между измерванията. Също така е възможно да стартирате ADC, да направите някаква обработка, изчакайте ADC да бъде готов и след това започнете ново измерване. Въпреки това, този подход ще доведе до минимум 14 цикъла ADC-часовник за измерване. Тук се използва режимът на свободно движение, който е най-бърз. Предизвикателството е да се синхронизира измерването на ADC със съхранението и обработката (например задействане, мултиплексиране).Възможно е да се използват прекъсвания, когато измерването на ADC е готово, но прекъсванията имат малко натоварване на процесора и могат да бъдат трудни за програмиране. Вместо това, възможно е също да се използва линия и анкета за ADIF флаг, който показва, че четенето на ADC е завършено, дори ако не са извикани прекъсвания.
Циркулярният буфер позволява да се визуализират сигнали преди спусъка, което е изключително полезна функция. Пробите се съхраняват непрекъснато и когато се задейства спусъкът продължава по-малко от пълен цикъл. Ограниченият RAM на Arduino е друг проблем. 1200 проби от 8-битови показания заемат 1200 байта. За да получите 10-битова прецизност, не можем да съхраним 2-те допълнителни бита във всеки байт, тъй като това изисква 2400 байта. Вместо това, 2-те най-малко значими битове (LSBs) от 4 измервания могат да бъдат опаковани в байт, което води до общо 1500 байта, което оставя 548 байта за локални и глобални променливи. Известно внимание се отделя на използването на операции с ниско ниво на бърза смяна на битовете, за да се опаковат LSB. При изпращане на компютъра битовете се пренареждат в 6 + 6, за да се избегне номер 255, който се използва за указване на нова проба.
Процесорното време между измерванията на ADC е много ограничено: 13x16 = 208 са налични часовникови цикли за съхраняване на сигнала в кръгов буфер, превключване между сигнали и проверка за спусъка. Въпреки това изглежда, че е изпълним, като се обръща внимание на следното:
- Деактивиране на прекъсванията. По подразбиране timer0 генерира прекъсване на всеки ms за обновяване на стойностите, използвани в millis () и micros (). Те отнемат твърде много време и водят до пропуснати проби.
- Използвайте най-малките възможни типове данни („байт“ за произволен номер в диапазона 0-255)
- Когато е възможно, използвайте локални променливи: те могат да се съхраняват в бързи регистри
- Избягвайте разделения и оператор по модул. За кръгъл брояч е много по-бързо да се нулира броячът, когато се достигне върха.
- Поръчайте if-изявления по такъв начин, че първо да се тества най-малко вероятното състояние.
Осцилоскопът дава възможност за избор на произволен канал, а ADC мултиплексорът трябва да превключва след всяко измерване. За да се ускори това, се използва справочна таблица от 6 записа, които съдържат следващия канал. Тази таблица може да бъде генерирана извън измервателния кръг. Информационният лист ATMEGA328P споменава „Потребителят е посъветван да не пише нови стойности за избор на канал или референция по време на режим на свободно движение“. Единственият въпрос, който съм виждал е най-високата скорост на вземане на проби, когато мултиплексирането между сигналите, които се различават силно по нивото на напрежението, изглеждат привлечени един към друг, сякаш има последовател, който не може да се справи с бързите промени на ADC. вход.
Няма много време за обработване на сигнала, за да се провери за задействане, но е възможен прост спусък на ръба: новото измерване се сравнява с предишното, а ако е над спусъка, а другото по-долу, може да се задейства спусък. , Вземането на проби ще продължи с общия брой проби минус отместването на тригера, така че проби от преди спусъка не се презаписват и могат да бъдат показани.
Трите вградени хардуерни таймера са чудесни за генериране на импулси, така че същото Arduino може да се използва и като импулсен генератор. Няма никакви разходи за процесора, тъй като таймерите работят паралелно на процесора и активирането им може да бъде направено просто чрез задаване на таймерните регистри извън измервателния кръг. Timer1 е най-мощният таймер: има 16-битова прецизност и има режим на работа, известен като "Фаза и Честотен коректен PWM режим", който позволява да се настрои независимо честотата и работния цикъл.
Комуникацията преминава през серийната връзка, използвайки възможно най-високата скорост на предаване (115200 b / s). Той е настроен така, че Arduino ще генерира само почистване, когато бъде инструктирано да го направи от компютъра. Няма официално договаряне и начинът, по който комуникацията е установена в момента, може да не е 100% стабилна: например, номерът 255 се използва за указване на началото на набор от команди, но номер 255 може да се появи и като част от команда. Строгата проверка на 30-байтовата команда изглежда премахва повечето от корумпираните команди.
Стъпка 4: Пример 1: 50Hz Pickup
Електрическите кабели, които захранват нашите домакински уреди, създават електрически и магнитни полета, които лесно се улавят с антена. За аналоговия вход на Arduino с висок импеданс, един кратък проводник ще покаже този сигнал лесно.
Прикрепете проводник от ~ 10см към входа на А0 и оставете края да плува във въздуха. На осцилоскопа намалете прага на задействане до ~ 1V, изберете възходящия тригер и времева скала от 10ms / div. Може да видите нещо подобно на снимката, но точната картина ще зависи в голяма степен от наличието на провеждащи органи наблизо и от това как са заземени.
Забележете как сигналът е асиметричен. Тъй като свързването е капацитивно, то е чисто променлив ток (AC), поради което е толкова често отрицателно, колкото и положително. Тук виждаме ограничение на този Arduino осцилоскоп: той може да измерва само сигнали, положителни по отношение на земята. Отрицателните сигнали просто се отрязват на нула. Отбележете също, че разстоянието между пиковете е точно 20ms, което показва, че нетната честота е 50 Hz и че времевият мащаб на осцилоскопа Arduino е точен.
Стъпка 5: Пример 2: Капацитивно свързване
Капацитетното свързване от мрежата важи и за сигнали, които генерираме. Две кабели, които се движат близо един до друг, ще влияят един на друг, дори ако няма пряк електрически контакт, точно както ако има малък капацитет между двете. Ефектът е най-силен при високи честоти, но може да бъде демонстриран и при честотата на пулса по подразбиране от 1kHz.
Прикрепете проводник от ~ 10 cm към импулсния изход на пин D9 и друг ~ 10cm проводник към входа на A0. Вземете жиците наистина близо един до друг, например като ги завъртите заедно. Настройте осцилоскопа на времева рамка от 2ms / div. Трябва да получите изображение, подобно на изображението на снимката. В допълнение към 50Hz чиста пикап, сега е ясно видим 1kHz квадратна вълна от пин D9.
Стъпка 6: Пример 3: Нискочестотен RC филтър
Резистор-кондензатор (RC) филтри са за най-простите сигнални филтри, които може да се приложи. В зависимост от конфигурацията, те могат да прехвърлят или ниските честоти (low-pass) или високите честоти (high-pass). По-сложните конфигурации могат да филтрират както високите, така и ниските честоти (лентов филтър). Основният параметър на RC филтър е времето на характеристиките, което може да се изчисли като произведение на стойността на резистора в Ом с кондензаторната стойност в Фарад. В този пример се използва резистор от 100kOhm и кондензатор от 10nF, съответстващ на характерно време на tau = RC = 10 ^ 5Ohm x 10 ^ -8F = 10 ^ -3s, или 1 ms. използване на 10kOhm резистор с 0.1muF кондензатор ще даде същите резултати.
За такива настройки, които изискват допълнителни компоненти, наистина е удобно да се използва прототип на Arduino: поставяте го на върха и върху мини-борда можете да поставите компонентите, да ги свържете помежду си и с Arduino щифтове. Но и свързването му с обикновен макет ще се оправи.
Свържете резистора и кондензатора последователно между пулса на D9 и земята. Свържете вход A0 директно към пулсера и A1 към връзката между резистора и кондензатора, както е показано на картинката и в показаните схеми.
Първо вижте отговора на този филтър за сигнали с честота под честотата tau = RC = 1ms. Затова изберете пулсера, който да изстрелва с период 20ms и покажете и двете следи 0 и 1, задействайки се по нарастващия ръб на A0. Задайте времевата скала на 5ms / div. Червената крива показва изхода на филтъра и показва как следват входовете с известно закъснение: след всяка стъпка отнема няколко ms, за да достигне нивото на входа.
Нискочестотен RC филтър може също да се използва за трансформиране на модулиран сигнал в постоянно напрежение. Другият скрийншот на следите от осцилоскоп показва отговора на честотата на пулса на 2kHz и 20% работен цикъл. Изходът на филтъра е центриран около 1.0V (20% от 5V) с пулсации с циркуляр на зъба около 0.2V.