Étape 2: Configurer DAC et Test
PORTD = 125 ; //send données à CAD
Il s’agit d’aborder le port directement. Sur l’Arduino, broches numériques 0-7 sont tous sur le port d de la puce Atmel328. Le permet de commande PORTD nous raconte broches 0-7 aller haute ou basse en une seule ligne (au lieu de devoir utiliser digitalWrite() huit fois). Non seulement c’est plus facile de coder, il est beaucoup plus rapide pour l’Arduino traiter et il provoque les broches à tout changement en même temps au lieu d’un (vous ne pouvez plus parler d’une broche à la fois avec digitalWrite()). Depuis le port d comporte huit broches là-dessus (broches numériques 0-7) nous pouvons envoyer un des 2 ^ 8 = 256 valeurs possibles (0-255) pour contrôler les broches. Par exemple, si nous avons écrit la ligne suivante :
PORTD = 0 ;
Il fixerait broches 0-7 faible. Avec le DAC, mis en place sur les broches 0-7 cette sortie 0V. Si nous avons envoyé ce qui suit :
PORTD = 255 ;
Il fixerait broches 0-7 haut. Cela entraînera la DAC à sortie 5V. Nous pouvons aussi envoyer des combinaisons de haute et basse États en sortie une tension comprise entre 0 et 5V de la DAC. Par exemple :
PORTD = 125 ;
125 = 01111101 en binaire. Ceci définit la broche 7 faible (l' octet le plus significatif est 0), pins élevé (les cinq bits sont 1) 6-2, broche 1 faible (le prochain bit est 0) et pin 0 élevé (le lsb est 1). Vous pouvez en savoir plus sur comment cela fonctionne ici. Pour calculer la tension que cela sortira de la DAC, nous utilisons l’équation suivante :
tension de sortie du DAC = [(valeur envoyée à PORTD) / 255] * 5V
donc pour PORTD = 125 :
tension de sortie du DAC = (125 / 255) * 5V = 2,45
Le code ci-dessous envoie plusieurs tensions comprises entre 0 et 5V et détient chacun pendant une courte période démontrer les concepts que j’ai décrit ci-dessus. Dans la fonction loop() principal, j’ai écrit :
PORTD = 0; //send (0/255) * 5 = 0V sur DAC
retard (1); //wait 1ms
PORTD = 127 ; //send (127/255) * 5 = 2, 5V sur DAC
retard (2); //wait 2ms
PORTD = 51 ; //send (51/255) * 5 = 1V à CAD
retard (1); //wait 1ms
PORTD = 255 ; //send (255/255) * 5 = 5V dehors DAC
retard (3); //wait 3ms
La sortie est affichée sur un oscilloscope sur la Fig. 4. La ligne horizontale centrale à travers l’oscilloscope représente 0V et chaque ligne horizontale représente une augmentation/diminution de tension de 2V. Les notes de l’image sur la fig 4 affichent la sortie de chacune des lignes de code ci-dessus, cliquez sur l’image pour visualiser l’image.
//Analog out //by Amanda Ghassaei
Le code ci-dessous génère une rampe de 0 à 5V. Dans la fonction loop(), la variable « a » est incrémenté de 0 à 255. Chaque fois qu’elle est incrémentée, la valeur de « a » est envoyée au PORTD. Cette valeur est maintenue pour 50us avant l’envoi d’une nouvelle valeur de « a ». Une fois que « a » atteint 255, il obtient réinitialisé à 0. Le temps pour chaque cycle de cette rampe (également appelée la période) prend :
période = (durée de chaque étape) * (nombre d’étapes)
période = 50us * 256 = 12800us = 0.0128s
Si la fréquence est :
fréquence de la rampe = 1/0.0128s = 78 Hz
La sortie de la DAC sur un oscilloscope peut être vu dans la figure 5.
//Ramp out //by Amanda Ghassaei
Le code ci-dessous génère une onde sinusoïdale, centrée autour de 2, 5V, oscillant jusqu'à un maximum de 5 v et un min de 0V. Dans la fonction loop(), la variable « t » est incrémentée de 0 à 100. Chaque fois qu’elle est incrémentée, l’expression :
127+127*Sin(2*3.14*t/100)
est envoyé à PORTD. Cette valeur est maintenue pour 50us avant « t » est incrémentée à nouveau et une nouvelle valeur est envoyée à PORTD. Une fois que le « t » atteint 100, il obtient réinitialisé à 0. La période de cette onde sinusoïdale devrait être :
période = (durée de chaque étape) * (nombre d’étapes)
période = 50us * 100 = 5000us = 0.005s
Si la fréquence doit être :
fréquence de la rampe = 1/0.005s = 200 Hz
//Sine out //by Amanda Ghassaei
Mais ce n’est pas le cas, la sortie de la DAC est indiquée sur la Fig. 6. Comme il est indiqué dans les notes de l’image, il n’a pas une fréquence de 200hz, sa fréquence est plus à 45hz. C’est parce que la ligne :
PORTD = 127+127*sin(2*3.14*t/100) ;
prend beaucoup de temps à calculer. Multiplication/division de nombres décimaux et la fonction sin() tient en général l’Arduino beaucoup de temps à effectuer.
Une solution consiste à calculer les valeurs de sinus avance et de les stocker dans la mémoire de l’Arduino. Puis lorsque le sketch Arduino tourne tout l’Arduino vous devez faire est de rappel ces valeurs de la mémoire (une tâche très facile et rapide pour l’Arduino). J’ai couru un simple script Python (ci-dessous) pour générer des 100 valeurs de 127+127*sin(2*3.14*t/100) :
importer des mathématiques
pour x dans l’intervalle (0, 100) :
impression str(int(127+127*math.sin(2*math.pi*x*0.01)),)+str(","),
J’ai stocké ces valeurs dans un tableau appelé "sine" dans le sketch Arduino ci-dessous. Alors dans ma boucle, pour chaque valeur de « t » j’ai envoyé un élément des sinus [] à PORTD :
PORTD = sine [t] ;
La sortie de ce DAC pour ce sketch est indiquée sur la Fig. 7. Vous pouvez voir qu’elle génère une onde sinusoïdale de 200Hz, comme prévu.
//Sine out with stored array //by Amanda Ghassaei