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