Stap 5: Voorbeeld 3: DAC
Ik heb verbonden de output van de DAC tot een oscilloscoop. Als u begrijpen hoe moet te gebruiken/Lees de oscilloscoop check out deze tutorial. Ik laadde de volgende code op de Arduino:
//63Hz sine wave //by Amanda Ghassaei 2012
Mij troep opwaarts een timer-interrupt die stappen de variabele t met een frequentie van 40kHz. Zodra t 627 bereikt het herstelt terug naar nul (dit gebeurt met een frequentie van 40.000/628 = 63 Hz). Ondertussen in de hoofdlus stuurt de Arduino een waarde tussen 0 (00000000 binair) en 255 (11111111 binair) naar digitale pinnen 0 t/m 7 (PORTD). Het berekent deze waarde met de volgende vergelijking:
PORTD=byte(127+127*Sin(t/100));
Dus als t stappen van 0 naar 627 doorloopt de sinus-functie in een volledige cyclus. De waarde die wordt verzonden naar PORTD is een sinusgolf met 63Hz frequentie en amplitude 127, oscillerende ongeveer 127. Wanneer dit wordt verzonden via de ladder van de weerstand 8 bit DAC het uitgangen een oscillerende signaal ongeveer 2.5V met een amplitude van de 2.5V en de frequentie van 63 Hz.
De frequentie van de sinus kan worden verdubbeld door te vermenigvuldigen met de term (t/100) 2, verviervoudigd door te vermenigvuldigen met 4, enzovoort...
Merk ook op dat als u de frequentie van de timer onderbreken verhogen teveel door het verlagen van de prescaler of OCR2A de sinusgolf zal niet de uitgang correct. Dit is omdat de functie sin() computationeel duur is, en bij hoge interrupt frequenties deze hoeft niet genoeg tijd om uit te voeren. Als u hoge frequentie interrupts, in plaats van het uitvoeren van een berekening tijdens de interrupt routine, gezien het opslaan van waarden in een array en gewoon roepen deze waarden met behulp van een soort van index. U vindt een voorbeeld van dat in mijn arduino golfvorm generator-20.000 waarden van zonde door in te slaan een matrix, ik kon uitgang sinus golven met een sampling-frequentie van 100kHz.