Stap 13: Firmware
Voor driehoek en zag ik de variabelen sawByte, triByte, sawInc en triInc gemaakt. Elke keer de frequentie veranderd ik berekend dat het bedrag dat de driehoek en zag functie zou hebben op Automatische toename, bij een sampling rate van 100kHz:
triInc = 511/periode;
Als (triInc == 0) {}
triInc = 1;
}
sawInc = 255/periode;
Als (sawInc == 0) {}
sawInc = 1;
}
vervolgens al het moest gebeuren in de interrupt routine was wat eenvoudige wiskunde:
geval 1: / / driehoek
if((period-t) > t);
Als (t == 0) {}
triByte = 0;
}
else {}
triByte += triInc;
}
}
else {}
triByte-= triInc;
}
Als (triByte > 255) {}
triByte = 255;
}
else if (triByte < 0) {}
triByte = 0;
}
Golf = triByte;
breken;
geval 2: / / zagen
Als (t = 0) {}
sawByte = 0;
}
else {}
sawByte += sawInc;
}
Golf = sawByte;
breken;
Voor de functie van de sinus schreef ik een eenvoudige python script dat uitgangen van 20000 waarden van 127+127sin(x) voor een volledige cyclus:
importeren van math
voor x in bereik (0, 20000):
afdrukken van str(int(127+127*math.sin(2*math.pi*x*0.00005)),)+str(","),
Ik deze array opgeslagen in het geheugen van de Arduino genaamd [sine20000] en herinnert aan de waarden die ik nodig had om het verzenden van de DAC. Dit is veel sneller dan de berekening van de waarden afzonderlijk.