Taula de continguts:

Voltatges analògics súper ràpids des d'Arduino: 10 passos (amb imatges)
Voltatges analògics súper ràpids des d'Arduino: 10 passos (amb imatges)

Vídeo: Voltatges analògics súper ràpids des d'Arduino: 10 passos (amb imatges)

Vídeo: Voltatges analògics súper ràpids des d'Arduino: 10 passos (amb imatges)
Vídeo: SKR Pro v1.2 - Basics 2024, Juliol
Anonim
Image
Image

Aquesta instrucció mostra com generar canvis de voltatge analògics súper ràpids a partir d’un Arduino i un simple parell de resistències i condensadors. Una aplicació on és útil és generar gràfics en un oscil·loscopi. Hi ha diversos altres projectes que ho han fet. Johngineer mostra un arbre de Nadal senzill mitjançant la modulació de l'amplada de pols (PWM). Altres han millorat aquest projecte mitjançant l'ús d'una escala de resistència o mitjançant un xip convertidor digital-analògic dedicat.

L’ús de PWM provoca molt de parpelleig, mentre que l’ús d’una escala de resistència o d’un convertidor digital-analògic requereix més pins de sortida i components que potser no estiguin fàcilment disponibles. El circuit que faig servir és el mateix parell de resistències i condensadors simples morts que s’utilitzen a la demostració de l’arbre de Nadal, però funciona amb un parpelleig significativament inferior.

En primer lloc, us guiaré pel procés de construcció del circuit. A continuació, us ensenyaré a afegir la vostra pròpia imatge. Finalment, presentaré la teoria sobre què ho fa més ràpid.

Si us ha agradat aquest instructiu, penseu en votar-hi.:)

Pas 1: Construir el circuit

Construint el circuit
Construint el circuit

Per construir el circuit, necessitareu el següent:

a) Un Arduino basat en l'Atmel 16MHz ATmega328P, com ara un Arduino Uno o Arduino Nano.

b) Dues resistències de valor R que siguin com a mínim de 150Ω.

c) Dos condensadors de valor C tals que C = 0,0015 / R, exemples:

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

Les raons per triar aquests valors són dues. Primerament, volem mantenir el corrent als pins de l’Arduino per sota del corrent nominal màxim de 40 mA. L’ús d’un valor de 150Ω limita el corrent a 30 mA quan s’utilitza amb la tensió d’alimentació Arduino de 5V. Els valors més grans de R disminuiran el corrent i, per tant, són acceptables.

La segona restricció és que volem mantenir el temps constant, que és el producte de R i C, igual a uns 1,5 ms. El programari s'ha ajustat específicament per a aquesta constant de temps. Tot i que és possible ajustar els valors de R i C al programari, hi ha un rang estret al voltant del qual funcionarà, de manera que trieu components el més a prop possible de la proporció suggerida.

A la secció de teoria es donarà una explicació més completa de per què és important la constant RC, després que us hagi mostrat com muntar el circuit de demostració.

Pas 2: Configuració de l'oscil·loscopi

Configuració de l’oscil·loscopi
Configuració de l’oscil·loscopi

La demostració requereix un oscil·loscopi configurat en mode X / Y. Els cables de prova han d’estar connectats tal com es mostra als esquemes. El vostre oscil·loscopi serà diferent del meu, però seguiré els passos necessaris per configurar el mode X / Y a la meva unitat:

a) Establiu l'escombrat horitzontal que controlarà el canal B (l'eix X).

b) Estableix l’oscil·loscopi en mode de doble canal.

c) Configureu els volts / div en tots dos canals perquè pugui mostrar tensions de 0V a 5V. Vaig configurar la meva a 0,5 V / div.

d) Establiu el mode d’acoblament a CC als dos canals.

e) Ajusteu la posició de X i Y de manera que el punt estigui a l'extrem inferior esquerre de la pantalla quan l'Arduino estigui apagat.

Pas 3: descarregueu i executeu el programari

Image
Image

Baixeu-vos el programari des del dipòsit Fast Vector Display For Arduino. El programari està llicenciat sota la GNU Affero Public License v3 i es pot utilitzar i modificar lliurement segons els termes d’aquesta llicència.

Obriu el fitxer "fast-vector-display-arduino.ino" a l'IDE Arduino i pengeu-lo al vostre Arduino. De moment, veureu una animació "Feliç Any Nou" a la pantalla de l'oscil·loscopi.

Vaig desenvolupar aquest projecte com a hackaton personal les setmanes prèvies a Nadal, de manera que hi ha un missatge temàtic de Nadal i Any Nou que podeu veure modificant la variable PATTERN al codi.

Pas 4: creeu el vostre propi dibuix personalitzat

Compreneu per què PWM és tan lent
Compreneu per què PWM és tan lent

Si voleu crear el vostre propi dibuix, podeu enganxar coordenades de punts a l'esbós d'Arduino a la línia que defineix USER_PATTERN.

