- Materiales necesarios
- ADC en STM8S103F3P6
- Diagrama de circuito para leer valores ADC en STM8S y mostrar en LCD
- Biblioteca ADC para STM8S103F3P6
- Programa STM8S para leer voltaje analógico y visualización en LCD
- Lectura de voltaje analógico de dos potenciómetros usando STM8S
Si es un lector habitual que sigue nuestros Tutoriales de microcontroladores STM8S, sabrá que en nuestro último tutorial, aprendimos cómo conectar una pantalla LCD de 16x2 con STM8. Ahora, continuando con este tutorial, aprenderemos cómo usar la función ADC en nuestro microcontrolador STM8S103F3P6. Un ADC es un periférico muy útil en un microcontrolador que a menudo es utilizado por programadores integrados para medir unidades que están en constante cambio como la variación de voltaje, corriente, temperatura, humedad, etc.
Como sabemos, "Vivimos en un mundo analógico con dispositivos digitales", es decir, todo lo que nos rodea, como la velocidad del viento, la intensidad de la luz, la temperatura y todo lo que nos ocupa, como la velocidad, la velocidad, la presión, etc., es de naturaleza analógica. Pero nuestros microcontroladores y microprocesadores son dispositivos digitales y no podrán medir estos parámetros sin un periférico importante llamado Convertidores Analógicos a Digitales (ADC). Entonces, en este artículo, aprendamos cómo usar ADC en el microcontrolador STM8S con el compilador COMIC C.
Materiales necesarios
En este artículo, leeremos dos valores de voltaje analógico de dos potenciómetros y mostraremos su valor ADC en una pantalla LCD de 16x2. Para hacer esto, necesitaremos los siguientes componentes.
- Placa de desarrollo STM8S103F3P6
- Programador ST-Link V2
- LCD de 16x2
- Potenciómetros
- Cables de conexión
- Resistencia de 1k
ADC en STM8S103F3P6
Hay muchos tipos de ADC y cada microcontrolador tiene sus propias especificaciones. En el STM8S103F3P6, tenemos un ADC con resolución de 5 canales y 10 bits; con una resolución de 10 bits, podremos medir el valor digital de 0 a 1024 y un ADC de 5 canales indica que tenemos 5 pines en el Microcontrolador que pueden soportar ADC, estos 5 pines están resaltados en la imagen de abajo.
Como puede ver, todos estos cinco pines (AIN2, AIN3, AIN4, AIN5 y AIN6) están multiplexados con otros periféricos, lo que significa que además de actuar como un pin ADC, estos pines también se pueden usar para realizar otras comunicaciones como por ejemplo, los pines 2 y 3 (AIN5 y AIN 6) no solo se pueden usar para ADC sino que también se pueden usar para comunicaciones en serie y funciones GPIO. Tenga en cuenta que no será posible utilizar el mismo pin para los tres propósitos, por lo que si estamos utilizando estos dos pines para ADC, no podremos realizar la comunicación en serie. Otras características importantes de ADC para STM8S103P36 se pueden encontrar en la siguiente tabla tomada de la hoja de datos.
En la tabla anterior, Vdd representa la tensión de funcionamiento y Vss representa la tierra. Entonces, en nuestro caso en nuestra placa de desarrollo, tenemos el microcontrolador funcionando a 3.3V, puede consultar el diagrama de circuito de la placa de desarrollo desde el comienzo con el tutorial STM8S. Con 3.3V como voltaje de operación, nuestra frecuencia de reloj ADC se puede configurar entre 1 y 4MHz y nuestro rango de voltaje de conversión está entre 0V y 3.3V. Esto significa que nuestro ADC de 10 bits leerá 0 cuando se proporcione 0V (Vss) y leerá un máximo de 1024 cuando se proporcionen 3.3V (Vdd). Podemos cambiar fácilmente este 0-5 V cambiando el voltaje de funcionamiento de la MCU si es necesario.
Diagrama de circuito para leer valores ADC en STM8S y mostrar en LCD
El diagrama de circuito completo utilizado en este proyecto se da a continuación, es muy similar al tutorial de LCD STM8S que discutimos anteriormente.
Como puede ver, los únicos componentes adicionales además de la pantalla LCD son dos potenciómetros POT_1 y POT_2 . Estos potenciómetros están conectados a los puertos PC4 y PD6, que son los pines ANI2 y ANI6 como se explicó en la imagen anterior.
Los potenciómetros están conectados de tal manera que cuando lo variamos, obtendremos 0-5 V en nuestros pines analógicos. Programaremos nuestro controlador para leer este voltaje analógico en valor digital (0 a 1024) y mostrarlo en la pantalla LCD. Luego también calcularemos el valor de voltaje equivalente y lo mostraremos en la pantalla LCD, recuerde que nuestro controlador está alimentado por 3.3V, por lo que incluso si proporcionamos 5V al pin ADC, solo podrá leer de 0V a 3.3V.
Una vez que se realizan las conexiones, mi hardware se ve así como se muestra a continuación. Puede ver los dos potenciómetros a la derecha y el programador ST-link a la izquierda.
Biblioteca ADC para STM8S103F3P6
Para programar las funcionalidades ADC en STM8S, usaremos el compilador Cosmic C junto con las bibliotecas SPL. Pero para facilitar los procesos, hice otro archivo de encabezado que se puede encontrar en GitHub con el enlace a continuación.
Biblioteca ADC para STM8S103F3P6
Si sabe lo que está haciendo, puede crear un archivo de encabezado utilizando el código anterior y agregarlo al directorio "incluir archivos" en la página de su proyecto. De lo contrario, siga el tutorial de introducción a STM8S para saber cómo configurar su entorno de programación y compilador. Una vez que su configuración esté lista, su IDE debe tener los siguientes archivos de encabezado, al menos los que están rodeados en rojo.
El archivo de encabezado anterior consta de una función llamada ADC_Read () . Esta función se puede llamar en su programa principal para obtener el valor ADC en cualquier pin. Por ejemplo, ADC_Read (AN2) devolverá el valor ADC en el pin AN2 como resultado. La función se muestra a continuación.
unsigned int ADC_Read (ADC_CHANNEL_TypeDef ADC_Channel_Number) {unsigned int resultado = 0; ADC1_DeInit (); ADC1_Init (ADC1_CONVERSIONMODE_CONTINUOUS, ADC_Channel_Number, ADC1_PRESSEL_FCPU_D18, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_ALL, DISABLE); ADC1_Cmd (ENABLE); ADC1_StartConversion (); while (ADC1_GetFlagStatus (ADC1_FLAG_EOC) == FALSE); resultado = ADC1_GetConversionValue (); ADC1_ClearFlag (ADC1_FLAG_EOC); ADC1_DeInit ();
Como ves, podemos pasar ocho parámetros a esta función y esto define cómo se configura el ADC. En nuestro código de biblioteca anterior, hemos configurado el modo de conversión en continuo y luego obtenemos el número de canal pasado un parámetro. Y luego tenemos que configurar la frecuencia de la CPU de nuestro controlador, por defecto (si no ha conectado un cristal externo), su STM8S funcionará con un oscilador interno de 16Mhz. Así que hemos mencionado “ ADC1_PRESSEL_FCPU_D18 ” como el valor del preescalador . Dentro de esta función, estamos usando otros métodos definidos por el archivo de encabezado SPL stm8s_adc1.h . Comenzamos por Desinicializar los pines ADC y luego ADC1_Init () para inicializar el periférico ADC. La definición de esta función del manual de usuario de SPL se muestra a continuación.
A continuación, configuramos el disparador externo usando un temporizador y deshabilitamos el disparador externo ya que no lo usaremos aquí. Y luego tenemos la alineación configurada a la derecha y los dos últimos parámetros se usan para configurar el disparador Schmitt, pero lo deshabilitaremos para este tutorial. Entonces, en pocas palabras, nuestro ADC funcionará en modo de conversión continua en el pin ADC requerido con el disparador externo y el disparador Schmitt desactivado. Puede consultar la hoja de datos si necesita más información sobre cómo usar el disparador externo o la opción de disparador Schmitt, no lo discutiremos en este tutorial.
Programa STM8S para leer voltaje analógico y visualización en LCD
El código completo utilizado en el archivo main.c se puede encontrar al final de esta página. Después de agregar los archivos de encabezado y de origen necesarios, debería poder compilar directamente el archivo principal. La explicación del código en el archivo principal es la siguiente. No explicaré el programa LCD STM8S ya que ya lo hemos discutido en el tutorial anterior.
El propósito del código será leer los valores de ADC de dos pines y convertirlos en un valor de voltaje. También mostraremos tanto el valor de ADC como el valor de voltaje en la pantalla LCD. Entonces, he usado una función llamada LCD_Print Var que toma una variable en formato entero y la convierte en un carácter para mostrarla en la pantalla LCD. Hemos utilizado los operadores de módulo simple (%) y división (/) para obtener cada dígito de la variable y colocar variables como d1, d2, d3 y d4 como se muestra a continuación. Entonces podemos usar la función LCD_Print_Char para mostrar estos caracteres en la pantalla LCD.
void LCD_Print_Var (int var) {char d4, d3, d2, d1; d4 = var% 10 + '0'; d3 = (var / 10)% 10 + '0'; d2 = (var / 100)% 10 + '0'; d1 = (var / 1000) + '0'; Lcd_Print_Char (d1); Lcd_Print_Char (d2); Lcd_Print_Char (d3); Lcd_Print_Char (d4); }
A continuación, bajo la función principal, tenemos cuatro variables declaradas. Dos de ellos se utilizan para guardar el valor de ADC (0 a 1024) y los otros dos se utilizan para obtener el valor de voltaje real.
unsigned int ADC_value_1 = 0; unsigned int ADC_value_2 = 0; int ADC_voltage_1 = 0; int ADC_voltage_2 = 0;
A continuación, tenemos que preparar los pines GPIO y la configuración del reloj para leer el voltaje analógico. Aquí estaremos leyendo el voltaje analógico de los pines AIN2 y AIN6 que son los pines PC4 y PD6 respectivamente. Tenemos que definir estos pines en un estado flotante como se muestra a continuación. También habilitaremos el periférico de reloj para ADC.
CLK_PeripheralClockConfig (CLK_PERIPHERAL_ADC, ENABLE); // Habilita el reloj periférico para ADC GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT); GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT);
Ahora que los pines están listos, tenemos que entrar en el bucle infinito while para leer el voltaje analógico. Como tenemos nuestro archivo de encabezado, podemos leer fácilmente el voltaje analógico de los pines AIN2 y AIN 6 usando las siguientes líneas.
ADC_value_1 = ADC_Read (AIN2); ADC_value_2 = ADC_Read (AIN6);
El siguiente paso es convertir esta lectura de ADC (0 a 1023) en un voltaje analógico. De esta manera, podemos mostrar el valor de voltaje exacto dado a los pines AIN2 y AIN6. Las fórmulas para calcular el voltaje analógico se pueden dar por:
Voltaje analógico = Lectura ADC * (3300/1023)
En nuestro caso de los controladores STM8S103F3, tenemos un ADC con resolución de 10 bits, por lo que hemos utilizado 1023 (2 ^ 10) . También en nuestro desarrollo alimenta el controlador con 3.3V, que es 3300, por lo que dividimos 3300 por 1023 en las fórmulas anteriores. Aproximadamente 3300/1023 nos dará 3,226, por lo que en nuestro programa, tenemos las siguientes líneas para medir el voltaje ADC real usando el voltaje ADC.
ADC_voltage_1 = ADC_value_1 * (3.226); // (3300/1023 = ~ 3.226) convierte el valor ADC 1 a 0 a 3300mV ADC_voltage_2 = ADC_value_2 * (3.226); // convierte el valor ADC 1 a 0 a 3300mV
La parte restante del código solo se usa para mostrar estos cuatro valores en la pantalla LCD. También tenemos un retraso de 500 ms para que la pantalla LCD se actualice cada 500 ms. Puede reducir esto aún más si necesita actualizaciones más rápidas.
Lectura de voltaje analógico de dos potenciómetros usando STM8S
Compile el código y cárguelo en su placa de desarrollo. Si obtiene algún error de compilación, asegúrese de haber agregado todos los archivos de encabezado y archivos de origen como se explicó anteriormente. Una vez que se cargue el código, debería ver un pequeño mensaje de bienvenida que dice "ADC en STM8S" y luego debería ver la siguiente pantalla.
El valor D1 y D2 indican el valor ADC del pin Ain2 y AIN6 respectivamente. En el lado derecho, también tenemos los valores de voltaje equivalentes mostrados. Este valor debe ser igual al voltaje que aparece en el pin AIN2 y AIN6 respectivamente. Podemos verificar lo mismo usando un multímetro, también podemos variar los potenciómetros para verificar si el valor de voltaje también cambia en consecuencia.
El trabajo completo también se puede encontrar en el video a continuación. Espero que hayas disfrutado del tutorial y hayas aprendido algo útil, si tienes alguna pregunta, déjala en la sección de comentarios a continuación. También puede utilizar nuestros foros para iniciar una discusión o publicar otras preguntas técnicas.