Arduino vågform Generator sköld (13 / 15 steg)
Steg 13: Firmware
För triangel och såg skapat jag den variablerna sawByte, triByte, sawInc och triInc. Varje gång frekvensen ändras jag beräknade beloppet som funktionen triangel och såg skulle ha att tillväxten på en samplingsfrekvens på 100kHz:
triInc = 511/period.
om (triInc == 0) {
triInc = 1;
}
sawInc = 255/period.
om (sawInc == 0) {
sawInc = 1;
}
då alla de behövs göras i rutinen avbrott var några enkla matematiska:
fall 1: / / triangel
IF((period-t) > t);
om (t == 0) {
triByte = 0;
}
annat {
triByte += triInc;
}
}
annat {
triByte-= triInc;
}
om (triByte > 255) {
triByte = 255;
}
annars om (triByte < 0) {
triByte = 0;
}
Wave = triByte;
bryta;
fall 2: / / såg
om (t = 0) {
sawByte = 0;
}
annat {
sawByte += sawInc;
}
Wave = sawByte;
bryta;
För funktionen sinus skrev jag en enkel python skript som utgångar 20000 värden för 127+127sin(x) för en komplett cykel:
importera matematik
x i rad (0, 20000):
skriva ut str(int(127+127*math.sin(2*math.pi*x*0.00005)),)+str(","),
I lagras denna matris i den Arduino minne som kallas sine20000 [] och påminde om de värden som jag behövde för att skicka till DAC. Detta är mycket snabbare än beräkna värden individuellt.