Innholdsfortegnelse:

Arduino Waveform Generator: 5 trinn (med bilder)
Arduino Waveform Generator: 5 trinn (med bilder)

Video: Arduino Waveform Generator: 5 trinn (med bilder)

Video: Arduino Waveform Generator: 5 trinn (med bilder)
Video: Amazing arduino project 2024, November
Anonim
Arduino bølgeformgenerator
Arduino bølgeformgenerator

Oppdatering fra februar 2021: sjekk den nye versjonen med 300x samplingshastigheten, basert på Raspberry Pi Pico

I laboratoriet trenger man ofte et repeterende signal med en viss frekvens, form og amplitude. Det kan være å teste en forsterker, sjekke ut en krets, en komponent eller en aktuator. Kraftige bølgeformgeneratorer er kommersielt tilgjengelige, men det er relativt enkelt å lage en nyttig selv med en Arduino Uno eller Arduino Nano, se for eksempel:

www.instructables.com/id/Arduino-Waveform-…

www.instructables.com/id/10-Resister-Ardui…

Her er beskrivelsen av en annen med følgende funksjoner:

* Nøyaktige bølgeformer: 8-biters utgang ved bruk av R2R DAC, 256-prøveform

* Rask: 381 kHz samplingsfrekvens

* Presis: 1mHz trinn frekvensområde. Like nøyaktig som Arduino -krystallet.

* Enkel betjening: bølgeform og frekvens kan stilles inn med én roterende encoder

* Stort spekter av amplituder: millivolt til 20V

* 20 forhåndsdefinerte bølgeformer. Enkelt å legge til flere.

* Enkel å lage: Arduino Uno eller Nano pluss standardkomponenter

Trinn 1: Tekniske hensyn

Gjør et analogt signal

En mangel på Arduino Uno og Nano er at den ikke har en digital-til-analog (DAC) -omformer, så det er ikke mulig å få den til å sende en analog spenning direkte på pinnene. En løsning er R2R -stigen: 8 digitale pinner er koblet til et motstandsnettverk slik at 256 utgangsnivåer kan nås. Gjennom direkte porttilgang kan Arduino sette 8 pins samtidig med en enkelt kommando. For motstandsnettverket trengs 9 motstander med verdi R og 8 med verdi 2R. Jeg brukte 10kOhm som en verdi for R, som holder strømmen fra pinnene til 0,5mA eller mindre. Jeg antar at R = 1kOhm også kan fungere, siden Arduino enkelt kan levere 5mA per pin, 40mA per port. Det er viktig at forholdet mellom R- og 2R -motstandene virkelig er 2. Det oppnås lettest ved å sette 2 motstander av verdi R i serie, for totalt 25 motstander.

Faseakkumulator

Å generere en bølgeform kommer deretter til å gjentatte ganger sende en sekvens med 8-bits tall til Arduino-pinnene. Bølgeformen er lagret i en matrise på 256 byte, og denne matrisen blir samplet og sendt til pinnene. Frekvensen til utgangssignalet bestemmes av hvor raskt en går videre gjennom matrisen. En robust, presis og elegant måte å gjøre det på er med en faseakkumulator: Et 32-biters tall blir inkrementert med jevne mellomrom, og vi bruker de 8 viktigste bitene som indeks for matrisen.

Rask prøvetaking

Avbrudd tillater prøvetaking på veldefinerte tidspunkter, men overhead av avbrudd begrenser samplingsfrekvensen til ~ 100 kHz. En uendelig sløyfe for å oppdatere fasen, prøve bølgeformen og sette pinnene tar 42 klokkesykluser, og dermed oppnå en samplingshastighet på 16MHz/42 = 381kHz. Hvis du roterer eller skyver på den roterende encoderen, forårsaker det en pinneendring og et avbrudd som kommer ut av sløyfen for å endre innstillingen (bølgeform eller frekvens). På dette stadiet blir 256 -tallene i rekken beregnet på nytt slik at ingen faktiske beregninger av bølgeformen trenger å utføres i hovedløkken. Den absolutt maksimale frekvensen som kan genereres er 190 kHz (halvparten av samplingshastigheten), men da er det bare to prøver per periode, så ikke mye kontroll over formen. Grensesnittet tillater dermed ikke å stille frekvensen over 100 kHz. Ved 50 kHz er det 7-8 sampler per periode, og ved 1,5 kHz og under alle 256 tall som er lagret i matrisen, blir det samplet hver periode. For bølgeformer der signalet endres jevnt, for eksempel sinusbølgen, er det ikke noe problem å hoppe over prøver. Men for bølgeformer med smale pigger, for eksempel en firkantbølge med en liten driftssyklus, er det fare for at en frekvens over 1,5 kHz mangler en enkelt prøve kan føre til at en bølgeform ikke oppfører seg som forventet

Nøyaktigheten av frekvensen

Antallet som fasen økes ved hver prøve er proporsjonal med frekvensen. Frekvensen kan dermed settes til en nøyaktighet på 381kHz/2^32 = 0,089mHz. I praksis er det neppe nødvendig med slik nøyaktighet, så grensesnittet begrenser for å stille frekvensen i trinn på 1mHz. Frekvensens absolutte presisjon bestemmes av presisjonen til Arduino -klokkefrekvensen. Dette avhenger av Arduino-typen, men de fleste angir en frekvens på 16.000 MHz, så en presisjon på ~ 10^-4. Koden gjør det mulig å endre forholdet mellom frekvensen og faseøkningen for å korrigere for små avvik fra 16MHz antagelsen.

Buffering og forsterkning

Motstandsnettverket har en høy utgangsimpedans, så utgangsspenningen faller raskt hvis en belastning er festet. Det kan løses ved å buffere eller forsterke utgangen. Her gjøres buffringen og forsterkningen med en opamp. Jeg brukte LM358 fordi jeg hadde noen. Det er en langsom opamp (svinghastighet 0,5V per mikrosekund), så ved høy frekvens og høy amplitude blir signalet forvrengt. En god ting er at den kan håndtere spenninger veldig nær 0V. Utgangsspenningen er imidlertid begrenset til ~ 2V under skinnen, så bruk av +5V effekt begrenser utgangsspenningen til 3V. Step-up moduler er kompakte og billige. Ved å mate +20V til opampen, kan den generere signaler med spenning på opptil 18V. (NB, skjemaet sier LTC3105 fordi det var det eneste trinnet jeg fant i Fritzing. I virkeligheten brukte jeg en MT3608-modul, se bilder i de neste trinnene). Jeg velger å bruke en variabel demping på utgangen til R2R DAC, og deretter bruke en av opampene for å buffre signalet uten forsterkning og den andre for å forsterke med 5,7, slik at signalet kan nå en maksimal utgang på ca 20V. Utgangsstrømmen er ganske begrenset, ~ 10mA, så en sterkere forsterker kan være nødvendig hvis signalet skal drive en stor høyttaler eller elektromagnet.

Trinn 2: Nødvendige komponenter

For kjernebølgeformgeneratoren

Arduino Uno eller Nano

16x2 LCD -skjerm + 20kOhm trimmer og 100Ohm serie motstand for bakgrunnsbelysning

5-pinners roterende encoder (med integrert trykknapp)

25 motstander på 10 kOhm

For bufferen/forsterkeren

LM358 eller annen dobbel opamp

oppgraderingsmodul basert på MT3608

50kOhm variabel motstand

10kOhm motstand

47kOhm motstand

1muF kondensator

Trinn 3: Konstruksjon

Konstruksjon
Konstruksjon
Konstruksjon
Konstruksjon

Jeg loddet alt på et 7x9cm prototypebrett, som vist på bildet. Siden det ble litt rotete med alle ledningene, prøvde jeg å farge ledningene som bærer positiv spenning rød og de som bærer bakken svart.

Koderen jeg brukte har 5 pinner, 3 på den ene siden, 2 på den andre siden. Siden med 3 pinner er den faktiske koderen, siden med 2 pinner er den integrerte trykknappen. På 3-pinners side skal den sentrale pinnen kobles til bakken, de to andre pinnene til D10 og D11. På 2-pinners side skal den ene pinnen kobles til bakken og den andre til D12.

Det er det styggeste jeg noen gang har laget, men det fungerer. Det ville være fint å sette inn et kabinett, men for øyeblikket rettferdiggjør ikke det ekstra arbeidet og kostnaden det. Nano og skjermen er festet med pin-headers. Jeg ville ikke gjort det igjen hvis jeg skulle bygge en ny. Jeg satte ikke kontakter på brettet for å hente signalene. I stedet plukker jeg dem opp med krokodilledninger fra utstående kobbertrådstykker, merket som følger:

R - råsignal fra R2R DAC

B - bufret signal

A - forsterket signal

T - tidssignal fra pin 9

G - bakken

+ - positiv "høy" spenning fra trinnmodulen

Trinn 4: Koden

Koden, en Arduino -skisse, er vedlagt og skal lastes opp til Arduino.

20 bølgeformer er forhåndsdefinert. Det bør være greit å legge til en annen bølge. Vær oppmerksom på at de tilfeldige bølgene fyller opp 256-verdi-matrisen med tilfeldige verdier, men det samme mønsteret blir gjentatt hver periode. Ekte tilfeldige signaler høres ut som støy, men denne bølgeformen høres mye mer ut som en fløyte.

Koden angir et 1 kHz signal på pin D9 med TIMER1. Dette er nyttig for å kontrollere tidspunktet for det analoge signalet. Det var slik jeg fant ut at antallet klokkesykluser er 42: Hvis jeg antar enten 41 eller 43, og genererer et 1 kHz signal, har det helt klart en annen frekvens enn signalet på pinne D9. Med verdien 42 matcher de perfekt.

Normalt avbryter Arduino hvert millisekund for å holde oversikt over tiden med millis () -funksjonen. Dette vil forstyrre den nøyaktige signalgenerering, så det spesielle avbruddet er deaktivert.

Kompilatoren sier: "Sketch bruker 7254 byte (23%) av programlagringsplass. Maksimum er 30720 byte. Globale variabler bruker 483 byte (23%) dynamisk minne, og etterlater 1565 byte for lokale variabler. Maksimum er 2048 byte." Så det er god plass til mer sofistikert kode. Vær oppmerksom på at du kanskje må velge "ATmega328P (gammel oppstartslaster)" for å laste opp til Nano.

Trinn 5: Bruk

Signalgeneratoren kan enkelt drives via mini-USB-kabelen til Arduino Nano. Det gjøres best med en powerbank, slik at det ikke er noen tilfeldig jordsløyfe med apparatet som den kan kobles til.

Når den er slått på, vil den generere en 100Hz sinusbølge. Ved å dreie knappen, kan en av de andre 20 bølgetypene velges. Ved å rotere mens du trykker på den, kan markøren settes til hvilken som helst av sifrene i frekvensen, som deretter kan endres til ønsket verdi.

Amplituden kan reguleres med potensiometeret, og enten det buffrede eller forsterkede signalet kan brukes.

Det er veldig nyttig å bruke et oscilloskop for å kontrollere signalamplituden, spesielt når signalet leverer strøm til en annen enhet. Hvis det trekkes for mye strøm, klipper signalet og signalet blir sterkt forvrengt

For svært lave frekvenser kan utgangen visualiseres med en LED i serie med en 10kOhm motstand. Lydfrekvenser kan høres med en høyttaler. Sørg for å stille signalet veldig lite ~ 0,5V, ellers blir strømmen for høy og signalet begynner å klippe.

Anbefalt: