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

3. ADC (Convertidor Analógico-Digital)

Bienvenidos al tercer tutorial de Ophyra, donde utilizaremos el Convertidor Analogico-Digital (ADC). El STM32F407 de Ophyra cuenta con 16 canales analógicos distribuidos en tres módulos ADCs independientes. Sin embargo, en Ophyra están disponibles 8 canales.

Proyecto a realizar: Haremos que el LED RGB encienda de un color específico según el nivel de voltaje que se lea en el ADC.

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. Antes de activar el ADC a utilizar, es necesario revisar los canales disponibles que tiene Ophyra, ya que como se mencionó al inicio, de los 16 que tiene disponible el microcontrolador, únicamente 8 son los que estan al acceso en nuestra tarjeta Ophyra.

Para conocer cuáles canales están disponibles, revisamos el Manual de Ophyra en la sección “18. Puertos de expansión”. Buscando en cada pin los que incluyan la función ADC, podremos ver que los canales disponibles son:

  • IN0
  • IN1
  • IN2
  • IN3
  • IN8
  • IN9
  • IN14
  • IN15
Imagen 1. Pines y canales disponibles para el ADC.

Paso 2. En las categorías del lado izquierdo, abriremos la de Analog. En ella podemos ves los tres módulos ADC disponibles. Al hacerle clic, se mostrarán todos los 16 canales analógicos para activar. En este ejemplo se utilizará el primer módulo del ADC y se seleccionará el canal 2.

Imagen 2. Selección del módulo y canal del ADC.
Imagen 3. Verificamos que el pin PA2 se ha activado.

Paso 3. Ahora necesitamos configurar nuestro ADC. Nos cercioramos de que los parámetros estén configurados igual a los mostrados en la siguiente imagen.

Imagen 4. Configuración del ADC.

La descripción de las opciones es la siguiente:

  • Clock Prescaler → Divisor de la frecuencia del reloj del ADC (Dividido por 2, 4, 6 u 8)
  • Resolution → Selecciona la resolución para la conversión del ADC (6, 8, 10 ó 12 bits).
  • Data Alignment → Alineación de los datos leídos por el ADC (Alineación derecha o izquierda)
  • Scan Conversion Mode → Conversión en un arreglo de canales que se leen uno detrás de otro.
  • Continuous Conversion Mode → Modo de conversión continuo.
  • Discontinuous Conversion Mode → Modo de conversión discontinuo.
  • DMA Continuous Requests → Solicitud para lectura continua mediante DMA
  • End of Conversion Selection → Bandera de final de conversión (puede ser tras la conversión de cada canal o tras la conversión de todos).
  • Number of Conversion → Número de canales a convertir (Debe ser un número entre 1 y 16)
  • External Trigger Conversion Source → Selecciona el evento externo para iniciar la conversión (Puede ser activado por software o por algún Timer)
  • External Trigger Conversion Edge → Disparo que selecciona polaridad externa y habilita el inicio de un grupo regular (Este parámetro es cambiado automáticamente por el software).
  • Rank → Rango para la secuencia de conversión (Debe ser un número entre 1 y 16)
  • Channel → Canal de conversión
  • Sampling Time → Tiempo de muestreo (Se indica por número de ciclos)
  • Enable Analog WatchDog Mode → Habilita el modo de perro guardián.

Paso 4. Como en esta práctica haremos uso completo del LED RGB de Ophyra para visualizar los niveles de voltaje, debemos configurar los tres pines que le corresponden (para recordar cómo se activan y configuran, puede volver a revisar el tutorial 1. Puertos GPIO).

Imagen 5. Activando los pines del LED RGB.

Paso 5. 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 OphyraAnexo 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 6. Generando código.

Realizando el programa

Hay ocasiones en las que las funciones o palabras predefinidas pueden llegar a ser confusas cuando se emplean en diferentes aplicaciones. Para ello se pueden hacer etiquetas o definiciones, que nos sirve para darle un segundo nombre a algo que estaba previamente definido.

Paso 6. Haremos dos definiciones para poder identificar mejor cuál es el estado lógico que enciende o apaga nuestro LED RGB. Tenemos una sección llamada Private define, que podemos utilziar para escribir todas nuestras definiciones. Una definición tiene la siguiente estructura:

#define NOMBRE_NUEVO NOMBRE_ORIGINAL

En donde va el NOMBRE_ORIGINAL se coloca la palabra, variable, función o número que se le va a querer agregar un segundo nombre. En el NUEVO_NOMBRE se coloca la nueva palabra o nombre con la que lo identificaremos.

El código que tendremos es el siguiente:

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
#define Enc_LED GPIO_PIN_RESET
#define Apa_LED GPIO_PIN_SET
/* USER CODE END PD */

Lo que se está haciendo es que a la palabra reservada GPIO_PIN_RESET se le identifique también como Enc_LED. Así, al escribir el nuevo nombre que nos resulta más claro, el código lo verá como un sinónimo al nombre original, y hará las acciones correspondientes como si hubiésemos escrito ese nombre. En otras palabras, si llamáramos la función HAL_GPIO_WritePin(LED_Rojo_GPIO_Port, LED_Rojo_Pin, Enc_LED); el programa lo interpreta como si hubiésemos escrito HAL_GPIO_WritePin(LED_Rojo_GPIO_Port, LED_Rojo_Pin, GPIO_PIN_RESET);

Paso 7. Ahora, nos dirigimos a la sección del bucle infinito, o while infinito, y escribiremos el siguiente código:

