Cuprins:
- Pasul 1: Construirea circuitului
- Pasul 2: Configurarea osciloscopului
- Pasul 3: Descărcați și rulați software-ul
- Pasul 4: Creați-vă propriul desen personalizat
- Pasul 5: lipiți coordonatele din fișierul SVG în IDE-ul Arduino
- Pasul 6: Înțelegeți de ce PWM este atât de lent
- Pasul 7: Treceți de la a la B, un bit mai rapid
- Pasul 8: Treceți de la a la B, cu un turbo încărcător
- Pasul 9: Înțelegeți codul
- Pasul 10: Cu mare viteză, vine o mare responsabilitate
Video: Tensiuni analogice super rapide de la Arduino: 10 pași (cu imagini)
2024 Autor: John Day | [email protected]. Modificat ultima dată: 2024-01-30 11:45
Acest instructable arată cum să generați modificări de tensiune analogice foarte rapide de la un Arduino și o rezistență simplă și o pereche de condensatori. O aplicație în care acest lucru este util este generarea de grafică pe un osciloscop. Există mai multe alte proiecte care au realizat acest lucru. Johngineer prezintă un pom de Crăciun simplu folosind modularea lățimii pulsului (PWM). Alții s-au îmbunătățit la acel proiect folosind o scară de rezistență sau folosind un cip convertor digital-analogic dedicat.
Utilizarea PWM provoacă o sclipire mare, în timp ce utilizarea unei scări de rezistență sau a unui convertor digital-analog necesită mai mulți pini de ieșire și componente care ar putea să nu fie ușor disponibile. Circuitul pe care îl folosesc este același rezistor simplu mort și pereche de condensatori ca și cei folosiți în demo-ul pomului de Crăciun, dar funcționează cu o sclipire semnificativ mai mică.
În primul rând, vă voi ghida prin procesul de construire a circuitului. Apoi vă voi învăța cum să adăugați propria imagine. În cele din urmă, voi introduce teoria despre ceea ce o face mai rapidă.
Dacă ți-a plăcut acest Instructable, te rog să iei în considerare votul!:)
Pasul 1: Construirea circuitului
Pentru a construi circuitul, veți avea nevoie de următoarele:
a) Un Arduino bazat pe Atmel 16MHz ATmega328P, cum ar fi un Arduino Uno sau Arduino Nano.
b) Două rezistențe de valoare R care este cel puțin 150Ω.
c) Două condensatoare de valoare C astfel încât C = 0,0015 / R, exemple:
- R = 150Ω și C = 10µ
- R = 1,5kΩ și C = 1µ
- R = 15kΩ și C = 100nF
- R = 150kΩ și C = 10nF
Motivele pentru alegerea acestor valori sunt două. În primul rând, vrem să menținem curentul pe pinii Arduino sub curentul nominal maxim de 40mA. Utilizarea unei valori de 150Ω limitează curentul la 30mA atunci când este utilizat cu tensiunea de alimentare Arduino de 5V. Valorile mai mari ale lui R vor reduce curentul și, prin urmare, sunt acceptabile.
A doua constrângere este că vrem să menținem timpul constant, care este produsul lui R și C, egal cu aproximativ 1,5 ms. Software-ul a fost reglat special pentru această constantă de timp. Deși este posibil să reglați valorile lui R și C în software, există o gamă îngustă în jurul căreia va funcționa, deci alegeți componentele cât mai aproape de raportul sugerat.
O explicație mai amănunțită a motivului pentru care este importantă constanta RC va fi dată în secțiunea de teorie, după ce v-am arătat cum să asamblați circuitul demonstrativ.
Pasul 2: Configurarea osciloscopului
Demonstrația necesită un osciloscop setat în modul X / Y. Cablurile de testare trebuie conectate așa cum se arată în schemă. Osciloscopul dvs. va diferi de al meu, dar voi parcurge pașii necesari pentru a configura modul X / Y pe unitatea mea:
a) Setați măturarea orizontală pentru a fi controlată de Canalul B (axa X).
b) Setați osciloscopul în modul dual channel.
c) Setați volți / div pe ambele canale astfel încât să poată afișa tensiuni de la 0V la 5V. Am setat-o pe a mea la 0,5V / div.
d) Setați modul de cuplare la CC pe ambele canale.
e) Reglați poziția lui X și Y astfel încât punctul să fie în colțul din stânga jos al ecranului când Arduino este oprit.
Pasul 3: Descărcați și rulați software-ul
Descărcați software-ul din depozitul Fast Vector Display For Arduino. Software-ul este licențiat sub licența publică GNU Affero v3 și poate fi utilizat și modificat în mod liber în condițiile acestei licențe.
Deschideți fișierul „fast-vector-display-arduino.ino” din IDE-ul Arduino și încărcați-l pe Arduino. Momentan, veți vedea o animație „An Nou fericit” pe ecranul osciloscopului.
Am dezvoltat acest proiect ca un hackaton personal în săptămânile premergătoare Crăciunului, așa că există un mesaj tematic de Crăciun și An Nou pe care îl puteți vedea modificând variabila PATTERN din cod.
Pasul 4: Creați-vă propriul desen personalizat
Dacă doriți să creați propriul desen, puteți lipi coordonatele punctelor în schița Arduino pe linia care definește USER_PATTERN.
Am constatat că Inkscape este un instrument destul de bun pentru realizarea unui desen personalizat:
- Creați text folosind un font mare, aldin, cum ar fi Impact.
- Selectați obiectul text și selectați „Object to Path” din meniul „Path”.
- Selectați litere individuale și suprapuneți-le pentru a crea o formă conectată
- Selectați „Unire” din meniul „Cale” pentru a le combina într-o singură curbă.
- Dacă există găuri în orice literă, tăiați o crestătură mică trasând un dreptunghi cu instrumentul dreptunghiular și scădeți-l din contur folosind instrumentul „Diferență”.
- Faceți dublu clic pe cale pentru a afișa nodurile.
- Dreptunghi selectați toate nodurile și faceți clic pe instrumentul „Asigurați colțul nodurilor selectate”.
- Salvați fișierul SVG.
Important este că desenul dvs. trebuie să aibă o singură cale închisă și să nu aibă găuri. Asigurați-vă că designul dvs. are mai puțin de aproximativ 130 de puncte.
Pasul 5: lipiți coordonatele din fișierul SVG în IDE-ul Arduino
- Deschideți fișierul SVG și copiați coordonatele. Acestea vor fi încorporate în elementul „cale”. Prima pereche de coordonate poate fi ignorată; înlocuiți-le cu 0, 0.
- Lipiți coordonatele în schița Arduino în paranteze imediat după „#define USER_PATTERN”.
- Înlocuiți toate spațiile cu virgule, altfel veți primi o eroare de compilare. Instrumentul „Înlocuiți și găsiți” poate fi util.
- Compilați și rulați!
- Dacă aveți probleme, urmăriți consola serială pentru eventuale erori. În special, veți vedea mesaje dacă modelul dvs. are prea multe puncte pentru tamponul intern. În astfel de cazuri, imaginea va prezenta o sclipire excesivă.
Pasul 6: Înțelegeți de ce PWM este atât de lent
Pentru început, să analizăm comportamentul unui condensator pe măsură ce acesta se încarcă.
Un condensator conectat la o sursă de tensiune Vcc își va crește tensiunea în conformitate cu o curbă exponențială. Această curbă este asimptotică, ceea ce înseamnă că va încetini pe măsură ce se apropie de tensiunea țintă. În toate scopurile practice, tensiunea este „suficient de apropiată” după 5 secunde RC. RC se numește „constantă de timp”. După cum am văzut mai devreme, este produsul valorilor rezistorului și condensatorului din circuitul dvs. Problema este că 5 RC este un timp destul de lung pentru actualizarea fiecărui punct dintr-un afișaj grafic. Acest lucru duce la o mulțime de pâlpâire!
Când folosim modulația lățimii impulsurilor (PWM) pentru a încărca un condensator, nu suntem mai bine. Cu PWM, tensiunea comută rapid între 0V și 5V. În practică, acest lucru înseamnă că alternăm rapid între împingerea încărcării în condensator și tragerea din nou a piciorului din nou - această împingere și tragere este mai degrabă ca încercarea de a rula un maraton făcând un pas mare înainte și apoi un pas înapoi din nou si din nou.
Când calculați totul, comportamentul încărcării unui condensator utilizând PWM este exact același ca și când ați fi folosit o tensiune constantă de Vpwm pentru a încărca condensatorul. Încă durează aproximativ 5 secunde RC pentru ca noi să ajungem „suficient de aproape” de tensiunea dorită.
Pasul 7: Treceți de la a la B, un bit mai rapid
Să presupunem că avem un condensator care este deja încărcat până la Va. Să presupunem că folosim analogWrite () pentru a scrie noua valoare a lui b. Care este timpul minim pe care trebuie să-l așteptați pentru ca tensiunea Vb să fie atinsă?
Dacă ai ghicit 5 secunde RC, este minunat! Așteptând 5 secunde RC, condensatorul va fi încărcat la aproape Vb. Dar dacă vrem, putem aștepta de fapt puțin mai puțin.
Uită-te la curba de încărcare. Vedeți, condensatorul era deja la Va când am început. Aceasta înseamnă că nu trebuie să așteptăm timpul t_a. Ar trebui să facem doar dacă am încărca condensatorul de la zero.
Așadar, neașteptând acel moment, vedem o îmbunătățire. Timpul t_ab este de fapt puțin mai scurt decât 5 RC.
Dar stai, putem face mult mai bine! Uită-te la tot spațiul de deasupra v_b. Aceasta este diferența dintre Vcc, tensiunea maximă disponibilă pentru noi și Vb pe care intenționăm să îl atingem. Puteți vedea cum această tensiune suplimentară ne poate ajuta să ajungem acolo unde vrem să mergem mult mai repede?
Pasul 8: Treceți de la a la B, cu un turbo încărcător
Asta e corect. În loc să folosim PWM la tensiunea țintă V_b, o menținem la un Vcc constant pentru o perioadă de timp mult, mult mai scurtă. Numesc asta metoda Turbo Charger și ne ajută unde vrem să mergem foarte, foarte repede! După întârzierea timpului (pe care trebuie să o calculăm), tragem frânele trecând la PWM la V_b. Aceasta împiedică tensiunea să depășească ținta.
Cu această metodă, este posibil să se schimbe tensiunea din condensator de la V_a la V_b într-o fracțiune din timp decât folosind doar PWM. Așa îți iei locuri, iubito!
Pasul 9: Înțelegeți codul
O imagine valorează o mie de cuvinte, astfel încât diagrama arată datele și operațiunile care sunt efectuate în cod. De la stanga la dreapta:
- Datele grafice sunt stocate în PROGMEM (adică în memoria flash) ca o listă de puncte.
- Orice combinație de operații de translație, scalare și rotație este combinată într-o matrice de transformare afină. Acest lucru se face o dată la începutul fiecărui cadru de animație.
- Punctele sunt citite unul câte unul din datele grafice și sunt înmulțite fiecare cu matricea de transformare stocată.
- Punctele transformate sunt alimentate printr-un algoritm de foarfecă care recoltează orice puncte în afara zonei vizibile.
- Folosind un tabel de căutare cu întârziere RC, punctele sunt convertite în tensiuni de conducere și întârzieri de timp. Tabelul de căutare cu întârziere RC este stocat în EEPROM și poate fi reutilizat pentru mai multe rulări ale codului. La pornire, tabelul de căutare RC este verificat pentru acuratețe și toate valorile incorecte sunt actualizate. Utilizarea EEPROM economisește o memorie RAM valoroasă.
- Tensiunile de conducere și întârzierile sunt scrise în cadrul inactiv din buffer-ul cadrului. Tamponul de cadre conține spațiu pentru un cadru activ și un cadru inactiv. Odată ce un cadru complet este scris, cadrul inactiv devine activ.
- O rutină de service de întrerupere re-desenează în mod continuu imaginea citind valorile tensiunii și întârzierile din buffer-ul cadrului activ. Pe baza acestor valori, reglează ciclurile de funcționare ale pinilor de ieșire. Timerul 1 este utilizat pentru măsurarea întârzierii până la câteva nanosecunde de precizie, în timp ce temporizatorul 2 este utilizat pentru controlul ciclului de funcționare al pinilor.
- Pinul cu cea mai mare schimbare de tensiune este întotdeauna „turbo încărcat” cu un ciclu de funcționare de zero sau 100%, oferind cel mai rapid timp de încărcare sau descărcare. Știftul cu o schimbare mai mică a tensiunii este acționat cu un ciclu de funcționare ales pentru a se potrivi cu timpul de tranziție al primului știft - potrivirea acestui timp este importantă pentru a se asigura că liniile sunt trase direct pe osciloscop.
Pasul 10: Cu mare viteză, vine o mare responsabilitate
Deoarece această metodă este mult mai rapidă decât PWM, de ce nu o folosește analogWrite ()? Ei bine, pentru că utilizarea PWM este suficient de bună pentru majoritatea programelor și este mult mai iertătoare. Totuși, metoda „Turbo Charger” necesită o codificare atentă și este potrivită doar pentru cazuri specifice:
- Este extrem de sensibil la sincronizare. Odată ce am atins nivelul de tensiune țintă, știftul de acționare trebuie să fie imediat comutat în modul PWM obișnuit pentru a evita depășirea tensiunii țintă.
- Necesită cunoașterea constantei RC, deci aceste valori trebuie introduse în prealabil. Cu valori incorecte, sincronizarea va fi greșită și tensiunile vor fi incorecte. Cu PWM obișnuit, există o garanție că veți stabili tensiunea corectă după un timp, chiar dacă nu este cunoscută constanta RC.
- Calculul intervalului de timp precis pentru încărcarea condensatorului necesită ecuații logaritmice care sunt prea lente pentru calculul în timp real pe Arduino. Acestea trebuie să fie precalculate înainte de fiecare cadru de animație și stocate în memorie undeva.
- Programele care se ocupă de această metodă trebuie să lupte cu faptul că întârzierile sunt foarte neliniare (ele sunt, de fapt, exponențiale). Tensiunile țintă lângă Vcc sau GND vor dura mai multe ordine de mărime decât tensiunile din punctul mediu.
Pentru a depăși aceste limitări, codul meu de grafică vectorială face următoarele lucruri:
- Folosește Temporizatorul 1 la 16 kHz și o rutină de service de întrerupere pentru o manipulare și sincronizare precisă a ieșirii.
- Este necesară utilizarea unei valori specifice a constantei de timp RC, limitând alegerile valorilor condensatorului și rezistenței.
- Stochează întârzierile pentru toate punctele dintr-un cadru de animație într-un buffer de memorie. Aceasta înseamnă că rutina care calculează întârzierile se execută cu o rată mult mai lentă decât rutina serviciului de întrerupere care actualizează pinii de ieșire. Orice cadru dat poate fi pictat de câteva zeci de ori înainte ca un nou set de întârzieri pentru următorul cadru să fie gata de utilizare.
- Utilizarea unui buffer de memorie pune o constrângere asupra numărului de puncte care pot fi desenate pe cadru. Folosesc o codificare eficientă din punct de vedere spațial pentru a profita la maximum de memoria RAM disponibilă, dar este încă limitată la aproximativ 150 de puncte. Dincolo de aproximativ o sută de puncte cam așa, afișajul ar începe să pâlpâie oricum, deci este un punct discutabil!
Recomandat:
Cum să citiți mai multe valori analogice folosind un singur pin analogic: 6 pași (cu imagini)
Cum să citiți mai multe valori analogice utilizând un pin analogic: În acest tutorial, vă voi arăta cum să citiți mai multe valori analogice folosind un singur pin analogic de intrare
Dezvoltare Aplicații Analogice Pentru Dragonboard 410c Com Linker Sprite Mezzanine: 6 Steps
Dezvoltare Aplicații Analogice Pentru Dragonboard 410c Com Linker Sprite Mezzanine: Essa publica ç ã
Cum să faceți citiri analogice pe Raspberry Pi: 5 pași
Cum să faceți citiri analogice pe Raspberry Pi: Bună ziua tuturor! În acest tutorial vă voi arăta cum putem capta direct valori analogice folosind Raspberry Pi. După cum știm cu toții că Raspberry Pi este un mini modul de computer destul de puternic, care este popular printre amatori și profesioniști
Plotter de valori analogice Arduino: 4 pași
Arduino Analog Value Plotter: Acum ceva timp, m-am gândit că ar fi destul de la îndemână să am un grafic pentru ieșirile mele analogice. Ar ajuta la depanarea rezultatelor mele, mi-ar da o idee generală despre limitele senzorului și ce nu, și ar fi chiar o interfață destul de interesantă pentru orice senzor
Heritage - Ceramic în contextul tehnicilor digitale și analogice 2015: 3 pași (cu imagini)
Patrimoniu - Ceramică în contextul tehnicilor digitale și analogice 2015: Până acum, ceramica era o ambarcațiune care avea puțină influență digitală. Din acest motiv, a fost interesant să împerechem această ambarcațiune cu o nouă tehnologie. Punctul de plecare a fost o formă antică și un CNC Styrocutter.DESIGNBOOM