Cristian Castro
/
BuzzerFrequency
This Program generate a audibly frequency on a Buzzer
main.cpp
- Committer:
- CCastrop1012
- Date:
- 2019-02-28
- Revision:
- 0:309da55d6e5a
File content as of revision 0:309da55d6e5a:
#include "mbed.h" //****************************************************************************** // Definiciones /// Puerto Serial Serial SerialPort(SERIAL_TX, SERIAL_RX, 9600); /// PWM OUTPUTS PwmOut Buzzer(LED1); // Temporizadores Ticker LengthTonoBuzzer; // constantes const int long_vector = 10; // longitud del vector /// Global Variables uint8_t VCOMANDS [long_vector]; // vector en donde se almacena la informacion // Recividos por el PC (Los Comandos) uint8_t VINDICATORS [long_vector]; // vector en donde se almacena la informacion // que se Enviara al PC (Los indicadores) uint8_t i = 0; // Variable usada como Indice de los vectores, // indica la posicion del vector en donde se reciben // ó se almacenan los datos float periodo_Buzzer = 1; uint8_t duracion_Tono = 1; //****************************************************************************** // Prototipo de Funciones void ReadPort(void); // Lee el puerto Serial void MainConfig(void); // Configuracion Inicial de los Perifericos del uC void stopBuzzer(void); // Detiene el Sonido del Buzzer void BuzzerSound(void); // Genera la Frecuencia de Audio en el Buzzer //****************************************************************************** /// Configuración Inicial void MainConfig(void) { // se habilita la interrupción RX SerialPort.attach(&ReadPort, Serial::RxIrq ); // configuracion inicial del PWM Buzzer Buzzer.period(periodo_Buzzer); Buzzer.write(0.50); } /// Función Principal int main() { MainConfig(); // Mensaje Inicial SerialPort.printf("Hello World, System Run !!\n"); while(1) { if(VCOMANDS[2] != 0) // Si hemos enviado el comando de Ejecucion de Tono { BuzzerSound(); // Genera el Tono Seleccionado } /// Visualizamos la informacion que hemos Modificado SerialPort.printf("VCOMANDS[%d] = %d - VCOMANDS[9] = %d\n", i, VCOMANDS[i], VCOMANDS[9]); wait(1); } } //****************************************************************************** // Funciones Secundarias void stopBuzzer(void) // Detiene el Tono del Buzzer, poniendo el ancho de pulso a 0; { Buzzer.period(1); Buzzer.write(0); // Volvemos a la configuracion Inicial del Buzzer LengthTonoBuzzer.attach(&stopBuzzer,10000); // Mientras no se envie un nuevo comando de tiempo para // La interrupcion se deja un tiempo muy alto para generar la interrupcion // Lo menos Posible } void BuzzerSound(void) { // Se calcula el valor del Periodo para el Buzzer limitando el ancho de banda de las // Frecuencias de entradas entre 1 y 20Hz ó 1 y 20KHz // hallamos el valor de 1 a 20 que se ha ingresado if(VCOMANDS[1] <= 40) periodo_Buzzer = 1.0; // Se restringe el limite inferior del valor ingresado a 40 y lo hace equivalente a un periodo de 1 segundo. else if (VCOMANDS[1] > 60) periodo_Buzzer = 20.0; // Se restringe el limite Superior del valor ingresado a 60 y lo hace equivalente a un periodo de 20 segundo. else periodo_Buzzer = (float)(VCOMANDS[1] - 40); periodo_Buzzer = (1 / periodo_Buzzer); //Se realiza la conversión de Frequencia a Periodo // Ahora si VCOMANDS[2] == 48 == '0'; la frecuencia estará en el orden de los Herz if (VCOMANDS[2] == 48) { Buzzer.period(periodo_Buzzer); VCOMANDS[2] = 0 ; } // Pero si VCOMANDS[2] == 49 == '1'; la frecuencia estará en el orden de los KiloHerz else if (VCOMANDS[2] == 49) { Buzzer.period_us( (uint8_t)(periodo_Buzzer * 1000) ); VCOMANDS[2] = 0 ; } // Determinamos el tiempo por el cual estará sonando el Buzeer if(VCOMANDS[0] <= 40) duracion_Tono = 1; // Se restringe el limite inferior del valor ingresado a 40 y lo hace equivalente a una duración de 1 segundo. else if (VCOMANDS[0] > 100) duracion_Tono = 60; // Se restringe el limite Superior del valor ingresado a 60 y lo hace equivalente a una duración de 60 segundo. else duracion_Tono = (VCOMANDS[0] - 40); Buzzer.write(50); // Se carga el ancho de pulso a 50 ya que en la // Interrupcion se pone a 0 // Se habilita la interrupcion del ticker y se le asigna // La función que ejecutará cuando se genere la interrupción LengthTonoBuzzer.attach(&stopBuzzer,duracion_Tono); // Cargamos el Tiempo(0-60 segundos) ingresado // y se lo Cargamos al Ticker del Buzzer VCOMANDS[9] = (uint8_t) (periodo_Buzzer * 1000); // Almacenamos El resultado del periodo en VCOMANDS[9] para visualizarlo // Y confirmar que el valor sea el correcto } void ReadPort() { // if (SerialPort.readable()) VCOMANDS[i] = SerialPort.getc(); i++; if(i > 2) i = 0; }