Cristian Castro / Mbed 2 deprecated BuzzerFrequency

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 
00003 
00004 
00005 
00006 //******************************************************************************
00007 //                          Definiciones
00008 
00009 /// Puerto Serial
00010 Serial SerialPort(SERIAL_TX, SERIAL_RX, 9600);
00011 
00012 /// PWM OUTPUTS
00013 PwmOut Buzzer(LED1);
00014 
00015 //  Temporizadores 
00016 Ticker LengthTonoBuzzer;
00017 
00018 // constantes
00019 const int long_vector = 10; // longitud del vector
00020 
00021 /// Global Variables
00022 
00023 uint8_t VCOMANDS     [long_vector]; // vector en donde se almacena la informacion 
00024                                     // Recividos por el PC (Los Comandos)
00025 uint8_t VINDICATORS  [long_vector]; // vector en donde se almacena la informacion 
00026                                     // que se Enviara al PC (Los indicadores)
00027 
00028 uint8_t i = 0;                      // Variable usada como Indice de los vectores,
00029                                     // indica la posicion del vector en donde se reciben 
00030                                     // ó se almacenan los datos
00031 
00032 float periodo_Buzzer = 1;           
00033 uint8_t duracion_Tono = 1;
00034 
00035 //******************************************************************************
00036 
00037 //                  Prototipo de Funciones
00038 
00039 void ReadPort(void);                // Lee el puerto Serial
00040 void MainConfig(void);              // Configuracion Inicial de los Perifericos del uC
00041 
00042 
00043 void stopBuzzer(void);              // Detiene el Sonido del Buzzer
00044 void BuzzerSound(void);             // Genera la Frecuencia de Audio en el Buzzer
00045 
00046 //******************************************************************************
00047 
00048 ///             Configuración Inicial
00049 
00050 void MainConfig(void)
00051     {
00052         
00053     // se habilita la interrupción RX
00054         SerialPort.attach(&ReadPort, Serial::RxIrq );
00055           
00056         
00057     // configuracion inicial del PWM Buzzer
00058         Buzzer.period(periodo_Buzzer);
00059         Buzzer.write(0.50);
00060     
00061     
00062     
00063     }
00064 
00065 
00066 
00067 ///             Función Principal
00068 
00069 int main()
00070 {
00071     
00072     MainConfig();
00073     // Mensaje Inicial
00074     SerialPort.printf("Hello World, System Run !!\n");
00075     
00076     
00077     
00078     
00079     while(1)
00080      {
00081 
00082             if(VCOMANDS[2] != 0)            // Si hemos enviado el comando de Ejecucion de Tono
00083                 {
00084                     BuzzerSound();          // Genera el Tono Seleccionado   
00085                 }
00086                 
00087             /// Visualizamos la informacion que hemos Modificado
00088             SerialPort.printf("VCOMANDS[%d] = %d  - VCOMANDS[9] = %d\n", i, VCOMANDS[i], VCOMANDS[9]);
00089             wait(1); 
00090             
00091             
00092     }
00093 
00094 
00095 }
00096 
00097 //******************************************************************************
00098 
00099 //                  Funciones Secundarias
00100 
00101 
00102 void stopBuzzer(void)                               // Detiene el Tono del Buzzer, poniendo el ancho de pulso a 0;
00103 {
00104     Buzzer.period(1); Buzzer.write(0);              // Volvemos a la configuracion Inicial del Buzzer       
00105     LengthTonoBuzzer.attach(&stopBuzzer,10000);     // Mientras no se envie un nuevo comando de tiempo para
00106                                                     // La interrupcion se deja un tiempo muy alto para generar la interrupcion
00107                                                     // Lo menos Posible
00108 }
00109 
00110 void BuzzerSound(void)
00111     {
00112         
00113     // Se calcula el valor del Periodo para el Buzzer limitando el ancho de banda de las
00114         // Frecuencias de entradas entre 1 y 20Hz ó 1 y 20KHz
00115         
00116         // hallamos el valor de 1 a 20 que se ha ingresado    
00117         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.
00118                     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.
00119                     else periodo_Buzzer = (float)(VCOMANDS[1] - 40);
00120                     periodo_Buzzer = (1 / periodo_Buzzer); //Se realiza la conversión de Frequencia a Periodo
00121 
00122                         
00123                     // Ahora si VCOMANDS[2] == 48 == '0'; la frecuencia estará en el orden de los Herz    
00124                     if (VCOMANDS[2] == 48) 
00125                         {
00126                             Buzzer.period(periodo_Buzzer);
00127                             VCOMANDS[2] = 0 ;
00128                         } 
00129                     // Pero si VCOMANDS[2] == 49 == '1'; la frecuencia estará en el orden de los KiloHerz
00130                     else if (VCOMANDS[2] == 49) 
00131                         {
00132                             Buzzer.period_us( (uint8_t)(periodo_Buzzer * 1000) );
00133                             VCOMANDS[2] = 0 ;
00134                         }
00135                     // Determinamos el tiempo por el cual estará sonando el Buzeer
00136                     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.
00137                     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.
00138                     else duracion_Tono = (VCOMANDS[0] - 40);
00139                     
00140                     Buzzer.write(50); // Se carga el ancho de pulso a 50 ya que en la 
00141                                       // Interrupcion se pone a 0   
00142                     // Se habilita la interrupcion del ticker y se le asigna
00143                     // La función que ejecutará cuando se genere la interrupción
00144                     LengthTonoBuzzer.attach(&stopBuzzer,duracion_Tono); // Cargamos el Tiempo(0-60 segundos) ingresado
00145                                                                         // y se lo Cargamos al Ticker del Buzzer
00146                                                                         
00147                     VCOMANDS[9] = (uint8_t) (periodo_Buzzer * 1000); // Almacenamos El resultado del periodo en VCOMANDS[9] para visualizarlo
00148                                                                      // Y confirmar que el valor sea el correcto
00149     
00150     
00151     
00152     
00153     }
00154 
00155 
00156 
00157 void ReadPort()
00158 {
00159 
00160 //   if  (SerialPort.readable())
00161     VCOMANDS[i] = SerialPort.getc();
00162     i++;
00163     if(i > 2) i = 0;
00164 
00165 
00166 }