Съдържание:

Супер бързи аналогови напрежения от Arduino: 10 стъпки (със снимки)
Супер бързи аналогови напрежения от Arduino: 10 стъпки (със снимки)

Видео: Супер бързи аналогови напрежения от Arduino: 10 стъпки (със снимки)

Видео: Супер бързи аналогови напрежения от Arduino: 10 стъпки (със снимки)
Видео: PIC MICRO SERIAL STRING SEND VARIABLES VALUE directly readable in terminal program HOW TO 2024, Юли
Anonim
Image
Image

Тази инструкция показва как да се генерират супер бързи промени на аналоговото напрежение от Arduino и обикновена двойка резистори и кондензатори. Едно приложение, където това е полезно, е за генериране на графики на осцилоскоп. Има няколко други проекта, които са направили това. Johngineer показва проста коледна елха, използваща широтно -импулсна модулация (PWM). Други са подобрили този проект, като са използвали резисторна стълба или са използвали специален чип за цифрово-аналогов преобразувател.

Използването на ШИМ причинява много трептене, докато използването на резисторна стълба или цифрово-аналогов преобразувател изисква повече изходни щифтове и компоненти, които може да не са лесно достъпни. Схемата, която използвам, е същата проста двойка резистор и кондензатор, която се използва в демонстрацията на коледното дърво, но работи със значително по -малко трептене.

Първо ще ви преведа през процеса на изграждане на веригата. След това ще ви науча как да добавяте собствено изображение. Накрая ще представя теорията за това, което го прави по -бърз.

Ако ви е харесал този Instructable, моля, помислете за гласуване за него!:)

Стъпка 1: Изграждане на веригата

Изграждане на веригата
Изграждане на веригата

За да изградите веригата, ще ви трябва следното:

а) Arduino на базата на Atmel 16MHz ATmega328P, като например Arduino Uno или Arduino Nano.

б) Два резистора със стойност R, която е най -малко 150Ω.

в) Два кондензатора със стойност C, така че C = 0.0015 / R, примери:

  • R = 150Ω и C = 10µ
  • R = 1,5 kΩ и C = 1 μ
  • R = 15kΩ и C = 100nF
  • R = 150kΩ и C = 10nF

Причините за избора на тези стойности са две. На първо място, искаме да поддържаме тока на щифтовете на Arduino под максималния номинален ток от 40mA. Използването на стойност 150Ω ограничава тока до 30mA, когато се използва с захранващото напрежение на Arduino от 5V. По -големите стойности на R ще намалят тока и следователно са приемливи.

Второто ограничение е, че искаме да запазим времето постоянно, което е продукт на R и C, равно на около 1.5ms. Софтуерът е специално настроен за това постоянно време. Въпреки че е възможно да се регулират стойностите на R и C в софтуера, има тесен диапазон, около който той ще работи, така че изберете компоненти възможно най -близо до предложеното съотношение.

По -подробно обяснение защо RC константата е важна ще бъде дадено в раздела теория, след като ви показах как да сглобите демонстрационната верига.

Стъпка 2: Настройка на осцилоскопа

Настройка на осцилоскопа
Настройка на осцилоскопа

Демонстрацията изисква осцилоскоп, настроен на режим X/Y. Тестовите проводници трябва да бъдат свързани, както е показано на схемите. Вашият осцилоскоп ще се различава от моя, но ще премина през необходимите стъпки, за да настроя X/Y режим на моето устройство:

а) Настройте хоризонталното размахване да се управлява от канал В (оста X).

б) Настройте осцилоскопа на двуканален режим.

в) Настройте волта/div на двата канала, така че да може да показва напрежения от 0V до 5V. Настроих моята на 0.5V/дел.

d) Задайте режима на свързване на DC на двата канала.

д) Регулирайте позицията на X и Y така, че точката да е в долния ляв ъгъл на екрана, когато Arduino е изключен.

Стъпка 3: Изтеглете и стартирайте софтуера

Image
Image

Изтеглете софтуера от хранилището Fast Vector Display For Arduino. Софтуерът е лицензиран под GNU Affero Public License v3 и може свободно да се използва и променя съгласно условията на този лиценз.

Отворете файла „fast-vector-display-arduino.ino“в Arduino IDE и качете на вашия Arduino. За миг ще видите анимация „Честита Нова година“на екрана на осцилоскопа си.

Разработих този проект като личен хакатон в седмиците преди Коледа, така че има съобщение на тема Коледа и Нова година, което можете да видите, като промените променливата PATTERN в кода.

Стъпка 4: Създайте свой собствен персонализиран чертеж

Разберете защо PWM е толкова бавен
Разберете защо PWM е толкова бавен

Ако искате да създадете свой собствен чертеж, можете да поставите координатите на точките в скицата на Arduino на линията, която определя USER_PATTERN.

Открих, че Inkscape е доста добър инструмент за създаване на персонализирана рисунка:

  1. Създавайте текст, използвайки голям, удебелен шрифт, като Impact.
  2. Изберете текстовия обект и изберете "Object to Path" от менюто "Path".
  3. Изберете отделни букви и ги припокрийте, за да направите свързана форма
  4. Изберете "Union" от менюто "Path", за да ги комбинирате в една крива.
  5. Ако има дупки в букви, изрежете малка прореза, като нарисувате правоъгълник с инструмента за правоъгълник и го извадете от контура, като използвате инструмента "Разлика".
  6. Щракнете двукратно върху пътя, за да покажете възлите.
  7. Правоъгълник изберете всички възли и щракнете върху инструмента „Направете избраните възли в ъгъл“.
  8. Запазете SVG файла.

Важното е, че чертежът ви трябва да има един затворен път и без дупки. Уверете се, че вашият дизайн има по -малко от около 130 точки.

Стъпка 5: Поставете координатите от SVG файла в Arduino IDE

  1. Отворете SVG файла и копирайте координатите. Те ще бъдат вградени в елемента "path". Първата двойка координати може да бъде игнорирана; заменете ги с 0, 0.
  2. Поставете координатите в скицата на Arduino в скобите веднага след „#define USER_PATTERN“.
  3. Заменете всички интервали със запетаи, в противен случай ще получите грешка при компилиране. Инструментът „Замяна и намиране“може да бъде полезен.
  4. Компилирайте и стартирайте!
  5. Ако имате проблеми, гледайте серийната конзола за грешки. По -специално, ще видите съобщения, ако вашият модел има твърде много точки за вътрешния буфер. В такива случаи изображението ще проявява прекомерно трептене.

Стъпка 6: Разберете защо ШИМ е толкова бавен

За да започнем, нека прегледаме поведението на кондензатора, докато се зарежда.

Кондензатор, който е свързан към източник на напрежение Vcc, ще увеличи напрежението си според експоненциална крива. Тази крива е асимптотична, което означава, че ще се забави, когато се доближи до целевото напрежение. За всички практически цели напрежението е "достатъчно близо" след 5 RC секунди. RC се нарича "времева константа". Както видяхме по -рано, това е продукт на стойностите на резистора и кондензатора във вашата схема. Проблемът е, че 5 RC е доста дълго време за актуализиране на всяка точка в графичния дисплей. Това води до много трептене!

Когато използваме широчинно -импулсна модулация (PWM) за зареждане на кондензатор, не сме по -добре. С ШИМ напрежението бързо се превключва между 0V и 5V. На практика това означава, че бързо се редуваме между натискане на заряд в кондензатора и издърпване на малко от него отново - това натискане и издърпване е по -скоро като опит да пробягаш маратон, като направиш голяма крачка напред и след това крачка назад отново и отново.

Когато изчислите всичко средно, поведението на зареждане на кондензатор с помощта на ШИМ е точно същото, сякаш сте използвали постоянно напрежение от Vpwm за зареждане на кондензатора. Все още са необходими около 5 RC секунди, за да се доближим достатъчно до желаното напрежение.

Стъпка 7: Преминете от a до B, малко по -бързо

Станете от a до B, малко по -бързо
Станете от a до B, малко по -бързо

Да предположим, че имаме кондензатор, който вече е зареден до Va. Да предположим, че използваме analogWrite (), за да изпишем новата стойност на b. Какъв е минималният период от време, който трябва да изчакате за достигане на напрежението Vb?

Ако познаете 5 RC секунди, това е страхотно! Като изчакате 5 RC секунди, кондензаторът ще се зареди до почти почти Vb. Но ако искаме, всъщност можем да изчакаме малко по -малко.

Погледнете кривата на заряда. Виждате ли, кондензаторът вече беше във Va, когато започнахме. Това означава, че не е нужно да чакаме времето t_a. Ще трябва само ако зареждаме кондензатора от нула.

Така че, като не чакаме това време, виждаме подобрение. Времето t_ab всъщност е малко по -кратко от 5 RC.

Но изчакайте, можем да направим много по -добре! Вижте цялото това пространство над v_b. Това е разликата между Vcc, максималното напрежение, с което разполагаме, и Vb, което възнамеряваме да достигнем. Можете ли да видите как това допълнително напрежение може да ни помогне да стигнем до мястото, където искаме, много по -бързо?

Стъпка 8: Преминете от a до B, с турбо зарядно

Преминете от a до B, с турбо зарядно устройство!
Преминете от a до B, с турбо зарядно устройство!

Това е вярно. Вместо да използваме ШИМ при целевото напрежение V_b, ние го държим при постоянен Vcc за много, много по -кратък период от време. Наричам това метода Turbo Charger и той ни отвежда много, много бързо! След закъснението (което трябва да изчислим), натискаме спирачките, като превключваме към ШИМ при V_b. Това предпазва напрежението от превишаване на целта.

