Inhoudsopgave:

Arduino-golfvormgenerator: 5 stappen (met afbeeldingen)
Arduino-golfvormgenerator: 5 stappen (met afbeeldingen)

Video: Arduino-golfvormgenerator: 5 stappen (met afbeeldingen)

Video: Arduino-golfvormgenerator: 5 stappen (met afbeeldingen)
Video: Output DC or AC Voltage using MCP4725 DAC with LCD and PWM to Voltage Converter with Arduino 2024, Juli-
Anonim
Arduino golfvormgenerator
Arduino golfvormgenerator

Update februari 2021: bekijk de nieuwe versie met 300x de bemonsteringsfrequentie, gebaseerd op de Raspberry Pi Pico

In het lab heb je vaak een repetitief signaal nodig van een bepaalde frequentie, vorm en amplitude. Het kan zijn om een versterker te testen, een circuit, een component of een actuator te bekijken. Krachtige golfvormgeneratoren zijn in de handel verkrijgbaar, maar het is relatief eenvoudig om zelf een bruikbare te maken met een Arduino Uno of Arduino Nano, zie bijvoorbeeld:

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

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

Hier is de beschrijving van een andere met de volgende kenmerken:

* Nauwkeurige golfvormen: 8-bits uitvoer met R2R DAC, 256-samplevorm

* Snel: 381 kHz bemonsteringsfrequentie

* Nauwkeurig: frequentiebereik in stappen van 1 mHz. Zo nauwkeurig als het Arduino-kristal.

* Eenvoudige bediening: golfvorm en frequentie instelbaar met enkele roterende encoder

* Breed scala aan amplitudes: millivolt tot 20V

* 20 vooraf gedefinieerde golfvormen. Eenvoudig om meer toe te voegen.

* Eenvoudig te maken: Arduino Uno of Nano plus standaard componenten

Stap 1: Technische overwegingen

Een analoog signaal maken

Een tekortkoming van de Arduino Uno en Nano is dat deze geen digitaal-naar-analoog (DAC)-converter heeft, waardoor het niet mogelijk is om een analoge spanning rechtstreeks op de pinnen uit te voeren. Een oplossing is de R2R-ladder: 8 digitale pinnen zijn verbonden met een weerstandsnetwerk zodat 256 outputniveaus kunnen worden bereikt. Door directe poorttoegang kan de Arduino 8 pinnen tegelijk instellen met een enkele opdracht. Voor het weerstandsnetwerk zijn 9 weerstanden met waarde R nodig en 8 met waarde 2R. Ik gebruikte 10kOhm als een waarde voor R, die de stroom van de pinnen op 0,5mA of minder houdt. Ik denk dat R=1kOhm ook zou kunnen werken, aangezien de Arduino gemakkelijk 5mA per pin, 40mA per poort kan leveren. Het is belangrijk dat de verhouding tussen de R- en de 2R-weerstanden echt 2 is. Dat bereik je het gemakkelijkst door 2 weerstanden met de waarde R in serie te zetten, dus in totaal 25 weerstanden.

Fase accumulator

Het genereren van een golfvorm komt dan neer op het herhaaldelijk verzenden van een reeks 8-bits getallen naar de Arduino-pinnen. De golfvorm wordt opgeslagen in een array van 256 bytes en deze array wordt gesampled en naar de pinnen gestuurd. De frequentie van het uitgangssignaal wordt bepaald door hoe snel men door de array gaat. Een robuuste, nauwkeurige en elegante manier om dat te doen is met een faseaccumulator: een 32-bits getal wordt met regelmatige tussenpozen verhoogd en we gebruiken de 8 meest significante bits als de index van de array.

Snelle bemonstering

Interrupts maken het mogelijk om op goed gedefinieerde tijden te samplen, maar de overhead van interrupts beperkt de bemonsteringsfrequentie tot ~ 100 kHz. Een oneindige lus om de fase bij te werken, de golfvorm te bemonsteren en de pinnen in te stellen, duurt 42 klokcycli, waardoor een bemonsteringsfrequentie van 16 MHz/42 = 381 kHz wordt bereikt. Het draaien of indrukken van de roterende encoder veroorzaakt een pinverandering en een onderbreking die uit de lus komt om de instelling (golfvorm of frequentie) te wijzigen. In dit stadium worden de 256 getallen in de array opnieuw berekend, zodat er geen werkelijke berekeningen van de golfvorm in de hoofdlus hoeven te worden uitgevoerd. De absolute maximale frequentie die kan worden gegenereerd is 190 kHz (de helft van de bemonsteringsfrequentie) maar dan zijn er slechts twee monsters per periode, dus niet veel controle over de vorm. De interface staat het dus niet toe om de frequentie boven 100kHz in te stellen. Bij 50 kHz zijn er 7-8 samples per periode en bij 1.5 kHz en lager worden alle 256 nummers die in de array zijn opgeslagen elke periode gesampled. Voor golfvormen waarbij het signaal vloeiend verandert, bijvoorbeeld de sinusgolf, is het overslaan van samples geen probleem. Maar voor golfvormen met smalle pieken, bijvoorbeeld een blokgolf met een kleine werkcyclus, bestaat het gevaar dat voor frequenties boven 1,5 kHz het ontbreken van een enkel monster ertoe kan leiden dat de golfvorm zich niet gedraagt zoals verwacht

Nauwkeurigheid van de frequentie:

Het aantal waarmee de fase bij elk monster wordt verhoogd, is evenredig met de frequentie. De frequentie kan dus worden ingesteld op een nauwkeurigheid van 381kHz/2^32=0.089mHz. In de praktijk is een dergelijke nauwkeurigheid bijna nooit nodig, dus de interface beperkt zich tot het instellen van de frequentie in stappen van 1 mHz. De absolute precisie van de frequentie wordt bepaald door de precisie van de Arduino-klokfrequentie. Dit hangt af van het Arduino-type, maar de meeste specificeren een frequentie van 16.000MHz, dus een precisie van ~10^-4. De code maakt het mogelijk om de verhouding van de frequentie en de faseverhoging te wijzigen om kleine afwijkingen van de 16MHz-aanname te corrigeren.

Buffering en versterking

Het weerstandsnetwerk heeft een hoge uitgangsimpedantie, zodat de uitgangsspanning snel daalt als er een belasting wordt aangesloten. Dat kan worden opgelost door de output te bufferen of te versterken. Hier wordt het bufferen en versterken gedaan met een opamp. Ik gebruikte de LM358 omdat ik er een paar had. Het is een langzame opamp (slew rate 0,5V per microseconde), dus bij hoge frequentie en hoge amplitude wordt het signaal vervormd. Een goede zaak is dat het spanningen aankan die heel dicht bij 0V liggen. De uitgangsspanning is echter beperkt tot ~2V onder de rail, dus het gebruik van +5V stroom beperkt de uitgangsspanning tot 3V. Step-up modules zijn compact en goedkoop. Door +20V naar de opamp te voeren, kan deze signalen genereren met een spanning tot 18V. (NB, het schema zegt LTC3105 want dat was de enige opstap die ik vond in Fritzing. In werkelijkheid gebruikte ik een MT3608 module, zie foto's in de volgende stappen). Ik kies ervoor om een variabele demping toe te passen op de uitgang van de R2R DAC en gebruik dan een van de opamps om het signaal te bufferen zonder versterking en de andere om te versterken met 5,7, zodat het signaal een maximale output van ongeveer 20V kan bereiken. De uitgangsstroom is vrij beperkt, ~10mA, dus een sterkere versterker kan nodig zijn als het signaal een grote luidspreker of elektromagneet moet aansturen.

Stap 2: Vereiste componenten

Voor de kerngolfvormgenerator:

Arduino Uno of Nano

16x2 LCD-scherm + 20kOhm trimmer en 100Ohm serieweerstand voor achtergrondverlichting

5-polige draai-encoder (met geïntegreerde drukknop)

25 weerstanden van 10kOhm

Voor de buffer/versterker

LM358 of andere dubbele opamp

opstapmodule gebaseerd op de MT3608

50kOhm variabele weerstand

10kOhm weerstand

47kOhm weerstand

1muF condensator

Stap 3: constructie

Bouw
Bouw
Bouw
Bouw

Ik heb alles op een prototypebord van 7x9cm gesoldeerd, zoals op de afbeelding te zien is. Omdat het een beetje rommelig werd met alle draden, heb ik geprobeerd de draden met positieve spanning rood te kleuren en die met aarde zwart.

De encoder die ik heb gebruikt heeft 5 pinnen, 3 aan de ene kant, 2 aan de andere kant. De kant met 3 pinnen is de eigenlijke encoder, de kant met 2 pinnen is de geïntegreerde drukknop. Aan de 3-pins kant moet de centrale pin worden aangesloten op massa, de andere twee pinnen op D10 en D11. Aan de 2-pins kant moet één pin worden aangesloten op aarde en de andere op D12.

Het is het lelijkste dat ik ooit heb gemaakt, maar het werkt. Het zou leuk zijn om een behuizing te plaatsen, maar voorlopig rechtvaardigen het extra werk en de kosten dit niet echt. De Nano en het display zijn bevestigd met pin-headers. Ik zou dat niet nog een keer doen als ik een nieuwe zou bouwen. Ik heb geen connectoren op het bord geplaatst om de signalen op te vangen. In plaats daarvan pak ik ze op met krokodillendraden van uitstekende stukken koperdraad, als volgt gelabeld:

R - onbewerkt signaal van de R2R DAC

B - gebufferd signaal

A - versterkt signaal

T - timersignaal van pin 9

G - grond

+ - positieve 'hoge' spanning van de step-up module

Stap 4: De code

De code, een Arduino-schets, is bijgevoegd en moet naar de Arduino worden geüpload.

20 golfvormen zijn vooraf gedefinieerd. Het zou eenvoudig moeten zijn om een andere golf toe te voegen. Merk op dat de willekeurige golven de array met 256 waarden vullen met willekeurige waarden, maar hetzelfde patroon wordt elke periode herhaald. Echte willekeurige signalen klinken als ruis, maar deze golfvorm klinkt veel meer als een fluitje.

De code zet een 1kHz signaal op pin D9 met TIMER1. Dit is handig om de timing van het analoge signaal te controleren. Zo kwam ik erachter dat het aantal klokcycli 42 is: als ik uitgaat van 41 of 43 en een signaal van 1 kHz genereer, heeft het duidelijk een andere frequentie dan het signaal op pin D9. Met de waarde 42 passen ze perfect bij elkaar.

Normaal gesproken onderbreekt de Arduino elke milliseconde om de tijd bij te houden met de millis()-functie. Dit zou de nauwkeurige signaalgeneratie verstoren, zodat de specifieke onderbreking wordt uitgeschakeld.

De compiler zegt: "Sketch gebruikt 7254 bytes (23%) aan programma-opslagruimte. Het maximum is 30720 bytes. Globale variabelen gebruiken 483 bytes (23%) dynamisch geheugen, waardoor er 1565 bytes overblijven voor lokale variabelen. Het maximum is 2048 bytes." Er is dus voldoende ruimte voor meer geavanceerde code. Pas op dat u mogelijk "ATmega328P (oude bootloader)" moet kiezen om succesvol te uploaden naar de Nano.

Stap 5: Gebruik:

De signaalgenerator kan eenvoudig worden gevoed via de mini-USB-kabel van de Arduino Nano. Het kan het beste worden gedaan met een powerbank, zodat er geen onbedoelde aardlus is met het apparaat waarmee het kan worden verbonden.

Wanneer ingeschakeld, genereert het een sinusgolf van 100 Hz. Door aan de knop te draaien, kan een van de andere 20 golftypes worden gekozen. Door te draaien terwijl u erop drukt, kan de cursor worden ingesteld op een van de cijfers van de frequentie, die vervolgens kan worden gewijzigd in de gewenste waarde.

De amplitude kan worden geregeld met de potentiometer en het gebufferde of het versterkte signaal kan worden gebruikt.

Het is erg handig om een oscilloscoop te gebruiken om de signaalamplitude te controleren, vooral wanneer het signaal stroom levert aan een ander apparaat. Als er te veel stroom wordt getrokken, wordt het signaal afgekapt en wordt het signaal sterk vervormd

Voor zeer lage frequenties kan de output worden gevisualiseerd met een LED in serie met een weerstand van 10kOhm. Audiofrequenties kunnen worden gehoord met een luidspreker. Zorg ervoor dat het signaal erg klein is ~ 0,5V, anders wordt de stroom te hoog en begint het signaal te clippen.

Aanbevolen: