Cambios

Busca en cnbGuatemala con Google

m
Línea 1: Línea 1:  +
{{Título}}
 
En este apartado vamos a ver los fundamentos en los que se basa la generación de salidas analógicas en Arduino. El procedimiento para generar una señal analógica es el llamado PWM.
 
En este apartado vamos a ver los fundamentos en los que se basa la generación de salidas analógicas en Arduino. El procedimiento para generar una señal analógica es el llamado PWM.
   Línea 23: Línea 24:     
Por ejemplo, si una señal tiene un periodo de 10 ms y sus pulsos son de ancho (PW) 2ms, dicha señal tiene un duty cycle de 20% (20% on y 80% off). El siguiente gráfico muestra tres señales PWM con diferentes "duty cycles". 
 
Por ejemplo, si una señal tiene un periodo de 10 ms y sus pulsos son de ancho (PW) 2ms, dicha señal tiene un duty cycle de 20% (20% on y 80% off). El siguiente gráfico muestra tres señales PWM con diferentes "duty cycles". 
 +
[[Archivo:Pulso con modulación.png|centre|frameless|326x326px]]
 +
La señal PWM se utiliza como técnica para controlar circuitos analógicos. El periodo y la frecuencia del tren de pulsos puede determinar la potencia entregada a dicho circuito. Si, por ejemplo, tenemos un voltaje de 9v y lo modulamos con un duty cycle del 10%, obtenemos 0.9V de señal analógica de salida.
 +
 +
Las señales PWM son comúnmente usadas para el control de motores DC (si decrementas la frecuencia, la inercia del motor es más pequeña y el motor se mueve más lentamente), ajustar la intensidad de brillo de un LED, etc.
 +
 +
En Arduino la señal de salida PWM (pines 9,10) es una señal de frecuencia constante (30769 Hz) y que sólo nos permite cambiar el "duty cycle" o el tiempo que el pulso está activo (on) o inactivo (off), utilizando la función analogWrite().
 +
 +
Otra forma de generar señales PWM es utilizando la capacidad del microprocesador. La señal de salida obtenida de un microprocesador es una señal digital de 0 voltios (LOW) y de 5 voltios (HIGH).
 +
 +
Con el siguiente código y con sólo realizar modificaciones en los intervalos de tiempo que el pin seleccionado tenga valor HIGH o LOW, a través de la función digitalWrite (), generamos la señal PWM.
 +
 +
<code>/* señal PWM */</code>
 +
 +
<code>int digPin = 10; // pin digital 10</code>
 +
 +
<code>void setup()</code>
 +
 +
<code>{ </code>
 +
 +
<code>pinMode(digPin, OUTPUT); // pin en modo salida }</code>
 +
 +
<code>void loop()</code>
 +
 +
<code>{</code>
 +
 +
<code>digitalWrite(digPin, HIGH); // asigna el valor HIGH al pin</code>
 +
 +
<code>delay(500); // espera medio segundo</code>
 +
 +
<code>digitalWrite(digPin, LOW); // asigna el valor LOW al pin</code>
 +
 +
<code>delay(500); // espera medio segundo</code>
 +
 +
<code>}</code>
 +
 +
El programa pone el pin a HIGH una vez por segundo, la frecuencia que se genera en dicho pin es de 1 pulso por segundo o 1 Hertz de pulso de frecuencia (periodo de 1 segundo) . Cambiando la temporización del programa, podremos cambiar la frecuencia de la señal. Por ejemplo, si cambiamos las dos líneas con delay(500) a delay(250), multiplicaremos la frecuencia por dos, de forma que estamos enviando el doble de la cantidad de pulsos por segundo que antes. 
 +
 +
=== Cálculo de tonos ===
 +
[[Archivo:Pulso y período.png|alt=Pulso y período|centre|frameless|450x450px|Pulso y período]]Donde: Frecuencia-tono=1/length-Periodo
 +
 +
Si "duty cycle"=50%, es decir, el ancho de los pulsos activos (on) e inactivos (off) son iguales---> Periodo=2*PW
 +
 +
Obteniendo la siguiente fórmula matemática:
 +
 +
<nowiki><center>PW o ancho de pulso = 1/(2 * toneFrequency) = period / 2</center></nowiki>
 +
 +
De forma que a una frecuencia o periodo dados, podemos obtener la siguiente tabla:
 +
{| class="wikitable"
 +
|Nota musical
 +
|Frecuencia-tono
 +
|Periodo (us)
 +
|PW (us)
 +
|-
 +
|do
 +
|261 Hz
 +
|3830
 +
|1915
 +
|-
 +
|re
 +
|294 Hz
 +
|3400
 +
|1700
 +
|-
 +
|mi
 +
|329 Hz
 +
|3038
 +
|1519
 +
|-
 +
|fa
 +
|349 Hz
 +
|2864
 +
|1432
 +
|-
 +
|sol
 +
|392 Hz
 +
|2550
 +
|1275
 +
|-
 +
|la
 +
|440 Hz
 +
|2272
 +
|1136
 +
|-
 +
|si
 +
|493 Hz
 +
|2028
 +
|1014
 +
|-
 +
|do'
 +
|523 Hz
 +
|1912
 +
|956
 +
|}
 +
(cleft) 2005 D. Cuartielles para K3
 +
 +
Con Arduino, tenemos dos formas de generar tonos. Con el primer ejemplo construiremos y enviaremos una señal cuadrada de salida al piezo, mientras que con el segundo haremos uso de la señal de modulación por ancho de pulso o PWM de salida en Arduino.
 +
 +
'''Ejemplo 1'''
 +
 +
<code>/*Con el siguiente código y con sólo realizar modificaciones en los intervalos de tiempo que el pin seleccionado tenga valor HIGH o LOW, a través de la función digitalWrite (), generamos la señal PWM a una determinada frecuencia de salida=261Hz*/</code>
 +
 +
<code>int digPin = 10; // pin digital 10</code>
 +
 +
<code>int PW=1915; // valor que determina el tiempo que el pulso va a estar en on/off</code>
 +
 +
<code>void setup()</code>
 +
 +
<code>{</code>
 +
 +
<code>pinMode(digPin, OUTPUT); // pin digital en modo salida</code>
 +
 +
<code>}</code>
 +
 +
<code>void loop()</code>
 +
 +
<code>{</code>
 +
 +
<code>delayMicroseconds(PW); // espera el valor de PW</code>
 +
 +
<code>digitalWrite(digPin, LOW); // asigna el valor LOW al pin</code>
 +
 +
<code>delayMicroseconds(PW); // espera el valor de PW</code>
 +
 +
<code>digitalWrite(digPin, HIGH); // asigna el valor HIGH al pin</code>
 +
 +
<code>}</code>
 +
 +
'''Ejemplo 2'''
 +
 +
En Arduino la señal de salida PWM (pines 9,10) es una señal de frecuencia constante (30769 Hz) y que sólo nos permite cambiar el "duty cycle" o el tiempo que el pulso está activo (on) o inactivo (off), utilizando la función analogWrite().
 +
 +
Usaremos la característica “Pulse Width” con “analogWrite” para cambiar el volumen.
 +
 +
<code>analogWrite(, value)</code><blockquote>'''value:''' representa al parámetro "duty cycle" (ver PWM) y puede tomar valores entre 0 y 255.</blockquote><blockquote>'''0''' corresponde a una señal de salida de valor constante de 0 v (LOW) o 0% de "duty cycle";</blockquote><blockquote>'''255''' es una señal de salida de valor constante de 5 v (HIGH) o 100% de "duty cycle"; .</blockquote>Para valores intermedios, el pin rápidamente alterna entre 0 y 5 voltios - el valor más alto, lo usual es que el pin esté en high (5 voltios).
 +
 +
La frecuencia de la señal PWM es constante y aproximadamente de 30769 Hz.
 +
 +
<code>int speakerOut = 9; int volume = 300; // máximo volume es 1000 ¿?</code>
 +
 +
<code>int PW=1915;</code>
 +
 +
<code>void loop()</code>
 +
 +
<code>{</code>
 +
 +
<code>analogWrite(speakerOut, 0);</code>
 +
 +
<code>analogWrite(speakerOut,volume);</code>
 +
 +
<code>delayMicroseconds(PW);</code>
 +
 +
<code>analogWrite(speakerOut, 0);</code>
 +
 +
<code>delayMicroseconds(PW);</code>
 +
 +
<code>}</code> 
 +
 +
[[Categoría:Tecnología]]