Innholdsfortegnelse:

Super raske analoge spenninger fra Arduino: 10 trinn (med bilder)
Super raske analoge spenninger fra Arduino: 10 trinn (med bilder)

Video: Super raske analoge spenninger fra Arduino: 10 trinn (med bilder)

Video: Super raske analoge spenninger fra Arduino: 10 trinn (med bilder)
Video: Пирамиды Истинная цель НАКОНЕЦ ОТКРЫТО: Продвинутая древняя технология 2024, Juli
Anonim
Image
Image

Denne instruksen viser hvordan du genererer super raske analoge spenningsendringer fra en Arduino og et enkelt motstands- og kondensatorpar. En applikasjon der dette er nyttig er å generere grafikk på et oscilloskop. Det er flere andre prosjekter som har gjort dette. Johngineer viser et enkelt juletre som bruker pulsbreddemodulering (PWM). Andre har forbedret prosjektet ved å bruke en motstandsstige eller ved å bruke en dedikert digital-til-analog omformerbrikke.

Bruk av PWM forårsaker mye flimmer, mens bruk av en motstandsstige eller en digital-til-analog omformer krever flere utgangspinner og komponenter som kanskje ikke er lett tilgjengelige. Kretsen jeg bruker er det samme døde enkle motstands- og kondensatorparet som ble brukt i juletredemoen, men fungerer med betydelig mindre flimmer.

Først vil jeg guide deg gjennom prosessen med å bygge kretsen. Deretter vil jeg lære deg hvordan du legger til ditt eget bilde. Til slutt vil jeg introdusere teorien om hva som gjør det raskere.

Hvis du likte denne Instructable, kan du vurdere å stemme på den!:)

Trinn 1: Bygg kretsen

Bygg kretsen
Bygg kretsen

For å bygge kretsen trenger du følgende:

a) En Arduino basert på Atmel 16MHz ATmega328P, for eksempel en Arduino Uno eller Arduino Nano.

b) To motstander med verdi R som er minst 150Ω.

c) To kondensatorer av verdi C slik at C = 0,0015 / R, eksempler:

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

Årsakene til å velge disse verdiene er todelt. Primært ønsker vi å holde strømmen på pinnene på Arduino under maksimal nominell strøm på 40mA. Ved å bruke en verdi på 150Ω begrenser strømmen til 30mA når den brukes med Arduino -forsyningsspenningen på 5V. Større verdier av R vil redusere strømmen og er derfor akseptable.

Den andre begrensningen er at vi ønsker å holde tiden konstant, som er produktet av R og C, lik ca. 1,5 ms. Programvaren er spesielt innstilt for denne tidskonstanten. Selv om det er mulig å justere verdiene til R og C i programvaren, er det et smalt område det vil fungere rundt, så velg komponenter så nær det foreslåtte forholdet som mulig.

En mer grundig forklaring på hvorfor RC -konstanten er viktig vil bli gitt i teoridelen, etter at jeg har vist deg hvordan du monterer demonstrasjonskretsen.

Trinn 2: Sette opp oscilloskopet

Sette opp oscilloskopet
Sette opp oscilloskopet

Demonstrasjonen krever et oscilloskop satt til X/Y -modus. Testledningene må kobles til som vist i skjemaet. Oscilloskopet ditt vil avvike fra mitt, men jeg vil gå gjennom de nødvendige trinnene for å sette opp X/Y -modus på enheten min:

a) Still inn den horisontale sveipingen som skal kontrolleres av kanal B (X -aksen).

b) Sett oscilloskopet på tokanals modus.

c) Still inn volt/div på begge kanalene slik at den kan vise spenninger fra 0V til 5V. Jeg satte min til 0,5V/div.

d) Sett koblingsmodus til DC på begge kanaler.

e) Juster posisjonen til X og Y slik at prikken er i nedre venstre hjørne av skjermen når Arduino er slått av.

Trinn 3: Last ned og kjør programvaren

Image
Image

Last ned programvaren fra Fast Vector Display For Arduino -depotet. Programvaren er lisensiert under GNU Affero Public License v3 og kan fritt brukes og modifiseres under vilkårene i denne lisensen.

Åpne "fast-vector-display-arduino.ino" -filen i Arduino IDE og last opp til Arduino. Et øyeblikk vil du se en "godt nytt år" -animasjon på oscilloskopskjermen.

Jeg utviklet dette prosjektet som en personlig hackaton i ukene før jul, så det er en melding om jul og nyttår du kan se ved å endre PATTERN -variabelen i koden.

Trinn 4: Lag din egen tilpassede tegning

Forstå hvorfor PWM er så treg
Forstå hvorfor PWM er så treg

Hvis du ønsker å lage din egen tegning, kan du lime inn punktkoordinater i Arduino -skissen på linjen som definerer USER_PATTERN.

Jeg fant ut at Inkscape er et ganske godt verktøy for å lage en tilpasset tegning:

  1. Lag tekst med en stor, fet skrift som Impact.
  2. Velg tekstobjektet og velg "Object to Path" fra "Path" -menyen.
  3. Velg individuelle bokstaver og overlapp dem for å lage en tilkoblet form
  4. Velg "Union" fra "Path" -menyen for å kombinere dem til en enkelt kurve.
  5. Hvis det er hull i noen bokstaver, kutter du et lite hakk ved å tegne et rektangel med rektangelverktøyet og trekker det fra konturen ved hjelp av "Difference" -verktøyet.
  6. Dobbeltklikk på banen for å vise nodene.
  7. Rektangel, velg alle noder og klikk på verktøyet "Lag valgte noder".
  8. Lagre SVG -filen.

Det viktige er at tegningen din skal ha en enkelt lukket bane og ingen hull. Sørg for at designet ditt har færre enn omtrent 130 poeng.

Trinn 5: Lim inn koordinatene fra SVG -filen i Arduino IDE

  1. Åpne SVG -filen og kopier ut koordinatene. Disse vil være innebygd i "banen" -elementet. Det første koordinatparet kan ignoreres; erstatt dem med 0, 0.
  2. Lim inn koordinatene i Arduino -skissen inne i parentesene rett etter "#define USER_PATTERN".
  3. Erstatt alle mellomrom med kommaer, ellers får du en kompileringsfeil. Verktøyet "Erstatt og finn" kan være nyttig.
  4. Kompiler og kjør!
  5. Hvis du har problemer, kan du se på den serielle konsollen for eventuelle feil. Spesielt vil du se meldinger hvis mønsteret ditt har for mange punkter for den interne bufferen. I slike tilfeller vil bildet vise mye flimmer.

Trinn 6: Forstå hvorfor PWM er så treg

For å begynne, la oss se på oppførselen til en kondensator mens den lades.

En kondensator som er koblet til en spenningskilde Vcc vil øke spenningen i henhold til en eksponentiell kurve. Denne kurven er asymptotisk, noe som betyr at den vil bremse når den nærmer seg målspenningen. For alle praktiske formål er spenningen "nær nok" etter 5 RC sekunder. RC kalles "tidskonstanten". Som vi så tidligere, er det produktet av verdiene til motstanden og kondensatoren i kretsen din. Problemet er at 5 RC er en ganske lang tid for å oppdatere hvert punkt i en grafisk skjerm. Dette fører til mye flimmer!

Når vi bruker pulsbreddemodulering (PWM) for å lade en kondensator, har vi det ikke bedre. Med PWM veksler spenningen raskt mellom 0V og 5V. I praksis betyr dette at vi raskt veksler mellom å skyve ladningen inn i kondensatoren og trekke litt av den rett ut igjen - denne trykkingen og trekkingen er ganske som å prøve å løpe et maraton ved å ta et stort skritt fremover og deretter et lite skritt bakover igjen og igjen.

Når du gjennomsnittlig beregner alt, er oppførselen til å lade en kondensator ved hjelp av PWM nøyaktig den samme som om du hadde brukt en jevn spenning på Vpwm for å lade kondensatoren. Det tar fortsatt omtrent 5 RC sekunder for oss å komme "nær nok" til ønsket spenning.

Trinn 7: Få fra a til B, en smule litt raskere

Kom deg fra a til B, en smule litt raskere
Kom deg fra a til B, en smule litt raskere

Anta at vi har en kondensator som allerede er ladet opp til Va. Anta at vi bruker analogWrite () for å skrive ut den nye verdien av b. Hva er den minste tiden du må vente på at spenningen Vb oppnås?

Hvis du gjettet 5 RC sekunder, er det flott! Ved å vente 5 RC sekunder, vil kondensatoren bli ladet til nesten nesten Vb. Men hvis vi vil, kan vi faktisk vente litt mindre.

Se på ladningskurven. Du skjønner, kondensatoren var allerede på Va da vi begynte. Dette betyr at vi ikke trenger å vente tiden t_a. Vi måtte bare hvis vi lader kondensatoren fra null.

Så ved å ikke vente den gangen ser vi en forbedring. Tiden t_ab er faktisk litt kortere enn 5 RC.

Men vent, vi kan gjøre så mye bedre! Se på all den plassen over v_b. Det er forskjellen mellom Vcc, maksimal spenning tilgjengelig for oss, og Vb vi har tenkt å nå. Kan du se hvordan den ekstra spenningen kan hjelpe oss å komme dit vi ønsker å gå mye raskere?

Trinn 8: Kom deg fra a til B, med en turbolader

Kom deg fra a til B, med en turbolader!
Kom deg fra a til B, med en turbolader!

Det er riktig. I stedet for å bruke PWM ved målspenningen V_b, holder vi den på en jevn Vcc i mye, mye kortere tid. Jeg kaller dette Turbo Charger -metoden, og det får oss dit vi ønsker å gå veldig, veldig fort! Etter tidsforsinkelsen (som vi må beregne) slår vi på bremsene ved å bytte til PWM på V_b. Dette forhindrer at spenningen overskrider målet.

Med denne metoden er det mulig å endre spenningen i kondensatoren fra V_a til V_b på en brøkdel av tiden enn å bare bruke PWM. Slik får du plass, baby!

Trinn 9: Forstå koden

Forstå koden
Forstå koden

Et bilde er verdt tusen ord, så diagrammet viser dataene og operasjonene som utføres i koden. Fra venstre til høyre:

  • Grafikkdataene lagres i PROGMEM (det vil si flashminne) som en liste over punkter.
  • Enhver kombinasjon av oversettelses-, skalerings- og rotasjonsoperasjoner kombineres til en affin transformasjonsmatrise. Dette gjøres en gang i starten av hver animasjonsramme.
  • Poeng leses en etter en fra grafikkdata og multipliseres hver med den lagrede transformasjonsmatrisen.
  • De transformerte punktene mates gjennom en saksalgoritme som beskjærer alle punkter utenfor det synlige området.
  • Ved hjelp av en RC -forsinkelsestabell blir punktene konvertert til kjørespenninger og tidsforsinkelser. RC-forsinkelsesoppslagstabellen er lagret i EEPROM og kan brukes på nytt for flere kjøringer av koden. Ved oppstart kontrolleres oppslagstabellen for nøyaktighet og eventuelle feilverdier oppdateres. Bruken av EEPROM sparer verdifullt RAM -minne.
  • Drivspenningene og forsinkelsene skrives til den inaktive rammen i rammebufferen. Rammebufferen inneholder plass til en aktiv ramme og en inaktiv ramme. Når en fullstendig ramme er skrevet, blir den inaktive rammen aktiv.
  • En avbruddsrutine tegner bildet kontinuerlig ved å lese av spenningsverdier og forsinkelser fra den aktive rammebufferen. Basert på disse verdiene, justerer den driftssyklusene til utgangspinnene. Timer 1 brukes til å måle tidsforsinkelsen ned til noen få nanosekunder med presisjon, mens timer 2 brukes til å kontrollere pinsens driftssyklus.
  • Pinnen med den største endringen i spenning er alltid "turboladet" med en driftssyklus på null eller 100%, og gir den raskeste lade- eller utladningstiden. Pinnen med en mindre endring i spenning drives med en driftssyklus valgt for å matche overgangstiden til den første pinnen-denne gangen er matchingen viktig for å sikre at linjer trekkes rett på oscilloskopet.

Trinn 10: Med stor fart, kommer stort ansvar

Siden denne metoden er så mye raskere enn PWM, hvorfor bruker ikke analogWrite () den? Fordi det å bruke bare PWM er bra nok for de fleste programmer og er mye mer tilgivende. "Turbo Charger" -metoden krever imidlertid nøye koding og er bare egnet for spesifikke tilfeller:

  1. Det er ekstremt følsomt for timing. Når vi når målspenningsnivået, må drivpinnen umiddelbart byttes til vanlig PWM -modus for å unngå å overskride målspenningen.
  2. Det krever kunnskap om RC -konstanten, så disse verdiene må angis på forhånd. Med feil verdier blir timingen feil og spenningene feil. Med vanlig PWM er det en garanti for at du finner ut på riktig spenning etter en stund, selv om RC -konstanten ikke er kjent.
  3. Å beregne det nøyaktige tidsintervallet for lading av kondensatoren krever logaritmiske ligninger som er for trege for sanntidsberegning på Arduino. Disse må forhåndsberegnes før hver animasjonsramme og lagres i minnet et sted.
  4. Programmer som omhandler denne metoden må stride med at forsinkelsene er veldig ikke-lineære (de er faktisk eksponentielle). Målspenninger nær Vcc eller GND vil ta mange størrelsesordener lenger å nå enn spenninger nær midtpunktet.

For å overvinne disse begrensningene gjør min vektorgrafikkode følgende ting:

  1. Den bruker timer 1 på 16 kHz og en avbruddsrutine for presis utgående manipulering og timing.
  2. Det krever en spesifikk verdi av RC -tidskonstanten som skal brukes, og begrenser valgene av kondensator- og motstandsverdier.
  3. Den lagrer tidsforsinkelser for alle punktene i en animasjonsramme i en minnebuffer. Dette betyr at rutinen som beregner tidsforsinkelsene, går med en mye lavere hastighet enn avbruddsrutinen som oppdaterer utgangspinnene. En gitt ramme kan males flere titalls ganger før et nytt sett med forsinkelser for neste ramme er klart til bruk.
  4. Bruken av en minnebuffer setter en begrensning på antall punkter som kan trekkes per ramme. Jeg bruker en plasseffektiv koding for å få mest mulig ut av tilgjengelig RAM, men den er fortsatt begrenset til omtrent 150 poeng. Over hundre eller så poeng eller så, vil skjermen begynne å flimre uansett, så det er et poot poeng!

Anbefalt: