Étape 4: Sortie Audio stéréo avec 8 Bit DAC et fréquence d’échantillonnage de 44,1 kHz
Dans ce code, je vous envoie un signal sinusoïdal sur DACA et une vague de scie sur DACB en même temps et à une vitesse de 44,1 kHz. Il s’agit d’audio stéréo, deux canaux audio distincts. Pour que cela fonctionne, j’ai combiné sine éléments et vu code mono à la dernière étape et les tiges de WR et DACA/DACB permettant de basculer entre les deux sorties DAC.
J’ai créé une interruption comme dans la dernière étape, mais cette fois j’ai mis en place à raison de 2 * 44,1 = 88,2 kHz. Puis chaque fois que l’interruption exécutée, j’ai alterné entre envoyer quelque chose à DACA et DACB, donc chacun a reçu un échantillon au cours de toute autre interruption. Ce qui rend la fréquence d’échantillonnage à la fois de la sorties de 44,1 kHz. Le contenu de la routine d’interruption est copié ci-dessous :
digitalWrite (WR, HIGH); //hold sorties-donc de nouvelles données DAC ne pas obtenir envoyées jusqu'à ce que nous sommes prêts
Si {(canal)
PORTD = sine [index]; //send sine à broches numériques 0-7
digitalWrite (outputSelector, LOW); //select DACA
index ++; valeur d’index de //increment par un
Si (indice == 100) {//reset index si elle atteint 100
index = 0 ;
}
}
else {}
PORTD = scie ; //send vu à broches numériques 0-7
digitalWrite (outputSelector, HIGH); //select DACB
scie ++; valeur de scie //increment par un
Si (vu == 255) {//reset vu si elle atteint 256 (sortie continue au sein de 0-255 toujours)
vu = 0 ;
}
}
digitalWrite (WR, LOW); //enable à nouveau de sortie
canal ^ = 1; //toggle canal
Au démarrage les interruptions, les ensembles d’Arduino le WR pin haute, cela temporairement détient les sorties DAC à leurs tensions actuelles et nous permet d’envoyer des données dans le CAD sans changer le courant de la sortie DAC sélectionné. La variable « canal » alterne entre les valeurs de 0 et de 1 chaque fois que l’interruption s’exécute, alternant le sinus et j’ai vu de la sortie. Quand le « canal » = 1, une valeur du tableau « sine » est définie à la DAC via PORTD. La ligne suivante définit l’outputSelector (DACA/DACB broche) bas, ce qui provoque la DACA d’être sélectionné. Puis WR a la valeur LOW, provoquant la nouvelle valeur de sinus de sortie via la DACA. Dans la routine d’interruption prochaine, une série similaire d’événements entraîne une valeur de scie à la sortie de DACB.
<pre>//stereo audio out, sampling rate <=44.1kHz //by Amanda Ghassaei //Nov 2012
Comme dans la dernière étape, mon taux d’échantillonnage n’était pas exactement 88,2 kHz, c’était en fait 88,398 kHz (légèrement mieux que 88,2), donc je vais utiliser ce nombre dans les calculs suivants :
durée de chaque échantillon = 2 * 1/fréquence d’échantillonnage
durée de chaque échantillon = 2 * 1/88398 Hz = 22.6us
comme dans la dernière étape, la période des sinus et scie sont les suivantes :
vu période = 22.6us * 256 = 5.8ms
période de sinus = 22.6us * 100 = 2.3ms
mais si vous regardez dans les figures 2 et 3, vous verrez que la durée de l’échantillon et la période des vagues sortie est beaucoup plus longue. C’est parce que le code dans la routine d’interruption est inefficace et prend plu de 22.6us à exécuter. Pour résoudre ce problème, j’ai eu à remplacer la commande de bibliothèque Arduino « digitalWrite » avec des commandes de manipulation directe pin beaucoup plus efficaces dans le code ci-dessous. Vous pouvez en savoir plus sur la façon dont ils travaillent ici, vous pouvez également lire les commentaires j’ai mis dans le code ci-dessous. Figures 4 et 5 montrent les résultats de ce code optimisé, vous pouvez voir que les durées de période et l’échantillon sont ce que nous attendons des calculs.
<pre>//stereo audio out with 44.1kHz sampling rate //by Amanda Ghassaei //Nov 2012
Je vais note également ici, que depuis le CS doigt est maintenu bas pendant la durée de ce code (réglage il désactivera haut écrit les nouvelles données à chaque sortie), vous pourriez libérer un Arduino supplementaire en fixation CS au sol en permanence et en supprimant les instances de CS dans le code de l’Arduino.