- Materiais requisitados
- ADC em STM8S103F3P6
- Diagrama de circuito para ler valores de ADC no STM8S e exibir no LCD
- Biblioteca ADC para STM8S103F3P6
- Programa STM8S para ler tensão analógica e exibir no LCD
- Leitura da tensão analógica de dois potenciômetros usando STM8S
Se você é um leitor regular que está seguindo nossos Tutoriais do Microcontrolador STM8S, você sabe que em nosso último tutorial, aprendemos como fazer a interface de um LCD 16x2 com STM8s. Agora, continuando neste tutorial, aprenderemos como usar o recurso ADC em nosso microcontrolador STM8S103F3P6. Um ADC é um periférico muito útil em um microcontrolador que é frequentemente usado por programadores incorporados para medir unidades que estão em constante mudança, como tensão, corrente, temperatura, umidade, etc.
Como sabemos, “vivemos em um mundo analógico com dispositivos digitais”, o que significa que tudo ao nosso redor, como velocidade do vento, intensidade da luz, temperatura e tudo com que lidamos, como velocidade, velocidade, pressão, etc., são de natureza analógica. Mas nossos microcontroladores e microprocessadores são dispositivos digitais e não serão capazes de medir esses parâmetros sem um importante periférico chamado Conversores Analógico para Digital (ADC). Portanto, neste artigo, vamos aprender como usar ADC no Microcontrolador STM8S com o compilador C COMIC.
Materiais requisitados
Neste artigo, leremos dois valores de tensão analógica de dois potenciômetros e exibiremos seu valor ADC em um display LCD 16x2. Para fazer isso, precisaremos dos seguintes componentes.
- Placa de desenvolvimento STM8S103F3P6
- Programador ST-Link V2
- LCD 16x2
- Potenciômetros
- Fios de conexão
- Resistor 1k
ADC em STM8S103F3P6
Existem muitos tipos de ADC e cada microcontrolador tem suas próprias especificações. No STM8S103F3P6, temos um ADC com 5 canais e resolução de 10 bits; com resolução de 10 bits, poderemos medir o valor digital de 0 a 1024 e um ADC de 5 canais indica que temos 5 pinos no Microcontrolador que podem suportar ADC, esses 5 pinos estão destacados na imagem abaixo.
Como você pode ver, todos esses cinco pinos (AIN2, AIN3, AIN4, AIN5 e AIN6) são multiplexados com outros periféricos, o que significa que além de atuarem apenas como um pino ADC, esses pinos também podem ser usados para realizar outras comunicações, como por exemplo, os pinos 2 e 3 (AIN5 e AIN 6) não podem ser usados apenas para ADC, mas também para comunicação serial e funções GPIO. Observe que não será possível usar o mesmo pino para todos os três propósitos, portanto, se estivermos usando esses dois pinos para ADC, não poderemos realizar a comunicação serial. Outras características ADC importantes para STM8S103P36 podem ser encontradas na tabela abaixo retirada da ficha técnica.
Na tabela acima, Vdd representa a tensão de operação e Vss representa o terra. Portanto, em nosso caso, em nossa placa de desenvolvimento, temos o microcontrolador operando em 3,3 V, você pode verificar o diagrama de circuito da placa de desenvolvimento no tutorial de introdução ao STM8S. Com 3,3 V como tensão operacional, nossa frequência de clock ADC pode ser definida entre 1 a 4 MHz e nossa faixa de tensão de conversão está entre 0 V a 3,3 V. Isso significa que nosso ADC de 10 bits lerá 0 quando 0 V (Vss) for fornecido e lerá no máximo 1024 quando 3,3 V (Vdd) for fornecido. Podemos facilmente alterar esse 0-5 V alterando a tensão de operação do MCU, se necessário.
Diagrama de circuito para ler valores de ADC no STM8S e exibir no LCD
O diagrama de circuito completo usado neste projeto é fornecido abaixo, é muito semelhante ao tutorial do LCD STM8S que discutimos anteriormente.
Como você pode ver, os únicos componentes adicionais além do LCD são dois potenciômetros POT_1 e POT_2 . Esses potenciômetros são conectados às portas PC4 e PD6, que são os pinos ANI2 e ANI6, conforme discutido na imagem de pinagem anteriormente.
Os potenciômetros são conectados de tal forma que, ao variarmos, obteremos 0-5 V em nossos pinos analógicos. Estaremos programando nosso controlador para ler esta tensão analógica em valor digital (0 a 1024) e exibi-la na tela LCD. Em seguida, também calcularemos o valor de tensão equivalente e exibi-lo no LCD, lembre-se de que nosso controlador é alimentado por 3,3 V, portanto, mesmo se fornecermos 5 V para o pino ADC, ele será capaz de ler apenas de 0 V a 3,3 V.
Assim que as conexões forem feitas, meu hardware terá a seguinte aparência, conforme mostrado abaixo. Você pode ver os dois potenciômetros à direita e o programador ST-link à esquerda.
Biblioteca ADC para STM8S103F3P6
Para programar as funcionalidades ADC no STM8S, usaremos o compilador Cosmic C junto com as bibliotecas SPL. Mas para facilitar os processos, fiz outro arquivo de cabeçalho que pode ser encontrado no GitHub com o link abaixo.
Biblioteca ADC para STM8S103F3P6
Se você sabe o que está fazendo, pode criar um arquivo de cabeçalho usando o código acima e adicioná-lo ao diretório “incluir arquivos” na página do projeto. Caso contrário, siga o tutorial de introdução ao STM8S para saber como configurar seu ambiente de programação e compilador. Assim que sua configuração estiver pronta, seu IDE deve ter os seguintes arquivos de cabeçalho, pelo menos aqueles circundados em vermelho.
O arquivo de cabeçalho acima consiste em uma função chamada ADC_Read () . Esta função pode ser chamada em seu programa principal para obter o valor ADC em qualquer pino. Por exemplo, ADC_Read (AN2) retornará o valor ADC no pino AN2 como resultado. A função é mostrada abaixo.
sem sinal ADC_Read int (ADC_CHANNEL_TypeDef ADC_Channel_Number) {resultado int sem sinal = 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 você pode ver, podemos passar oito parâmetros para esta função e isso define como o ADC é configurado. Em nosso código de biblioteca acima, definimos o modo de conversão para contínuo e, em seguida, passamos um parâmetro pelo número do canal. E então temos que definir a frequência da CPU do nosso controlador, por padrão (se você não conectou um cristal externo), seu STM8S funcionará com um oscilador interno de 16Mhz. Portanto, mencionamos “ ADC1_PRESSEL_FCPU_D18 ” como o valor do pré-escalonador. Dentro desta função, estamos usando outros métodos definidos pelo arquivo de cabeçalho SPL stm8s_adc1.h . Começamos desinicializando os pinos ADC e depois ADC1_Init () para inicializar o periférico ADC. A definição desta função no manual do usuário SPL é mostrada abaixo.
Em seguida, configuramos o acionador externo usando um temporizador e desabilitamos o acionador externo, pois não o usaremos aqui. E então temos o alinhamento definido para a direita e os dois últimos parâmetros são usados para definir o gatilho Schmitt, mas iremos desativá-lo neste tutorial. Então, resumindo, vamos nosso ADC trabalhando em modo de conversão contínua no pino ADC necessário com gatilho externo e gatilho Schmitt desabilitado. Você pode verificar a ficha técnica se precisar de mais informações sobre como usar o gatilho externo ou a opção de gatilho Schmitt, não discutiremos isso neste tutorial.
Programa STM8S para ler tensão analógica e exibir no LCD
O código completo usado no arquivo main.c pode ser encontrado na parte inferior desta página. Depois de adicionar os arquivos de cabeçalho e arquivos de origem necessários, você deve ser capaz de compilar diretamente o arquivo principal. A explicação do código no arquivo principal é a seguinte. Não irei explicar o programa STM8S LCD, uma vez que já discutimos isso no tutorial anterior.
O objetivo do código será ler os valores ADC de dois pinos e convertê-los em um valor de tensão. Também exibiremos o valor ADC e o valor da tensão no LCD. Então, usei uma função chamada LCD_Print Var que pega uma variável no formato inteiro e a converte em um caractere para exibi-la no LCD. Usamos os operadores de módulo (%) e divisão (/) simples para obter cada dígito da variável e inserir variáveis como d1, d2, d3 e d4, conforme mostrado abaixo. Então, podemos usar a função LCD_Print_Char para exibir esses caracteres no 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); }
Em seguida, na função principal, temos quatro variáveis declaradas. Dois deles são usados para salvar o valor ADC (0 a 1024) e os outros dois são usados para obter o valor real da tensão.
sem sinal int ADC_value_1 = 0; sem sinal int ADC_value_2 = 0; int ADC_voltage_1 = 0; int ADC_voltage_2 = 0;
Em seguida, temos que preparar os pinos GPIO e a configuração do clock para ler a tensão analógica. Aqui estaremos lendo a tensão analógica dos pinos AIN2 e AIN6, que são os pinos PC4 e PD6, respectivamente. Temos que definir esses pinos em um estado flutuante, conforme mostrado abaixo. Também estaremos habilitando o periférico de relógio para ADC.
CLK_PeripheralClockConfig (CLK_PERIPHERAL_ADC, ENABLE); // Habilita Peripheral Clock for ADC GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT); GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT);
Agora que os pinos estão prontos, temos que entrar no loop while infinito para ler a tensão analógica. Como temos nosso arquivo de cabeçalho, podemos ler facilmente a tensão analógica dos pinos AIN2 e AIN 6 usando as linhas abaixo.
ADC_value_1 = ADC_Read (AIN2); ADC_value_2 = ADC_Read (AIN6);
A próxima etapa é converter essa leitura do ADC (0 a 1023) em uma tensão analógica. Dessa forma, podemos exibir o valor de tensão exato dado aos pinos AIN2 e AIN6. As fórmulas para calcular a tensão analógica podem ser fornecidas por-
Tensão Analógica = Leitura ADC * (3300/1023)
Em nosso caso, nos controladores STM8S103F3, temos um ADC com resolução de 10 bits, então usamos 1023 (2 ^ 10) . Também em nosso desenvolvimento alimentamos o controlador com 3,3 V, que é 3300, então dividimos 3300 por 1023 nas fórmulas acima. Aproximadamente 3300/1023 nos dará 3.226, portanto, em nosso programa, temos as seguintes linhas para medir a tensão ADC real usando a tensão ADC.
ADC_voltage_1 = ADC_value_1 * (3.226); // (3300/1023 = ~ 3.226) converter valor ADC 1 para 0 para 3300mV ADC_voltage_2 = ADC_value_2 * (3.226); // converter valor ADC 1 para 0 para 3300mV
A parte restante do código é usada apenas para exibir esses quatro valores na tela LCD. Também temos um atraso de 500ms para que o LCD seja atualizado a cada 500ms. Você pode reduzir isso ainda mais se precisar de atualizações mais rápidas.
Leitura da tensão analógica de dois potenciômetros usando STM8S
Compile o código e carregue-o na placa de desenvolvimento. Se você receber qualquer erro de compilação, certifique-se de ter adicionado todos os arquivos de cabeçalho e arquivos de origem conforme discutido anteriormente. Assim que o código for carregado, você deverá ver uma pequena mensagem de boas-vindas dizendo “ADC no STM8S” e então deverá ver a tela abaixo.
Os valores D1 e D2 indicam o valor ADC do pino Ain2 e AIN6 respectivamente. No lado direito, também temos os valores de tensão equivalente exibidos. Este valor deve ser igual à tensão que aparece nos pinos AIN2 e AIN6 respectivamente. Podemos verificar o mesmo usando um multímetro, também podemos variar os potenciômetros para verificar se o valor da tensão também muda de acordo.
O trabalho completo também pode ser encontrado no vídeo abaixo. Espero que tenha gostado do tutorial e aprendido algo útil, se você tiver alguma dúvida, deixe-os na seção de comentários abaixo. Você também pode usar nossos fóruns para iniciar uma discussão ou postar outras questões técnicas.