Arduino ljud utgång (10 / 10 steg)
Steg 10: Extra Tips
Om du vill göra seriell kommunikation: Mjukvaran följetong är en Arduino bibliotek som låter dig att sätta någon av den Arduino pins till seriell stift. Vanligtvis när du gör en Arduino projekt som kräver seriell kommunikation, undvika du att använda digitala stift 0 och 1 eftersom de måste vara fri att skicka seriella data. Jag gillar att använda dem för 8 bitars DAC eftersom stift 0-7 är alla en del av PORTD på den Arduino Atmel328 chip, detta gör att jag kan ta itu med dem alla i en enda rad kod. PORTB har endast 6 pins (digital stift 8-13) och PORTC har endast 6 stift (analog stift 0-5), så du inte kan konstruera en 8 bitars DAC med portarna ensam.
Om du behöver använda PWM stift eller annars använda olika pins som DAC: Om du måste använda PWM stift kan du använda lite manipulation att frigöra stift 3, 5 och 6 och ersätta dem med stift 8, 12 och 13. Att du vill skicka antalet 36 till PORTD. Du kan använda följande rader:
definiera variabler:
boolean bit3state;
booleska bit5state;
booleska bit6state;
i din huvudsakliga loop():
bit3state = (36 & B00001000) >> 3; //get den tredje biten av 36
bit5state = (36 & B00100000) >> 5; //get den femte stycke 36
bit6state = (36 & B01000000) >> 6; //get den sjätte stycke 36
Skicka data till portd utan störa stift 3, 5 och 6
PORTD | = (36 & B10010111); //set kickben högt med antalet 36 med nollor ersätter bitar 3, 5 och 6
PORTD & = (36| B01101000); //set låg pins låg med antalet 36 med sådana ersätter bitar 3, 5 och 6
Skicka data till portb utan störa stift 9, 10 och 11
PORTB | = 0 | (bit3state) | (bit5state << 4) | (bit6state << 5), //set kickben
PORTB & = 255 & ~(1-bit3state) & ~((1-bit5state) << 4) & ~((1-bit6state) << 5), //set låg pins
se till att hålla dessa PORTD och PORTB rader bredvid varandra i koden, du stiften på port d och port b att växla på så nära som möjligt.
Här är koden från föregående steg, redigerad så att den inte använder några PWM stift. Som du ser i fig 1, har ofiltrerade utgången från DAC många avbrott orsakade av lag-gruppen mellan skickar data till port d och port b, samt dela upp kommandona för att ange stift högt och lågt. Du kan bli av med de flesta av dessa avbrott med lågpassfilter (fig 2). Om du vill använda den här tekniken kan du öka din lågpassfilter cutoff frekvens. Om du ville göra detta riktigt bra, du kan skicka din 5 mest signifikanta bitarna till port d och din 3 minst signifikanta bitarna till port b. Detta skulle minska amplituden av några av diskontinuiteter, att minska omfattningen av buller. Jag ska låta dig räkna att en ut på egen hand.
Sine ut, 40kHz samplingsfrekvens, utan med PWM stift
av Amanda Ghassaei
Sept 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.
*
*/
byte sine [] = {127, 134, 142, 150, 158, 166, 173, 181, 188, 195, 201, 207, 213, 219, 224, 229, 234, 238, 241, 245, 247, 250, 251, 252, 253, 254, 253, 252, 251, 250, 247, 245, 241, 238, 234, 229, 224, 219, 213, 207, 201, 195, 188, 181, 173, 166, 158, 150, 142, 134, 127, 119, 111, 103, 95, 87, 80, 72, 65 58, 52, 46, 40, 34, 29, 24, 19, 15, 12, 8, 6, 3, 2, 1, 0, 0, 0, 1, 2, 3, 6, 8, 12, 15, 19, 24, 29, 34, 40, 46, 52, 58, 65, 72, 80, 87, 95, 103, 111, 119,};
int t = 0; //time
booleska bit3state;
booleska bit5state;
booleska bit6state;
void setup() {
ställa in digital stift 0-13 som utgångar
för (int jag = 0; jag < 14; i ++) {
pinMode(i,OUTPUT);
}
(CLI); //disable avbrott
Set timer0 avbrott på 40kHz
TCCR0A = 0; / / Ställ in hela TCCR0A register till 0
TCCR0B = 0; / / samma för TCCR0B
TCNT0 = 0; //initialize värde till 0
Set jämför match registrera dig för 40khz steg
OCR0A = 49. / / = (16 * 10 ^ 6) / (40000 * 8) - 1 (måste vara < 256)
Aktivera CTC läge
TCCR0A | = (1 << WGM01);
Ange CS11 bit för 8 prescaler
TCCR0B | = (1 << CS11);
Aktivera timern jämför avbrott
TIMSK0 | = (1 << OCIE0A);
SEI (); //enable avbrott
}
ISR(TIMER0_COMPA_vect) {//40kHz avbrott rutin
bit3state = (sinus [t] & B00001000) >> 3; //get den tredje biten
bit5state = (sinus [t] & B00100000) >> 5; //get den femte stycke
bit6state = (sinus [t] & B01000000) >> 6; //get den sjätte stycke
PORTD | = (sinus [t] & B10010111); //set kickben hög
PORTD & = (sinus [t] | B01101000); //set låg pins låg
PORTB | = 0 | (bit3state) | (bit5state << 4) | (bit6state << 5), //set kickben
PORTB & = 255 & ~(1-bit3state) & ~((1-bit5state) << 4) & ~((1-bit6state) << 5), //set låg pins
PORTD = sine [t]; //send sinusvåg till DAC, centrerad kring (127/255) * 5 = 2.5V
t ++; //increment t
om (t > 99) {//reset t till noll
t = 0;
}
}
void loop() {
göra andra saker här
}
Om du kör ut från digitalt stift och behöver mer: Kom ihåg att du kan alltid använda din analoga pins som digitala I/O. prova ut följande funktioner, de fungerar precis som du har att göra med en vanlig digital pin.
digitalWrite (A0, hög), //set pin A0 hög
digitalWrite (A0, låg); //set pin A0 låg
digitalRead (A0); //read digital data från stift A0
Annars prova med hjälp av en multiplexer. Om du behöver mer digitala utgångar, kan 74HC595 du göra tre av Arduino's digital pins till 8 utgångar. Du kan även seriekoppla flera 595 s tillsammans för att skapa många fler utgångar stift. Du kan ställa in din hela DAC på en av dessa marker om du ville (även om det skulle ta några rader kod för att ta itu med det och kan sakta ner för mycket för högre samplingshastigheter dig). Arduino webbplats är ett bra ställe att börja lära sig om hur du använder 595.
Om du behöver mer digitala ingångar, kan 74HC165 eller CD4021B du göra tre av Arduino's digital pins till 8 ingångar. Igen, Arduino webbplats är ett bra ställe att börja lära sig använda dessa marker.
Om du vill använda info i detta Instructable med Mega eller andra styrelser: I detta Instructable talade jag enbart om Arduino Uno med Atmel328. Samma kod kommer att fungera bra på någon ombord med en Atmel328 eller Atmel168 chip på den. Du kan också använda samma idéer med en Mega. Du bör försöka att bifoga din DAC till hamnar som har 8 tillgängliga stift, så du kan hantera din DAC med en rad kod ("PORTD =") på Uno, den enda port som har 8 tillgängliga stift är port d.
bild visar att Mega har flera portar med 8 stift: portar a, b, c, och l är de självklara val. Om du inte bryr dig om slösa analoga stift du kunde också använda portar f eller k.