Indholdsfortegnelse:

Arduino Waveform Generator: 5 trin (med billeder)
Arduino Waveform Generator: 5 trin (med billeder)

Video: Arduino Waveform Generator: 5 trin (med billeder)

Video: Arduino Waveform Generator: 5 trin (med billeder)
Video: Low Cost DYI Dual Sine Wave generator 2024, November
Anonim
Arduino Waveform Generator
Arduino Waveform Generator

Opdatering fra februar 2021: tjek den nye version med 300x samplingshastigheden, baseret på Raspberry Pi Pico

I laboratoriet har man ofte brug for et gentaget signal med en bestemt frekvens, form og amplitude. Det kan være at teste en forstærker, tjekke et kredsløb, en komponent eller en aktuator. Kraftfulde bølgeformgeneratorer fås kommercielt, men det er relativt let at lave en nyttig selv med en Arduino Uno eller Arduino Nano, se f.eks.:

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

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

Her er beskrivelsen af en anden med følgende funktioner:

* Nøjagtige bølgeformer: 8-bit output ved hjælp af R2R DAC, 256-sample form

* Hurtig: 381 kHz samplingshastighed

* Præcis: 1mHz trin frekvensområde. Lige præcis som Arduino -krystallen.

* Let betjening: bølgeform og frekvens kan indstilles med en enkelt roterende encoder

* Bredt spektrum af amplituder: millivolt til 20V

* 20 foruddefinerede bølgeformer. Lige at tilføje mere.

* Let at lave: Arduino Uno eller Nano plus standardkomponenter

Trin 1: Tekniske overvejelser

Fremstilling af et analogt signal

En mangel ved Arduino Uno og Nano er, at den ikke har en digital-til-analog (DAC) -omformer, så det er ikke muligt at få den til at sende en analog spænding direkte på benene. En løsning er R2R -stigen: 8 digitale stifter er forbundet til et modstandsnetværk, så 256 outputniveauer kan nås. Gennem direkte portadgang kan Arduino indstille 8 ben samtidigt med en enkelt kommando. Til modstandsnettet kræves 9 modstande med værdi R og 8 med værdi 2R. Jeg brugte 10kOhm som en værdi for R, der holder strømmen fra benene til 0,5mA eller mindre. Jeg gætter på, at R = 1kOhm også kunne fungere, da Arduino let kan levere 5mA pr. Pin, 40mA pr. Port. Det er vigtigt, at forholdet mellem R- og 2R -modstandene virkelig er 2. Det opnås lettest ved at sætte 2 modstande af værdi R i serie for i alt 25 modstande.

Faseakkumulator

At generere en bølgeform kommer derefter til at gentagne gange sende en sekvens med 8-bit tal til Arduino-benene. Bølgeformen gemmes i en matrix på 256 bytes, og denne matrix samples og sendes til benene. Udgangssignalets frekvens bestemmes af, hvor hurtigt man går frem gennem arrayet. En robust, præcis og elegant måde at gøre det på er med en faseakkumulator: Et 32-bit tal øges med jævne mellemrum, og vi bruger de 8 mest betydningsfulde bits som indeks for arrayet.

Hurtig prøveudtagning

Afbrydelser tillader prøve på veldefinerede tidspunkter, men overhead af afbrydelser begrænser samplingsfrekvensen til ~ 100 kHz. En uendelig sløjfe for at opdatere fasen, prøve bølgeformen og indstille benene tager 42 urcyklusser og dermed opnå en samplingshastighed på 16MHz/42 = 381kHz. Drejning eller skubbning af den roterende encoder forårsager en nålskift og en afbrydelse, der kommer ud af sløjfen for at ændre indstillingen (bølgeform eller frekvens). På dette trin genberegnes 256 -tallene i arrayet, så der ikke skal udføres faktiske beregninger af bølgeformen i hovedsløjfen. Den absolutte maksimale frekvens, der kan genereres, er 190 kHz (halvdelen af samplingshastigheden), men så er der kun to prøver pr. Periode, så ikke meget kontrol over formen. Interfacet tillader således ikke at indstille frekvensen over 100 kHz. Ved 50 kHz er der 7-8 prøver pr. Periode og ved 1,5 kHz og under alle 256 numre, der er gemt i arrayet, bliver der udtaget prøver hver periode. For bølgeformer, hvor signalet ændres jævnt, for eksempel sinusbølgen, er springning af prøver ikke noget problem. Men for bølgeformer med smalle pigge, for eksempel en firkantbølge med en lille driftscyklus, er der fare for, at en frekvens over 1,5 kHz mangler en enkelt prøve kan resultere i, at en bølgeform ikke opfører sig som forventet

Frekvensens nøjagtighed

Antallet, hvormed fasen øges ved hver prøve, er proportional med frekvensen. Frekvensen kan således indstilles til en nøjagtighed på 381kHz/2^32 = 0,089mHz. I praksis er en sådan nøjagtighed næsten aldrig nødvendig, så grænsefladen grænser for at indstille frekvensen i trin på 1mHz. Frekvensens absolutte præcision bestemmes af præcisionen af Arduino -urfrekvensen. Dette afhænger af Arduino-typen, men de fleste angiver en frekvens på 16.000MHz, så en præcision på ~ 10^-4. Koden gør det muligt at ændre forholdet mellem frekvensen og fasestigning for at korrigere for små afvigelser af 16MHz antagelsen.

Buffering og forstærkning

Modstandsnetværket har en høj udgangsimpedans, så dens udgangsspænding falder hurtigt, hvis der tilsluttes en belastning. Det kan løses ved at buffere eller forstærke output. Her udføres buffering og forstærkning med en opamp. Jeg brugte LM358, fordi jeg havde nogle. Det er en langsom opamp (svinghastighed 0,5V pr. Mikrosekund), så ved høj frekvens og høj amplitude bliver signalet forvrænget. En god ting er, at den kan klare spændinger meget tæt på 0V. Udgangsspændingen er dog begrænset til ~ 2V under skinnen, så brug af +5V effekt begrænser udgangsspændingen til 3V. Step-up moduler er kompakte og billige. Foder +20V til opampen, den kan generere signaler med spænding op til 18V. (NB, skematikken siger LTC3105, fordi det var det eneste trin-up, jeg fandt i Fritzing. I virkeligheden brugte jeg et MT3608-modul, se billeder i de næste trin). Jeg vælger at anvende en variabel dæmpning på output fra R2R DAC og derefter bruge en af opampene til at buffer signalet uden forstærkning og den anden til at forstærke med 5,7, så signalet kan nå en maksimal output på omkring 20V. Udgangsstrømmen er temmelig begrænset, ~ 10mA, så en stærkere forstærker kan være nødvendig, hvis signalet skal drive en stor højttaler eller elektromagnet.

Trin 2: Påkrævede komponenter

Til kernebølgeformgeneratoren

Arduino Uno eller Nano

16x2 LCD display + 20kOhm trimmer og 100Ohm serie modstand til baggrundsbelysning

5-benet roterende encoder (med integreret trykknap)

25 modstande på 10 kOhm

Til bufferen/forstærkeren

LM358 eller anden dobbelt opamp

step-up modul baseret på MT3608

50kOhm variabel modstand

10kOhm modstand

47kOhm modstand

1muF kondensator

Trin 3: Konstruktion

Konstruktion
Konstruktion
Konstruktion
Konstruktion

Jeg loddet alt på et 7x9cm prototype bord, som vist på billedet. Da det blev lidt rodet med alle ledninger, forsøgte jeg at farve ledningerne, der bærer positiv spænding rød, og dem, der bærer jorden sort.

Den encoder jeg brugte har 5 ben, 3 på den ene side, 2 på den anden side. Siden med 3 ben er den egentlige encoder, siden med 2 ben er den integrerede trykknap. På den 3-polede side skal den centrale stift forbindes til jorden, de to andre ben til D10 og D11. På den 2-polede side skal den ene pin tilsluttes jorden og den anden til D12.

Det er det grimmeste jeg nogensinde har lavet, men det virker. Det ville være rart at sætte i et kabinet, men for nu berettiger det ekstra arbejde og omkostninger det ikke rigtigt. Nano og displayet er fastgjort med pin-headers. Jeg ville ikke gøre det igen, hvis jeg ville bygge en ny. Jeg lagde ikke stik på tavlen for at opfange signalerne. I stedet henter jeg dem med krokodilledninger fra fremspringende stykker kobbertråd, mærket som følger:

R - råsignal fra R2R DAC

B - bufret signal

A - forstærket signal

T - timersignal fra pin 9

G - jorden

+ - positiv 'høj' spænding fra trinmodulet

Trin 4: Koden

Koden, en Arduino -skitse, er vedhæftet og skal uploades til Arduino.

20 bølgeformer er foruddefineret. Det skal være ligetil at tilføje enhver anden bølge. Bemærk, at de tilfældige bølger fylder 256-værdis arrayet med tilfældige værdier, men det samme mønster gentages hver periode. Ægte tilfældige signaler lyder som støj, men denne bølgeform lyder meget mere som en fløjte.

Koden angiver et 1 kHz signal på pin D9 med TIMER1. Dette er nyttigt for at kontrollere timingen af det analoge signal. Sådan fandt jeg ud af, at antallet af urcyklusser er 42: Hvis jeg antager enten 41 eller 43 og genererer et 1 kHz signal, har det klart en anden frekvens end signalet på pin D9. Med værdien 42 matcher de perfekt.

Normalt afbryder Arduino hvert millisekund for at holde styr på tiden med millis () -funktionen. Dette ville forstyrre den nøjagtige signalgenerering, så den særlige afbrydelse er deaktiveret.

Kompilatoren siger: "Sketch bruger 7254 bytes (23%) af programlagerplads. Maksimum er 30720 bytes. Globale variabler bruger 483 bytes (23%) dynamisk hukommelse, hvilket efterlader 1565 bytes til lokale variabler. Maksimum er 2048 bytes." Så der er rigelig plads til mere sofistikeret kode. Pas på, at du muligvis skal vælge "ATmega328P (gammel bootloader)" for at uploade med succes til Nano.

Trin 5: Brug

Signalgeneratoren kan simpelthen drives via mini-USB-kablet på Arduino Nano. Det gøres bedst med en powerbank, så der ikke er en utilsigtet jordsløjfe med apparatet, som den kan tilsluttes.

Når den er tændt, vil den generere en 100Hz sinusbølge. Ved at dreje knappen kan en af de andre 20 bølgetyper vælges. Ved at rotere mens du skubber, kan markøren indstilles til et hvilket som helst af frekvensens cifre, som derefter kan ændres til den ønskede værdi.

Amplituden kan reguleres med potentiometeret, og enten det bufrede eller det forstærkede signal kan bruges.

Det er virkelig nyttigt at bruge et oscilloskop til at kontrollere signalamplituden, især når signalet leverer strøm til en anden enhed. Hvis der trækkes for meget strøm, klipper signalet, og signalet forvrænges kraftigt

For meget lave frekvenser kan output visualiseres med en LED i serie med en 10kOhm modstand. Lydfrekvenser kan høres med en højttaler. Sørg for at indstille signalet meget lille ~ 0,5V, ellers bliver strømmen for høj, og signalet begynder at klippe.

Anbefalede: