Skalor på Arduino med en SPI 12 bitars Dac (1 / 2 steg)
Steg 1: Skalor på arduino ljud sköld
Första ladda ner och kompilera koden
/ * freqout (freq, t)
Freq i hz, t i ms
en enkel tonen generation funktion
genererar fyrkantsvågor av godtycklig frekvens och varaktighet
programmet innehåller också en topp-octave tabell & införlivande uppslagsfunktion
*/
#include
#define LDAC 8
#define ChipSel 9
använda makron för pin-koder är bättre än att använda en variabel -BM
Fara kommer Robinson!
/****************************
*****************************
Denna kod fungerar endast med
Arduino styrelser med ATMega
328 eller 168 processorer!
Ex: Uno, Nano, Pro Mini. -BM
*****************************
****************************/
void DACWrite (uint16_t);
int ptime;
int k x, dur, freq, t;
int i, j.
flyta ps;
variabel för pow pitchShift rutin
float noteval;
notvärden för två octave skala
dividera dem med befogenheter av två att generera andra oktaver
flyta A = 14080;
flötet som = 14917.2;
float B = 15804.3;
float C = 16744;
flyta CS = 17739.7;
flyta D = 18794.5;
flyta DS = 19912.1;
flöte E = 21096.2;
flyta F = 22350.6;
flyta FS = 23679.6;
float G = 25087.7;
flyta GS = 26579.5;
flyta AA2 = 28160;
flyta A2S = 29834.5;
flyta B2 = 31608.5;
flyta C2 = 33488.1;
flyta C2S = 35479.4;
flyta D2 = 37589.1;
flyta D2S = 39824.3;
flyta E2 = 42192.3;
flyta F2 = 44701.2;
flyta F2S = 47359.3;
flyta G2 = 50175.4;
flyta G2S = 53159;
flyta AA3 = 56320;
oktaver - motsvarar piano oktaver
flyta oct8 = 4;
flyta oct7 = 8;
flyta oct6 = 16.
flyta oct5 = 32.
flyta oct4 = 64;
flyta oct3 = 128;
flyta oct2 = 256;
flyta oct1 = 512;
flyta oct0 = 1024;
rytm värden
int wh = 1024;
int h = 512;
int dq = 448;
int q = 256;
int qt = 170;
int de = 192;
int e = 128;
int et = 85.
int dsx = 96.
int sx = 64;
int thx = 32.
stor skala bara för demo, hacka detta
flyta majScale [] = {A, B, CS, D, E, FS, GS, AA2,
B2, C2S, D2, E2, F2S, G2S, AA3
};
void setup() {
pinMode (ChipSel, OUTPUT); Anger den digitala pin som utdata
pinMode (LDAC, OUTPUT);
SPI.begin();
PORTB | = 0b00000011;
ställa in chip select och LDAC till standard hög state - BM
Serial.BEGIN(115200);
}
void loop() {
för (jag = 0; jag < = 11; i ++) {
PS = (float) jag / 12;
Välj nytt transponera intervall varje slinga
för (x = 0; x < = 15; x ++) {
noteval = (majScale [x] / oct4) * pow (2, ps).
införliva skala upp 12 toner
Pow funktionen genererar införlivande
eliminera "* pow(2,ps)" att skära ut transponera rutin
dur = 100;
freqout ((int) noteval, dur);
Delay(10);
}
}
}
void DACWrite (uint16_t outbuf) {
outbuf | = 0b0111000000000000; ändra vissa bitar i början för att konfigurera DAC
char * w_bytes;
w_bytes = (char *) & outbuf; delas upp i två byte i outbuf i en matris
PORTB & = 0b11111101; pull chip Välj låg
SPI.transfer (w_bytes [1]); Skicka dem en i taget
SPI.transfer (w_bytes [0]);
PORTB | = 0b00000010; pull chip Välj hög
PORTB & = 0b11111110; dra LDAC låg
ASM volatile("nop"); vänta en klockcykel
PORTB | = 0b00000001; dra LDAC hög
}
Freq i hz, t i ms
void freqout (int freq, int t) {
int hperiod;
beräkna 1/2 period i oss
långa cykler, i.
hperiod = (500000 / freq) - 7;
subtrahera 7 US att kompensera för digitalWrite overhead
cykler = ((långa) freq * (långa) t) / 1000;
beräkna cykler
Serial.Print(freq);
Serial.Print((Char)9);
ASCII 9 är fliken - du måste tvinga det till en röding att arbeta
Serial.Print(hperiod);
Serial.Print((Char)9);
Serial.println(Cycles);
spela för t ms
för (jag = 0; jag < = cykler; i ++) {
DACWrite (4095);
Skicka max värde till DAC--motsvarar logic hög - BM
delayMicroseconds(hperiod);
DACWrite (0);
Skicka 0 till DAC--motsvarar logik låg - BM
delayMicroseconds(hperiod);
-1 till att kompensera för digitaWrite overhead
bort - PORT är mycket snabbare - BM
}
}