С този метод е възможно да се промени напрежението в кондензатора от V_a на V_b за част от времето, отколкото само с ШИМ. Ето как получавате места, скъпа!

Стъпка 9: Разберете кода

Разберете кодекса
Разберете кодекса

Една картина струва хиляда думи, така че диаграмата показва данните и операциите, които се извършват в кода. От ляво на дясно:

  • Графичните данни се съхраняват в PROGMEM (тоест, флаш памет) като списък с точки.
  • Всяка комбинация от операции на транслация, мащабиране и въртене се комбинират в афинна матрица за трансформация. Това се прави веднъж в началото на всеки анимационен кадър.
  • Точките се четат една по една от графичните данни и всяка се умножава по съхранената матрица за трансформация.
  • Трансформираните точки се подават чрез ножичен алгоритъм, който изрязва всякакви точки извън видимата област.
  • Използвайки таблица за търсене на RC забавяне, точките се преобразуват в управляващи напрежения и времеви закъснения. Таблицата за търсене на RC забавяне се съхранява в EEPROM и може да се използва повторно за множество изпълнения на кода. При стартиране таблицата за търсене на RC се проверява за точност и всички неправилни стойности се актуализират. Използването на EEPROM спестява ценна RAM памет.
  • Задвижващите напрежения и закъснения се записват в неактивната рамка в рамковия буфер. Буферът на рамката съдържа място за активна рамка и неактивна рамка. След като се запише цял кадър, неактивният кадър се активира.
  • Обслужваща програма за прекъсване непрекъснато изчертава картината, като отчита стойностите на напрежението и закъсненията от активния рамков буфер. Въз основа на тези стойности той регулира работните цикли на изходните щифтове. Таймер 1 се използва за измерване на закъснението до няколко наносекунди прецизност, докато таймер 2 се използва за контрол на работния цикъл на щифтовете.
  • Щифтът с най-голямата промяна в напрежението винаги е "турбо зареден" с работен цикъл нула или 100%, осигуряващ най-бързото време на зареждане или разреждане. Щифтът с по-малка промяна в напрежението се задвижва с работен цикъл, избран да съответства на времето на прехода на първия щифт-това време съвпадение е важно, за да се гарантира, че линиите са изчертани направо върху осцилоскопа.

Стъпка 10: С голяма скорост идва голяма отговорност

Тъй като този метод е много по -бърз от ШИМ, защо analogWrite () не го използва? Е, защото използването само на PWM е достатъчно добро за повечето програми и е много по -прощаващо. Методът "Turbo Charger" обаче изисква внимателно кодиране и е подходящ само за конкретни случаи:

  1. Той е изключително чувствителен към времето. След като достигнем целевото ниво на напрежение, задвижващият щифт трябва незабавно да бъде превключен в обикновен ШИМ режим, за да се избегне превишаване на целевото напрежение.
  2. Това изисква познаване на RC константата, така че тези стойности трябва да бъдат въведени предварително. При неправилни стойности времето ще бъде грешно и напреженията ще бъдат неправилни. С обикновен ШИМ има гаранция, че ще се установите на правилното напрежение след известно време, дори ако RC константата не е известна.
  3. Изчисляването на точния интервал от време за зареждане на кондензатора изисква логаритмични уравнения, които са твърде бавни за изчисляване в реално време на Arduino. Те трябва да бъдат предварително изчислени преди всеки кадър за анимация и да се кешират някъде в паметта.
  4. Програмите, занимаващи се с този метод, трябва да се съобразяват с факта, че забавянията са много нелинейни (те всъщност са експоненциални). Целевите напрежения в близост до Vcc или GND ще отнемат много по -дълго време за достигане от напреженията в средната точка.

За да преодолее тези ограничения, моят векторен графичен код прави следните неща:

  1. Той използва Таймер 1 на 16 kHz и рутинно обслужване за прекъсване за прецизна манипулация на изхода и синхронизиране.
  2. Това изисква да се използва специфична стойност на RC времевата константа, ограничаваща избора на стойностите на кондензатора и резистора.
  3. Той съхранява закъсненията във всички точки в рамка за анимация в буфер на паметта. Това означава, че процедурата, която изчислява закъсненията, работи с много по -бавни темпове от рутинната услуга за прекъсване, която актуализира изходните щифтове. Всяка дадена рамка може да бъде боядисана няколко десетки пъти, преди да е готов нов набор от забавяния за следващата рамка.
  4. Използването на буфер на паметта ограничава броя на точките, които могат да бъдат изтеглени на кадър. Използвам ефективно кодиране на пространството, за да извлека максимума от наличната RAM, но тя все още е ограничена до около 150 точки. Над сто и повече точки, дисплеят така или иначе ще започне да трепти, така че това е спорен въпрос!

Препоръчано: