Apéndice 3. Señales analógicas de salida en Arduino (PWM)

De CNB
Ir a la navegación Ir a la búsqueda
Busca en cnbGuatemala con Google

Línea 23: Línea 23:
  
 
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> 

Revisión del 18:03 2 jul 2019

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.

Señal PWM (Pulse-width modulation – pulso con modulación) señal de modulación por ancho de pulso:

Pulso y período

Donde:

- PW (Pulse Width) o ancho de pulso, representa al ancho (en tiempo) del pulso.

- period length (periodo), o ciclo, es el tiempo total que dura la señal.

La frecuencia se define como la cantidad de pulsos (estado on/off)por segundo y su expresión matemática es la inversa del periodo, como muestra la siguiente ecuación.

frecuencia  =
1
periodo

El periodo se mide en segundos, de este modo la unidad en la cual se mide la frecuencia (hertz) es la inversa a la unidad de tiempo (segundos).

Existe otro parámetro asociado o que define a la señal PWM, denominado "Duty cycle", el cual determina el porcentaje de tiempo que el pulso (o voltaje aplicado) está en estado activo (on) durante un ciclo.

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". 

Pulso con modulación.png

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.

/* señal PWM */

int digPin = 10; // pin digital 10

void setup()

pinMode(digPin, OUTPUT); // pin en modo salida }

void loop()

{

digitalWrite(digPin, HIGH); // asigna el valor HIGH al pin

delay(500); // espera medio segundo

digitalWrite(digPin, LOW); // asigna el valor LOW al pin

delay(500); // espera medio segundo

}

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[editar | editar código]

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:

<center>PW o ancho de pulso = 1/(2 * toneFrequency) = period / 2</center>

De forma que a una frecuencia o periodo dados, podemos obtener la siguiente tabla:

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

/*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*/

int digPin = 10; // pin digital 10

int PW=1915; // valor que determina el tiempo que el pulso va a estar en on/off

void setup()

{

pinMode(digPin, OUTPUT); // pin digital en modo salida

}

void loop()

{

delayMicroseconds(PW); // espera el valor de PW

digitalWrite(digPin, LOW); // asigna el valor LOW al pin

delayMicroseconds(PW); // espera el valor de PW

digitalWrite(digPin, HIGH); // asigna el valor HIGH al pin

}

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.

analogWrite(, value)

value: representa al parámetro "duty cycle" (ver PWM) y puede tomar valores entre 0 y 255.

0 corresponde a una señal de salida de valor constante de 0 v (LOW) o 0% de "duty cycle";

255 es una señal de salida de valor constante de 5 v (HIGH) o 100% de "duty cycle"; .

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.

int speakerOut = 9; int volume = 300; // máximo volume es 1000 ¿?

int PW=1915;

void loop()

{

analogWrite(speakerOut, 0);

analogWrite(speakerOut,volume);

delayMicroseconds(PW);

analogWrite(speakerOut, 0);

delayMicroseconds(PW);

} 

Conjunto de acciones (formas de actuar o de resolver tareas), con un orden, plan o pasos, para conseguir un determinado fin o meta. Se trata de saber hacer cosas, aplicar o actuar de manera ordenada para solucionar problemas, satisfacer propósitos o conseguir objetivos. Forman los contenidos procedimentales.

Término utilizado, a menudo, como un saber hacer. Se suele aceptar que, por orden creciente, en primer lugar estaría la habilidad, en segundo lugar la capacidad, y la competencia se situaría a un nivel superior e integrador. Capacidad es, en principio, la aptitud para hacer algo. Todo un conjunto de verbos en infinitivo expresan capacidades (analizar, comparar, clasificar, etc.), que se manifiestan a través de determinados contenidos (analizar algo, comparar cosas, clasificar objetos, etc.). Por eso son, en gran medida, transversales, susceptibles de ser empleadas con distintos contenidos. Una competencia moviliza diferentes capacidades y diferentes contenidos en una situación. La competencia es una capacidad compleja, distinta de un saber rutinario o de mera aplicación.