Etape 3: Comment ça marche :
Tout d’abord, voici un tas de comprend. Bien sûr, il y a celles pour le processeur, ainsi que certaines bibliothèques standards. Ce qui est important qu'ici, c’est l’en-tête des fichiers qui correspondent aux échantillons. Il s’agit d’un moyen pour facilement charger les données de votre ordinateur dans le microcontrôleur au moment de la compilation. J’ai écrit un script MATLAB qui peut lire les fichiers .wav et déclare un grand tableau par exemple :
int mydata [] = {1, 2, 3, 4} ;
Il y a la section :
__attribute__((__interrupt__)) void _T2Interrupt (void)
{
Il s’agit de l’interruption Timer 2, qui pousse le PWM. Un PWM (modulateur de largeur d’impulsion) génère une forme d’onde analogique-de-tri en modifiant rapidement le rapport cyclique d’une forme d’onde de pouls. C’est parce que les sorties du microcontrôleur peuvent générer uniquement une logique 0 (qui est sous tension au sol) ou un 1 logique (c'est-à-dire à la tension de la batterie). Si nous voulons dire, rapprochant une tension à mi-chemin entre celui, nous pouvons utiliser le PWM pour tourner sur la broche de la moitié du temps et le couper la moitié du temps. Aussi longtemps que cela est fait très rapidement, nous pouvons rapprochant la tension assez bien à ressembler à l’onde originale.
La fonction T2Interrupt est un gestionnaire d’interruption pour Timer 2. Cela signifie essentiellement que le PWM a besoin d’un autre échantillon, alors nous avons lu un autre échantillon de la mémoire programme et farcir dans le registre OC1RS. C’est comment PWM sait quelle tension de rapprocher pour la prochaine fois de l’échantillon.
__attribute__((__interrupt__)) void _CNInterrupt (void)
{
Cette section est un gestionnaire d’interruption pour la notification de modifications. La notification de modifications lève une interruption (autrement dit, exécute la fonction ci-dessus) en tout temps une des broches vous avez activé l’état de changements (goes haut -> bas ou vice versa). Voilà comment nous détecter l’interrupteur enfoncé. Notez que nous pourrions interroger ici, mais la notification de modifications périphérique fonctionne même lorsque le microcontrôleur est endormi, ce qui nous permet d’économiser beaucoup d’énergie. Ce que nous faisons ici dépend de la question de savoir si un son joue déjà. Si un son joue déjà et nous sommes dans la première 375ms de l’échantillon, il se réinitialise tout simplement l’index de l’échantillon (ce fait redémarrer la lecture au début du même échantillon). Si il n’y a aucune lecture du son, ou nous sommes passé le premier 375ms, nous allons au hasard choisir un nouveau son sur les 10 et qui jouent. Cela permet à la Lil Jon Button de répéter le même échantillon, mais ont encore suffisamment comportement aléatoire pour être intéressant (p. ex. Ya-Ya-Oui ! OK!).
Sub setupHS()
Sub setupCN()
Sub setupPWM()
Voici quelques fonctions de configuration. C’est assez compliqué et vous sont les meilleurs pour consulter la fiche technique pour exactement ce qui se passe ici. Qu’il suffise de dire la première définit la place de l’horloge processeur à 66,33 Mhz, le met en deuxième place la notification de modifications et le troisième set up le PWM. Pour votre référence, la feuille de données peut être trouvée ici :
http://www.Microchip.com/wwwproducts/Devices.aspx?dDocName=en532296
Enfin la :
int main ()
{
Ce qui est de la boucle principale. Code commence à s’exécuter ici, donc la première chose qu’il fait est mises en place les périphériques. Puis la boucle principale n’est pas tellement un tas. Il fondamentalement juste attend pour un peu et se met en veille. Tout le travail qui se passe parce que les interruptions ci-dessus ont été enregistrées, alors quand quelque chose a besoin d’attention (par exemple le PWM doit l’échantillon suivant), l’interruption correcte s’appellera automatiquement. En général lorsque le microcontrôleur se met en veille, aucun code n’est exécuté. Toutefois, étant donné que la notification de modifications périphérique a été activée, une pression sur le bouton entraîne le microcontrôleur se réveille et immédiatement cette interruption de service et commencer à jouer un échantillon.
Note finale : Autre remarque finale :
Un ingénieur attentif pourrait demander, pourquoi n'avez-vous pas utilisé la fonction DAC du micro-contrôleur ? En fait, le dsPIC33FJ128GP802 a un DAC audio qui est conçu pour ce genre de chose. La raison est de simplifier la conception. Avis que, pour fonctionner un haut-parleur sur un PWM, la seule chose qui est nécessaire est unique digital switch (un BJT dans ce cas aucune résistances de polarisation). Si au contraire la sortie était un DAC, un amplificateur linéaire fait de transistors (avec des résistances supplémentaires) ou un ampli-op serait nécessaire. Ceci augmente considérablement la complexité de la conception et le comte de la partie. Notez que les formes d’onde d’entrée sont tout simplement des fichiers audio 8kHz 8 bit, donc une pleine qualité CD DAC est excessif en termes de qualité audio, mais augmente la dépense globale.
Plage de tension de la dsPIC33FJ128GP802 est seulement 3.0-3.6V. J’ai observé qu’il s’exécute à environ 2.8V sans problème avec ce code, mais la stabilité ne peut être garantie à long terme. Je vous recommande si vous êtes à expérimenter avec le code à utiliser des piles au lithium AAA: http://www.amazon.com/Energizer-Ultimate-L92BP-4-Lithium-Battery/dp/B0002DUQDQ . Ils soutiennent 1.5V pour beaucoup plus longtemps que les piles alcalines AAAs.
Edit : problème résolu en utilisant PIC18, qui descend jusqu'à 2V