Vaig trobar que Inkscape és una eina bastant bona per fer un dibuix personalitzat:

  1. Creeu text amb un tipus de lletra gran i en negreta, com ara Impact.
  2. Seleccioneu l'objecte de text i seleccioneu "Objecte a camí" al menú "Camí".
  3. Seleccioneu lletres individuals i superposeu-les per crear una forma connectada
  4. Seleccioneu "Unió" al menú "Camí" per combinar-los en una sola corba.
  5. Si hi ha forats en alguna lletra, talla una petita osca dibuixant un rectangle amb l'eina rectangle i resta'l del contorn mitjançant l'eina "Diferència".
  6. Feu doble clic al camí per mostrar els nodes.
  7. Seleccioneu Rectangle tots els nodes i feu clic a l'eina "Fes cantonada dels nodes seleccionats".
  8. Deseu el fitxer SVG.

L’important és que el dibuix tingui un sol camí tancat i sense forats. Assegureu-vos que el vostre disseny tingui menys d’uns 130 punts.

Pas 5: enganxeu les coordenades del fitxer SVG a l'IDE Arduino

  1. Obriu el fitxer SVG i copieu les coordenades. Aquests s'incorporaran a l'element "camí". Es pot ignorar el primer parell de coordenades; substituïu-los per 0, 0.
  2. Enganxeu les coordenades a l'esbós d'Arduino dins dels claudàtors just després de "#define USER_PATTERN".
  3. Substituïu tots els espais per comes, en cas contrari obtindreu un error de compilació. Pot ser útil l'eina "Substitueix i cerca".
  4. Compila i executa!
  5. Si teniu problemes, mireu la consola sèrie si hi ha cap error. En particular, veureu missatges si el vostre patró té massa punts per a la memòria intermèdia interna. En aquests casos, la imatge mostrarà un parpelleig excessiu.

Pas 6: enteneu per què PWM és tan lent

Per començar, revisem el comportament d’un condensador mentre es carrega.

Un condensador connectat a una font de tensió Vcc augmentarà la seva tensió segons una corba exponencial. Aquesta corba és asimptòtica, és a dir, es reduirà a mesura que s’acosti a la tensió objectiu. A tots els efectes pràctics, el voltatge és "prou proper" després de 5 segons RC. El RC es diu "constant de temps". Com hem vist anteriorment, és el producte dels valors de la resistència i el condensador del vostre circuit. El problema és que 5 RC és un temps bastant llarg per actualitzar cada punt en una pantalla gràfica. Això provoca molt de parpelleig.

Quan fem servir la modulació d’amplada de pols (PWM) per carregar un condensador, no estem millor. Amb PWM, el voltatge canvia ràpidament entre 0V i 5V. A la pràctica, això significa que alternem ràpidament entre empènyer la càrrega al condensador i treure-ne una mica de nou cap a fora; aquest empenta i tracció és més aviat com intentar córrer una marató fent un gran pas endavant i després un petit pas enrere una vegada i una altra.

Quan es calcula la mitjana, el comportament de carregar un condensador mitjançant PWM és exactament el mateix que si haguéssiu utilitzat un voltatge constant de Vpwm per carregar el condensador. Encara trigem uns 5 segons RC perquè ens apropem "prou" al voltatge desitjat.

Pas 7: Obteniu de A a B, un Tad Bit més ràpid

Aconsegueix De a a B, un Tad Bit més ràpid
Aconsegueix De a a B, un Tad Bit més ràpid

Suposem que tenim un condensador que ja està carregat fins a Va. Suposem que fem servir analogWrite () per escriure el nou valor de b. Quin és el temps mínim que cal esperar per assolir la tensió Vb?

Si heu endevinat 5 segons de RC, és fantàstic. En esperar 5 segons RC, el condensador es carregarà a gairebé Vb. Però si volem, podem esperar una mica menys.

Mireu la corba de càrrega. Ja veieu, el condensador ja estava a Va quan vam començar. Això significa que no hem d’esperar el temps t_a. Només hauríem de fer-ho si estiguéssim carregant el condensador des de zero.

Per tant, en no esperar aquest temps, veiem una millora. El temps t_ab és en realitat una mica inferior a 5 RC.

Però espera, ho podem fer molt millor! Mireu tot aquell espai que hi ha a sobre de v_b. Aquesta és la diferència entre Vcc, la tensió màxima disponible i la Vb que pretenem assolir. Podeu veure com aquest voltatge addicional ens pot ajudar a arribar on volem anar molt més ràpid?

Pas 8: passeu de la A a la B, amb un turbo carregador

Aneu de la A a la B, amb un turbo carregador
Aneu de la A a la B, amb un turbo carregador

Això és correcte. En lloc d’utilitzar PWM al voltatge objectiu V_b, el mantenim a un Vcc constant durant un període de temps molt més curt. Jo anomeno això el mètode Turbo Charger i ens porta cap a on volem anar molt ràpid. Després del retard de temps (que hem de calcular), donem cops de fre canviant a PWM a V_b. Això evita que el voltatge sobrepassi l'objectiu.

