This Program generate a audibly frequency on a Buzzer
Embed:
(wiki syntax)
Show/hide line numbers
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 }
Generated on Tue Aug 23 2022 16:58:35 by
1.7.2