while (1)
{
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
    // Inicia la conversión del ADC
    HAL_ADC_Start(&hadc1);
    // Obtiene el valor de la conversión del ADC y se guarda en variable.
    int Resultado = HAL_ADC_GetValue(&hadc1);

    if (Resultado <= 1024) {                                         // COLOR OBSERVADO ROJO
        HAL_GPIO_WritePin(LED_Rojo_GPIO_Port, LED_Rojo_Pin, Enc_LED);
        HAL_GPIO_WritePin(LED_Verde_GPIO_Port, LED_Verde_Pin, Apa_LED);
        HAL_GPIO_WritePin(LED_Azul_GPIO_Port, LED_Azul_Pin, Apa_LED);
    } else if (Resultado > 1024 && Resultado <= 2048) {              // COLOR OBSERVADO AMARILLO
        HAL_GPIO_WritePin(LED_Rojo_GPIO_Port, LED_Rojo_Pin, Enc_LED);
        HAL_GPIO_WritePin(LED_Verde_GPIO_Port, LED_Verde_Pin, Enc_LED);
        HAL_GPIO_WritePin(LED_Azul_GPIO_Port, LED_Azul_Pin, Apa_LED);
    } else if (Resultado > 2048 && Resultado <= 3072) {              // COLOR OBSERVADO VERDE
        HAL_GPIO_WritePin(LED_Rojo_GPIO_Port, LED_Rojo_Pin, Apa_LED);
        HAL_GPIO_WritePin(LED_Verde_GPIO_Port, LED_Verde_Pin, Enc_LED);
        HAL_GPIO_WritePin(LED_Azul_GPIO_Port, LED_Azul_Pin, Apa_LED);
    } else if (Resultado > 3072) {                                   // COLOR OBSERVADO BLANCO
        HAL_GPIO_WritePin(LED_Rojo_GPIO_Port, LED_Rojo_Pin, Enc_LED);
        HAL_GPIO_WritePin(LED_Verde_GPIO_Port, LED_Verde_Pin, Enc_LED);
        HAL_GPIO_WritePin(LED_Azul_GPIO_Port, LED_Azul_Pin, Enc_LED);
    }
}

El código comienza con la función HAL_ADC_Start(&hadc1), que se encarga de iniciar la conversión del ADC. Nótese que únicamente inicia la conversión del ADC, mas no llega a manipular el resultado. Para obtener el resultado de la conversión, se utiliza la siguiente función de HAL_ADC_GetValue(&hadc1), y ese resultado se require guardar en una variable (en nuestro caso la variable Resultado.

Lo siguiente que realiza el código es comparar el valor obtenido (que puede ser entre 0 y 4095 al utilizar el ADC a 12 bits) con un rango de valores preestablecidos. En resúmen, el algoritmo realiza lo siguiente:

  • Si el valor del ADC es menor o igual a 1024, se enciende el LED Rojo y se apagan los demás.
  • En caso de ser mayor a 1024 y menor o igual a 2048, se encienden los LED Rojo y Verde y se apaga el Azul, resultando en un color amarillo visible.
  • Al ser mayor a 2048 y menor o igual a 3072, se enciende el LED Verde y se apagan los demás.
  • Siendo mayor a 3072, se encienden los tres LEDs, resultando en un color blanco visible.

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.

Preparando nuestra tarjeta Ophyra

Ahora es momento de preparar el harware que necesitaremos para poder probar el funcionamiento de nuestro proyecto. El material a necesitar es:

  • Cables conectores macho-macho o cable para protoboard.
  • Un protoboard o tarjeta de prototipado
  • Un potenciómetro de cuaquier valor mayor a 1KOhm; 5KOhm es un valor recomendado.
  • Una tarjeta Ophyra.

Necesitamos conectar nuestro potenciómetro con nuestra tarjeta para poder hacer los cambios de niveles de voltaje. El diagrama de conecciones es como el que se muestra en la siguiente imagen:

Imagen 7. Diagrama de conecciones.

ADVERTENCIA

Nunca llegues a suministrarle a las entradas analógicas voltajes mayores a 3.3 Volts o podría dañarse el canal.


Resultados

Podemos ver en el siguiente GIF que al girar el potenciómetro, se puede observar cómo cambia de color el LED RGB de Ophyra. Conforme el voltaje aumenta de 0 a 3.3 volts, el ADC entregará valores de 0 a 4095. El algoritmo encenderá la secuencia de colores Rojo → Amarillo → Verde → Blanco conforme giramos el potenciómetro y el voltaje aumenta. Al hacer el movimiento contrario, podemos ver que la secuencia de colores también va regresando.

Conclusiones

Hemos aprendido a utilizar el ADC de la Ophyra, además de aprender un nuevo tipo de instrucción (la definición). Como siguientes retos de protecto podrias implementar un segundo canal de lectura y que el LED RGB prenda de cierto color dependiendo de cual de los dos sea mayor.

Para mayor información sobre la utilización de múltiples canales y otros medios de conversión, consulte el manual RM0090 del STM32F407 en la sección 13. Para más referencia sobre las APIs de las Capas de Abstracción de Hardware (HAL) que están disponibles para el control del ADC consulte el manual UM1725 en la sección 6.

Para seguir aprendiendo más sobre los recursos básicos de la Ophyra, te recomendamos seguir con el siguiente tutorial: 4. DAC (Convertidor Digital-Analógico).

fake rolex for sale