Paso 2: Configurar DAC y prueba
PORTD = 125; //send datos CAD
Esto se llama direccionamiento del puerto directamente. En el Arduino, pines digitales 0-7 están todos en el puerto d del chip Atmel328. La deja comando PORTD nos dice 0-7 pernos a alta o baja en una línea (en lugar de tener que utilizar digitalWrite() ocho veces). No sólo es más fácil de código, es mucho más rápido para el Arduino procesar y causa las clavijas para todos los cambios simultáneamente en lugar de uno por uno (usted puede sólo hablar con un perno a la vez con digitalWrite()). Desde d puerto tiene 8 pines en él (pines digitales 0-7) podemos enviamos uno de 2 ^ 8 = 256 posibles valores (0-255) para el control de los pernos. Por ejemplo, si escribimos la siguiente línea:
PORTD = 0;
fijó clavijas 0-7 bajo. Con el CAD en pins 0-7 esta salida 0V. Si nos envía las siguientes:
PORTD = 255;
fijó clavijas 0-7 alto. Esto hará que la DAC a la salida de 5V. También podemos enviar combinaciones de baja y alta los Estados a la salida un voltaje entre 0 y 5V de la DAC. Por ejemplo:
PORTD = 125;
125 = 01111101 en binario. Esto establece el pin 7 bajo (el msb es 0), pernos alta (los siguiente cinco bits son 1) 6-2, pin 1 bajo (el siguiente bit es 0) y pin 0 alta (el lsb es 1). Usted puede leer más acerca de cómo funciona aquí. Para calcular la tensión que esto es la salida de la DAC, utilizamos la siguiente ecuación:
salida de voltaje de DAC = [(valor enviado a PORTD) / 255] * 5V
para PORTD = 125:
salida de voltaje de DAC = (125 / 255) * 5 v = 2.45V
El código siguiente envía varios voltajes entre 0 y 5V y tiene cada uno para un a corto plazo demostrar los conceptos que he descrito arriba. En la función loop() principal he escrito:
PORTD = 0; //send (0/255) * 5 = 0V a DAC
retardo (1); //wait 1ms
PORTD = 127; //send (127/255) * 5 = 2.5V a DAC
demora (2); //wait 2ms
PORTD = 51; //send (51/255) * 5 = 1V a DAC
retardo (1); //wait 1ms
PORTD = 255; //send (255/255) * 5 = 5V salida DAC
demora (3); //wait 3 MS
La salida se muestra en un osciloscopio en la figura 4. La línea horizontal en el osciloscopio representa 0V y cada línea horizontal representa una aumento/disminución de voltaje de 2V. Las notas de la imagen en la figura 4 muestran la salida de cada una de las líneas de código anterior, haga clic en la imagen para ver las notas de la imagen.
//Analog out //by Amanda Ghassaei
El código siguiente genera una rampa de 0 a 5V. En la función loop(), la variable "a" se incrementa de 0 a 255. Cada vez que se incrementa, el valor de "a" se envía al PORTD. Este valor se lleva a cabo para 50us antes de enviar un nuevo valor de "a". Una vez que "a" alcanza 255, se consigue restablecer a 0. Toma el tiempo para cada ciclo de esta rampa (también llamada el período):
periodo = (duración de cada paso) * (número de pasos)
período = 50us * 256 = 12800us = 0.0128s
por lo que la frecuencia es:
frecuencia de rampa = 1/0.0128s = 78 Hz
La salida de la DAC en un osciloscopio se puede ver en la figura 5.
//Ramp out //by Amanda Ghassaei
El código siguiente salidas una onda del seno centrada alrededor de 2.5V, oscilante hasta un máximo de 5V y un min de 0V. En la función loop(), la variable "t" se incrementa de 0 a 100. Cada vez se incrementa, la expresión:
127+127*sin(2*3.14*t/100)
se envía al PORTD. Este valor se lleva a cabo para 50us antes de "t" se incrementa otra vez y un nuevo valor es enviado al PORTD. Una vez que "t" llega a 100, se consigue restablecer a 0. El período de esta onda sinusoidal debe ser:
periodo = (duración de cada paso) * (número de pasos)
período = 50us * 100 = 5000us = 0.005s
así que la frecuencia debe ser:
frecuencia de rampa = 1/0.005s = 200 Hz
//Sine out //by Amanda Ghassaei
Pero este no es el caso, la salida de la CAD se muestra en la fig 6. Como se indica en las notas de la imagen, no tiene una frecuencia de 200hz, su frecuencia es más parecido a 45hz. Esto es porque la línea:
PORTD = 127+127*sin(2*3.14*t/100);
toma mucho tiempo para calcular. En general multiplicación/división con números decimales y la función sin() tomar el Arduino un montón de tiempo para llevar a cabo.
Una solución es calcular los valores de seno antes de tiempo y guardarlos en la memoria de Arduino. Entonces cuando el sketch de Arduino está ejecutando todo el Arduino se tiene que hacer es recordar estos valores de memoria (una tarea muy fácil y rápida para el Arduino). Corrí un simple script en Python (abajo) para generar 100 valores de 127+127*sin(2*3.14*t/100):
importación matemáticas
para x en el rango (0, 100):
imprimir str(int(127+127*math.sin(2*math.pi*x*0.01)),)+str(","),
Almacena estos valores en un array llamado "seno" en el sketch de Arduino por debajo. En mi lazo, para cada valor de "t" envía un elemento de [] seno a PORTD:
PORTD = seno [t];
La salida de este DAC para este boceto se muestra en la figura 7. Se puede ver que produce una onda senoidal de 200hz, como se esperaba.
//Sine out with stored array //by Amanda Ghassaei