Envío Gratis en compras mínimas de $1200 mxn Enviamos a toda la Republica Mexicana
Buscar

4. DAC (Convertidor Digital-Analógico)

Bienvenidos a este tutorial donde se utilizará uno de los dos canales que tiene el DAC del microcontrolador de Ophyra.

Proyecto a realizar: Se generará una señal diente de sierra. Se debe tener en cuenta que esta señal será generada dentro del bucle infinito, por lo que al incrementar el número de instrucciones dentro de éste, la frecuencia de la señal generada disminuirá.

 

Configurando el hardware

Una vez ya creado nuestro proyecto (véase el tutorial preliminar de Crear un Proyecto para Ophyra), el siguiente paso es activar los recursos a utilizar.

Paso 1. En las categorías del lado izquierdo, abriremos la de Analog. En ella se puede ver un módulo DAC. Al activarlo, necesitamos seleccionar después el canal. En ete ejemplo se utilizará el Canal 1.

Imagen 1. Activando el DAC.
Imagen 2. Pin del DAC activado.

 

Paso 2. Pasamos ahora a la configuración del DAC. En este caso contamos únicamente con dos parámetros, tales como se muestran en la siguiente imagen:

Imagen 3. Parámetros de configuración del DAC.

El primero de los parámetros, el Output Buffer, nos permite tener un dato de salida por el DAC. El Trigger es una señal que le permite al programador tener el control de la activación del DAC, ya sea por software o por algún Timer de los disponibles (Imagen 4).

Imagen 4. Opciones de Trigger del DAC.

Por el momento, dejaremos las opciones como se muestran en la Imagen 3.

 

Paso 3. Ahora es momento de generar nuestro código.


ADVERTENCIA

Si durante la creación de tu proyecto no llegaste a configurar el reloj de la tarjeta o a configurar los detalles del proyecto respecto a la generación del código, aún estás a tiempo.

Para sabér cómo hacer esas configuraciones, dirígase al tutorial preliminar de Crear un Proyecto para Ophyra y siga los pasos en Anexo 1: Configurar el reloj de la Ophyra y Anexo 2: Configurar los detalles el proyecto.


 

Para generar el código, basta con hacer clic en el botón de Guardar que se encuentra en la barra de herramientas en la parte superior. La interfaz cambiará y comenzará a cargar el código, así como se muestra en la siguiente imagen.

Imagen 5. Generando código.

 

Realizando el programa

Paso 4. Antes de entrar al ciclo infinito, debemos de activar o inicia el DAC. Para esto se utiliza la función

HAL_DAC_Start(DAC_HandleTypeDef *hdac, uint32_t Channel)

Esta función recibe dos parámetros, como se puede observar. El primero es el DAC que estamos utilizando, mientras que el segundo es el canal.

Al solo tener un DAC en este microcontrolador, no se debe agregar un número como en los demás recursos; es decir, no existe un DAC1 o DAC2 y simplemente se debe agregar el recurso que se usa (&hdac). Por otro lado, para el segundo parámetro que pide el canal, tenemos únicamente dos opciones: DAC_CHANNEL_1 o DAC_CHANNEL_2.

Ya que nosotros elegimos utilizar el canal 1 del DAC, nuestro código queda de la siguiente manera:

 /* Initialize all configured peripherals */
 MX_GPIO_Init();
 MX_DAC_Init(); 
 /* USER CODE BEGIN 2 */
 HAL_DAC_Start(&hdac, DAC_CHANNEL_1);
 /* USER CODE END 2 */

 

Paso 5. La función que controla el daco hacia el DAC es:

HAL_DAC_SetValue(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t Alignment, uint32_t Data)

Esta función requiere de cuatro parámetros:

  1. Puntero del DAC a utilizar (volveremos a utilizar &hdac).
  2. Canal del DAC a utilizar (elegimos utilizar el DAC_CHANNEL_1).
  3. Formato del dato que interpretará el DAC (Recordemos que no es lo mismo 10000000 que 00000001 en binario, pues el primero representa 128 mientra que el segundo representa 1 en base 10). Si deseamos tener el estándar en la lectura de números decimales a binarios, es decir, que el bit menos significativo se encuentre del lado izquierdo y el bit más significativo se encuentra al lado derecho, deberemos escribirDAC_ALIGN_12B_R, que representa una alineación a la derecha.
  4. Dato a escribir en el DAC.

Una señal diente de sierra tiene como característica el tener una pendiente de 1 y al llegar a su valor máximo, su valor se reinicia a cero. Si esto lo pasamos a código, podemos intuir que requerimos de un contador y al llegar al valor máximo, regresará a ser cero.

La resolución del DAC es a 12 bits, por lo cual tenemos 4096 datos. Para que el efecto se pueda ver, colocaremos un retardo de 10 milisegundos y al llegar al máximo valor reiniciaremos el contador. El código entonces quedaría de la siguiente manera:

/* USER CODE BEGIN 2 */
uint16_t conta = 0;

HAL_DAC_Start(&hdac, DAC_CHANNEL_1);
HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 0);
/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
    if (conta == 4095)
        conta = 0;
    else
        conta++;
    
    HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, conta);
}
/* USER CODE END 3 */

 

Paso final – Cargar el programa a la Ophyra

Ahora, falta programar nuestro código a la tarjeta Ophyra. Las instrucciones se encuentran en el tutorial del Paso final – Cargar el programa a la Ophyra.

 

Resultados

Para poder visualizar los resultados de nuestro proyecto, requerimos de conectarle un osciloscopio para poder ver la señal generada. En el siguiente GIF se muestra que una vez que el microcontrolador inicia, está generando la señal tipo sierra.

 

Conclusiones

Hemos configurado y programado el DAC del microcontrolador de Ophyra. Ahora puedes realizar ejercicios como la generación de diferentes tipos de señal, un control del DAC utilizando un ADC, un control de un buzer, o generar diferentes frecuencias con una señal sinusoidal guardando los valores obtenidos de un software matemático como Matlab.

Para seguir aprendiendo más sobre los recursos básicos de la Ophyra, te recomendamos seguir con el siguiente tutorial: 5. PWM (Modulación por Ancho de Pulso).