Arduino Timer avbryter (5 / 6 steg)
Steg 5: Exempel 3: DAC
Jag ansluten utdata från DAC upp till ett oscilloskop. Om du behöver hjälp att förstå hur man användning/läsa att oscilloskopet kolla denna tutorial. Jag laddade följande kod på Arduino:
63Hz sinusvåg
Amanda Ghassaei 2012
/*
* Detta program är fri programvara; Du kan vidaredistribuera det och/eller ändra
* det enligt villkoren i GNU General Public License som offentliggjorts av
* den Free Software Foundation; antingen version 3 av licensen, eller
* (på ditt alternativ) någon senare version.
*
*/
skickar 63Hz sinusvåg till arduino PORTD DAC
flyta t = 0;
void setup() {
Ange pin-port läge. se http://www.arduino.cc/en/Reference/PortManipulation för mer info
DDRD = 0xFF; //port d (digital stift 0-7) alla utgångar
(CLI); //stop avbrott
Set timer2 avbrott på 40kHz
TCCR2A = 0; / / Ställ in hela TCCR2A register till 0
TCCR2B = 0; / / samma för TCCR2B
TCNT2 = 0; //initialize värde till 0
Set jämför match registrera dig för 40khz steg
OCR2A = 49. / / = (16 * 10 ^ 6) / (8 * 40000) -1
Aktivera CTC läge
TCCR2A | = (1 << WGM21);
Ange CS21 bit för 8 prescaler
TCCR2B | = (1 << CS21);
Aktivera timern jämför avbrott
TIMSK2 | = (1 << OCIE2A);
SEI (); //allow avbrott
}
ISR(TIMER2_COMPA_vect) {
Increment t
t + = 1;
om (t == 628) {//40kHz/628 = ~ 63Hz
t = 0;
}
}
void loop() {
sinus våg av frekvens ~ 63Hz
Skicka till PORTD sine värden mellan 0 och 255
PORTD=byte(127+127*sin(t/100));
}
Jag ställa in en timer avbryta som ökar stegvis variabel t en frekvens på 40kHz. När t når 627 det återställs till noll (detta inträffar med en frekvens på 40 000/628 = 63 Hz). Under tiden i huvudloop skickar Arduino ett värde mellan 0 (00000000 i binär) och 255 (11111111 i binär) till digitala stift 0 till 7 (PORTD). Det beräknar detta värde med följande ekvation:
PORTD=byte(127+127*sin(t/100));
Så som t steg från 0 till 627 sinusfunktion rör sig genom en komplett cykel. Värdet som skickas till PORTD är en sinusvåg med 63Hz frekvens och amplitud 127, oscillerande cirka 127. När denna skickas genom 8 bit resistor stegen DAC det utgångar en oscillerande signal omkring 2.5V med en amplitud på 2.5V och frekvens 63 Hz.
Frekvensen av sinus våg kan fördubblas genom att multiplicera (t/100) benämna med 2, fyrdubblades genom att multiplicera med 4, och så vidare...
Också att märka att om du ökar frekvensen av timer avbrottet för mycket genom att minska den prescaler eller OCR2A sinus våg inte kommer ut korrekt. Detta beror på att funktionen sin() är computationally dyrt, och vid hög avbrott frekvenser det har inte tillräckligt med tid att utföra. Om du använder kickfrekvens avbrott, i stället för att utföra en beräkning under avbrott rutinen, med tanke på lagra värdena i en matris och helt enkelt kalla dessa värden med hjälp av någon form av index. Du kan hitta ett exempel på att i min arduino vågform generator-genom att lagra 20.000 värden av synd i en matris, jag kunde produktionen sinustoner med en samplingsfrekvens på 100kHz.