4.3 Modulación FSK. Ejercicios

4.3.1 Funcionamiento básico modulador FSK:

Se trata de diseñar una aplicación que permita verificar que se generan de forma correcta, un tono de 1300 Hz, y otro de 2100 Hz utilizando la clase DDS16Bits diseñada en la práctica 3.

Además se quiere verificar que el tiempo de bit corresponde con 1200 baudios. Para ello se generará la modulación de la siguiente secuencia de bits:

  • Secuencia: 1 0 1 0 1 0 1 0 1 0

  • Duración bit: 1/1200 s = 833.33 us

Incluiremos estas funcionalidades en lab41():

/**
  * @brief Genera muestras de audio con modulación FSK controlada por pulsaciones.
  *
  * @details Esta función implementa el ejercicio 1 del laboratorio. Genera una señal
  *          modulada en FSK donde la frecuencia de la portadora cambia según el estado
  *          de pulsación del botón SW2. Utiliza DDS (Direct Digital Synthesis) para
  *          generar las diferentes frecuencias correspondientes a bits '0' y '1'.
  *
  *          Comportamiento según pulsación:
  *          - **Pulsación corta**: Conmuta entre tonos de 1300 Hz y 2100 Hz
  *          - **Pulsación larga**: Inicia o termina la modulación de la secuencia
  *                                  alternante 101010101... a una velocidad de 1200 bps
  *          - **Sin pulsación**: Mantiene el estado actual de transmisión
  *
  *          Especificaciones FSK (estándar V.25):
  *          - Frecuencia para bit '0': 2100 Hz (marca)
  *          - Frecuencia para bit '1': 1300 Hz (espacio)
  *          - Velocidad de transmisión: 1200 bps (bits por segundo)
  *          - Muestras por bit: fs/1200 (ej: 48000/1200 = 40 muestras/bit)
  *
  * @param[in] pulsacion Estado de pulsación del botón SW2:
  *                      - 0: Sin pulsación detectada
  *                      - 1: Pulsación corta detectada
  *                      - 2: Pulsación larga detectada
  *
  * @return int16_t Muestra de audio de 16 bits con signo, lista para transmisión I2S.
  *                 El valor representa la amplitud instantánea de la señal FSK modulada
  *                 en el rango [-32768, 32767].
  */
  int16_t lab41(uint8_t pulsacion);
lab41() Simulación
  1. Configuración del proyecto.

    • Abre el proyecto lab4.

    • Selecciona el target Test_lab4, que utiliza un simulador para la depuración del código.

  1. Tareas a realizar.

    • Escribe el código de la función lab41() en el archivo ejercicios.c.

    • Asegúrate de que el código compila correctamente y no genera errores.

    • Revisa los casos de prueba definidos en la función main(), ubicada en el archivo test/test_lab4.c.

  2. Herramientas de análisis.

    • Inicializa el debugger ico_debug y abre la herramienta Analyzer desde el menú:

      View → Analysis Windows → Logic Analyzer.

      Analyzer mostrará la evolución temporal de las variables:

      • g_pls: simula el resultado de una pulsación.

      • g_sample: muestra la muestra actual generada por el DDS.

      • ..41\bit: indica el bit actual que se está transmitiendo.

      • time: muestra el tiempo actual de simulación.

    • Ejecuta la aplicación ico_run y corrige cualquier error funcional hasta que la función lab41() cumpla con las especificaciones.

  3. Test y Resultados esperados.

    Utiliza la herramienta Logic Analyzer para verificar que:

    • La señal generada por el DDS corresponde con la frecuencia adecuada para cada bit (1300 Hz para “1” y 2100 Hz para “0”).

    • La duración de cada bit es de 833.33 us (1200 baudios).


Nota

Para medir tiempos, se pueden utilizar el marcador y el cursor. La variable time es la encargada de indicar el tiempo en la simulación. En la figura siguiente se observa la medición del periodo de un tono de 1330Hz (1300 Hz → 769 µs):

una vez validado el funcionamiento en simulación, puedes implementar la misma funcionalidad en el hardware real utilizando el target lab4.

lab41() Prueba en hardware
  1. Configuración del proyecto.

    • Copia a shared/include y shared/src los archivos necesarios para utilizar los módulos pulsaciones y dds.

    • Abre el proyecto lab4.

    • Selecciona el target lab4.

  1. Tareas a realizar.

    • Modifica el código de src/main.c:

      • Habilita la interrupción de I2S en NVIC.

      • Modifica el bucle principal, añade la tarea 4 que utilice la función lab41(), y emplea un buffer circular para el intercambio de datos entre el bucle y la ISR del códec (I2S). Las interrupciones deben estar deshabilitadas mientras se accede al buffer circular desde el bucle principal.

    • Completa el código de la rutina de interrupción en src/isr.c para que extraiga muestras del buffer circular y las transmita al códec.

  2. Test y Resultados esperados.

    • Utiliza el osciloscopio para verificar que las señales generadas son las esperadas

4.3.1 Modulación FSK de un string de texto:

(Ejercicio opcional)

Se trata de diseñar una aplicación que permita transmitir un _string_ de caracteres utilizando modulación FSK según el estándar V23.

  • El sistema dispone de dos estados:

    • _Reposo_: Se transmite siempre un “1”.

    • _Transmisión_: Se transmiten los 8 bits de cada carácter del _string_, los datos se transmiten con el formato mostrado en la figura:

      • 1 bit de inicio (0)

      • 8 bits de datos (LSB primero)

      • 1 bit de parada (1)

      fig29
/**
  * @brief Genera muestras de audio con modulación FSK para transmisión de texto.
  *
  * @details Esta función implementa el ejercicio 2 del laboratorio. Genera una señal
  *          modulada en FSK que transmite un buffer de caracteres de texto. Cada carácter
  *          se codifica en sus bits individuales (típicamente 8 bits por carácter ASCII)
  *          y se transmite usando diferentes frecuencias para representar '0' y '1'.
  *          Utiliza DDS (Direct Digital Synthesis) para la generación de las portadoras FSK.
  *
  *          Comportamiento según pulsación:
  *          - **Sin pulsación/Pulsación corta**: Genera tono continuo de 1300 Hz (bit '1')
  *          - **Pulsación larga**: Inicia la modulación y transmisión del buffer de texto
  *                                  a una velocidad de 1200 bps
  *          - **Durante transmisión**: Continúa hasta finalizar el mensaje completo
  *
  *           Proceso de transmisión:
  *             1. Al recibir pulsación larga, comienza la transmisión
  *             2. Para cada carácter se transmite una trama de 10 bits:
  *                - **Bit de START**: 1 bit con valor '0' (2100 Hz)
  *                - **Datos**: 8 bits del carácter ASCII (LSB primero)
  *                - **Bit de STOP**: 1 bit con valor '1' (1300 Hz)
  *             3. Cada bit se transmite durante N muestras (fs/1200 para 1200 bps)
  *             4. Bit '0' → frecuencia de 2100 Hz (marca)
  *             5. Bit '1' → frecuencia de 1300 Hz (espacio)
  *             6. Al finalizar el mensaje, retorna al estado de reposo (tono de 1300 Hz)
  *
  *             Formato de trama asíncrona (10 bits por carácter):
  *             ```
  *             [START] [D0] [D1] [D2] [D3] [D4] [D5] [D6] [D7] [STOP]
  *                0    LSB                                 MSB     1
  *             ```
  *
  *          Especificaciones FSK:
  *          - Frecuencia para bit '0': 2100 Hz
  *          - Frecuencia para bit '1': 1300 Hz
  *          - Velocidad de transmisión: 1200 bps
  *          - Codificación: ASCII estándar (8 bits por carácter)
  *
  * @param[in] pulsacion Estado de pulsación del botón SW2:
  *                      - 0: Sin pulsación
  *                      - 1: Pulsación corta (genera tono continuo 1300 Hz)
  *                      - 2: Pulsación larga (inicia transmisión del mensaje)
  *
  * @param[in] frase Puntero a cadena de caracteres terminada en '\0' que se transmitirá
  *                  mediante modulación FSK. El buffer debe permanecer válido y constante
  *                  durante toda la transmisión.
  *                  Ejemplo: "SEMP 30319" o "HOLA MUNDO"
  *
  * @return int16_t Muestra de audio de 16 bits con signo, lista para transmisión I2S.
  *                 Representa la amplitud instantánea de la señal FSK correspondiente
  *                 al bit actual que se está transmitiendo, en el rango [-32768, 32767].
  *
  * @warning El puntero 'frase' debe apuntar a memoria válida durante toda la
  *          ejecución del programa. No copiar en buffer local.
  */
  int16_t lab42(uint8_t pulsacion, char frase[]);
lab42() Simulación
  1. Configuración del proyecto.

    • Abre el proyecto lab4.

    • Selecciona el target Test_lab4.

  1. Tareas a realizar.

    • Escribe el código de la función lab42() en el archivo ejercicios.c.

    • Asegúrate de que el código compila correctamente y no genera errores.

    • Revisa los casos de prueba definidos en la función main(), ubicada en el archivo test/test_lab4.c.

  2. Herramientas de análisis.

    • Inicializa el debugger ico_debug y abre la herramienta Analyzer desde el menú:

      View → Analysis Windows → Logic Analyzer.

      Analyzer mostrará la evolución temporal de las variables:

      • g_pls: simula el resultado de una pulsación.

      • g_sample: muestra la muestra actual generada por el DDS.

      • ..42\bit: indica el bit actual que se está transmitiendo.

      • time: muestra el tiempo actual de simulación.

    • Ejecuta la aplicación ico_run y corrige cualquier error funcional hasta que la función lab42() cumpla con la especificación deseada. La figura muestra la modulación del string "1" tras una pulsación larga.

una vez validado el funcionamiento en simulación, puedes implementar la misma funcionalidad en el hardware real utilizando el target lab4.

lab42() Prueba en hardware
  1. Configuración del proyecto.

    • Selecciona el target lab4.

  1. Tareas a realizar.

    • Estudia el código incluido en src/main.c y modifícalo para que utilice la función lab42() y un buffer circular para intercambiar datos con la ISR del códec.

  2. Test y Resultados esperados.

    • Utiliza el osciloscopio para verificar que las señales generadas son las esperadas

fig1