Amb aquest mètode, és possible canviar la tensió del condensador de V_a a V_b en una fracció del temps que no pas només amb PWM. Així és com aconsegueixes places, nena!

Pas 9: entendre el codi

Entendre el codi
Entendre el codi

Una imatge val més que mil paraules, de manera que el diagrama mostra les dades i les operacions que es realitzen al codi. D'esquerra a dreta:

  • Les dades gràfiques s’emmagatzemen a PROGMEM (és a dir, memòria flash) com a llista de punts.
  • Qualsevol combinació d’operacions de translació, escalat i rotació es combina en una matriu de transformació afí. Això es fa una vegada a l'inici de cada marc d'animació.
  • Els punts es llegeixen un a un a partir de dades gràfiques i es multipliquen per la matriu de transformació emmagatzemada.
  • Els punts transformats s’alimenten mitjançant un algorisme de tisora que retalla qualsevol punt fora de la zona visible.
  • Mitjançant una taula de cerca de retard RC, els punts es converteixen en tensions de conducció i retards de temps. La taula de cerca de retard de RC s'emmagatzema a EEPROM i es pot tornar a utilitzar per a diverses execucions del codi. A l'inici, es comprova la precisió de la taula de cerca RC i s'actualitzen els valors incorrectes. L'ús d'EEPROM estalvia valuosa memòria RAM.
  • Les tensions de conducció i els retards s’escriuen al quadre inactiu del buffer de fotogrames. El buffer de marcs conté espai per a un marc actiu i un marc inactiu. Un cop escrit un marc complet, el marc inactiu es fa actiu.
  • Una rutina de servei d’interrupcions torna a dibuixar contínuament la imatge llegint els valors de tensió i els retards del buffer de trames actiu. Basant-se en aquests valors, ajusta els cicles de treball dels pins de sortida. El temporitzador 1 s’utilitza per mesurar el retard de temps fins a uns nanosegons de precisió, mentre que el temporitzador 2 s’utilitza per controlar el cicle de treball dels pins.
  • El pin amb el canvi de tensió més gran sempre està "turbo carregat" amb un cicle de treball de zero o 100%, que proporciona el temps de càrrega o descàrrega més ràpid. El pin amb un canvi de tensió menor es condueix amb un cicle de treball escollit per coincidir amb el temps de transició del primer pin; aquest temps és important per garantir que les línies es dibuixin rectes a l'oscil·loscopi.

Pas 10: amb gran velocitat, comporta una gran responsabilitat

Com que aquest mètode és molt més ràpid que PWM, per què no l’utilitza analogWrite ()? Bé, perquè utilitzar només PWM és prou bo per a la majoria de programes i és molt més perdonador. El mètode "Turbo Charger", però, requereix una codificació acurada i només és adequat per a casos específics:

  1. És extremadament sensible als temps. Un cop arribem al nivell de tensió objectiu, el passador de conducció s’ha de canviar immediatament al mode PWM normal per tal d’evitar superar el voltatge objectiu.
  2. Requereix el coneixement de la constant RC, per tant, cal introduir aquests valors prèviament. Amb valors incorrectes, la sincronització serà incorrecta i les tensions seran incorrectes. Amb el PWM normal, es garanteix que s’assentarà al voltatge correcte al cap d’un temps, fins i tot si no es coneix la constant RC.
  3. Per calcular l’interval de temps precís per carregar el condensador es requereixen equacions logarítmiques massa lentes per al càlcul en temps real de l’Arduino. Aquests han de ser pre-calculats abans de cada fotograma d'animació i emmagatzemats a la memòria cau en algun lloc.
  4. Els programes que tracten aquest mètode han de lluitar contra el fet que els retards són molt no lineals (de fet, són exponencials). Les tensions objectiu properes a Vcc o GND trigaran molts ordres de magnitud a arribar a les tensions properes al punt mitjà.

Per superar aquestes limitacions, el meu codi de gràfics vectorials fa les coses següents:

  1. Utilitza el temporitzador 1 a 16 kHz i una rutina de servei d’interrupcions per a una manipulació i un temps de sortida precisos.
  2. Es requereix un valor específic de constant de temps de RC, que limita les opcions dels valors del condensador i de la resistència.
  3. Emmagatzema els retards de temps per a tots els punts d’un marc d’animació en un buffer de memòria. Això significa que la rutina que calcula els retards s’executa a un ritme molt més lent que la rutina de servei d’interrupcions que actualitza els pins de sortida. Qualsevol marc determinat es pot pintar diverses desenes de vegades abans que un nou conjunt de retards per al següent quadre estigui a punt per ser utilitzat.
  4. L'ús d'una memòria intermèdia de memòria limita el nombre de punts que es poden dibuixar per fotograma. Empren una codificació eficient d’espai per treure el màxim profit de la memòria RAM disponible, però encara es limita a uns 150 punts. Més enllà d’un centenar de punts aproximadament, la pantalla començaria a parpellejar de totes maneres, de manera que és un punt discutible.

Recomanat: