- Comparando ADC em Arduino e STM32F103C8
- ADC em STM32
- Como um sinal analógico é convertido em formato digital
- Pinos ADC em STM32F103C8T6
- Componentes necessários
- Diagrama de circuito e explicações
- Programação STM32 para leitura de valores ADC
Um recurso comum usado em quase todas as aplicações embarcadas é o módulo ADC (conversor analógico para digital). Esses conversores analógico para digital podem ler a tensão de sensores analógicos como sensor de temperatura, sensor de inclinação, sensor de corrente, sensor Flex e muito mais. Portanto, neste tutorial, aprenderemos como usar ADC no STM32F103C8 para ler tensões analógicas usando o IDE Energia. Faremos a interface de um pequeno potenciômetro com a placa STM32 Blue Pill e forneceremos uma voltagem variável a um pino analógico, leremos a voltagem e exibiremos na tela LCD 16x2.
Comparando ADC em Arduino e STM32F103C8
Na placa Arduino, ele contém 6 canais (8 canais no Mini e Nano, 16 no Mega), ADC de 10 bits com uma faixa de tensão de entrada de 0V – 5V. Isso significa que ele mapeará tensões de entrada entre 0 e 5 volts em valores inteiros entre 0 e 1023. Agora, no caso do STM32F103C8, temos 10 canais, ADC de 12 bits com uma faixa de entrada de 0V -3,3V. Ele mapeará tensões de entrada entre 0 e 3,3 volts em valores inteiros entre 0 e 4095.
ADC em STM32
O ADC embutido nos microcontroladores STM32 usa o princípio SAR (registro de aproximação sucessiva), pelo qual a conversão é realizada em várias etapas. O número de etapas de conversão é igual ao número de bits no conversor ADC. Cada etapa é controlada pelo relógio ADC. Cada relógio ADC produz um bit do resultado à saída. O design interno do ADC é baseado na técnica do capacitor chaveado. Se você é novo no STM32, consulte nosso tutorial Primeiros passos com o STM32.
Resolução de 12 bits
Este ADC é um ADC de 12 bits de 10 canais. Aqui, o termo 10 canais implica que existem 10 pinos ADC usando os quais podemos medir a tensão analógica. O termo 12 bits implica a resolução do ADC. 12 bits significa 2 elevado à potência de dez (2 12), que é 4096. Este é o número de etapas de amostra para nosso ADC, então a faixa de nossos valores ADC será de 0 a 4095. O valor aumentará de 0 a 4095 com base no valor da tensão por etapa, que pode ser calculada pela fórmula
VOLTAGEM / PASSO = TENSÃO DE REFERÊNCIA / 4096 = (3,3 / 4096 = 8,056mV) por unidade.
Como um sinal analógico é convertido em formato digital
Como os computadores armazenam e processam apenas valores binários / digitais (1's e 0's). Portanto, os sinais analógicos, como a saída do sensor em volts, devem ser convertidos em valores digitais para processamento e a conversão precisa ser precisa. Quando uma tensão analógica de entrada é fornecida ao STM32 em suas entradas analógicas, o valor analógico é lido e armazenado em uma variável inteira. Esse valor analógico armazenado (0-3,3 V) é convertido em valores inteiros (0-4096) usando a fórmula abaixo:
TENSÃO DE ENTRADA = (Valor ADC / Resolução ADC) * Tensão de Referência
Resolução = 4096
Referência = 3,3V
Pinos ADC em STM32F103C8T6
Existem 10 pinos analógicos no STM32 de PA0 a PB1.
Verifique também como usar ADC em outros microcontroladores:
- Como usar ADC no Arduino Uno?
- Interface do ADC0808 com o microcontrolador 8051
- Usando Módulo ADC do Microcontrolador PIC
- Tutorial do Raspberry Pi ADC
- Como usar ADC em MSP430G2 - Medindo Tensão Analógica
Componentes necessários
- STM32F103C8
- LCD 16 * 2
- Potenciômetro 100k
- Tábua de pão
- Fios de conexão
Diagrama de circuito e explicações
O diagrama de circuito para fazer a interface 16 * 2 LCD e entrada analógica para uma placa STM32F103C8T6 é mostrado abaixo.
As conexões que são feitas para LCD são fornecidas abaixo:
Pin no LCD |
Nome do pino LCD |
Nome do pino STM32 |
1 |
Ground (Gnd) |
Solo (G) |
2 |
VCC |
5V |
3 |
VEE |
Pino do centro do potenciômetro |
4 |
Register Select (RS) |
PB11 |
5 |
Leitura / Escrita (RW) |
Solo (G) |
6 |
Habilitar (EN) |
PB10 |
7 |
Bit de dados 0 (DB0) |
Sem conexão (NC) |
8 |
Bit de dados 1 (DB1) |
Sem conexão (NC) |
9 |
Bit de dados 2 (DB2) |
Sem conexão (NC) |
10 |
Dados Bit 3 (DB3) |
Sem conexão (NC) |
11 |
Dados Bit 4 (DB4) |
PB0 |
12 |
Bit de dados 5 (DB5) |
PB1 |
13 |
Bit de dados 6 (DB6) |
PC13 |
14 |
Dados Bit 7 (DB7) |
PC14 |
15 |
LED positivo |
5V |
16 |
LED negativo |
Solo (G) |
As conexões são feitas de acordo com a tabela fornecida acima. Existem dois potenciômetros presentes no circuito, o primeiro é usado para divisor de tensão, que pode ser usado para variar a tensão e fornecer entrada analógica para STM32. O pino esquerdo deste potenciômetro obtém a tensão positiva de entrada do STM32 (3,3 V) e o pino direito é conectado ao aterramento, o pino central do potenciômetro é conectado ao pino de entrada analógica (PA7) do STM32. O outro potenciômetro é usado para variar o contraste do display LCD. A fonte de alimentação para STM32 é fornecida por meio de fonte de alimentação USB de um PC ou laptop.
Programação STM32 para leitura de valores ADC
Em nosso tutorial anterior, aprendemos sobre como programar a placa STM32F103C8T6 usando a porta USB. Portanto, não precisamos de um programador FTDI agora. Basta conectá-lo ao PC via porta USB do STM32 e começar a programar com ARDUINO IDE. Programar seu STM32 no ARDUINO IDE para ler voltagem analógica é muito simples. É o mesmo que a placa Arduino. Não há necessidade de alterar os pinos do jumper do STM32.
Neste programa irá ler o valor analógico e calcular a tensão com esse valor e então exibir ambos, valores analógicos e digitais, na tela de LCD.
Primeiro defina os pinos do LCD. Eles definem a qual pino do STM32 os pinos do LCD são conectados. Você pode modificar de acordo com seus requisitos.
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; // mencione os nomes dos pinos com o LCD conectado a
Em seguida, incluímos o arquivo de cabeçalho para o display LCD. Isso chama a biblioteca que contém o código de como o STM32 deve se comunicar com o LCD. Certifique-se também de que a função Liquid Crystal seja chamada com os nomes dos pinos que acabamos de definir acima.
#incluir
Dentro da função setup () , daríamos apenas uma mensagem introdutória a ser exibida na tela LCD. Você pode aprender sobre a interface do LCD com o STM32.
lcd.begin (16, 2); // Estamos usando um LCD 16 * 2 lcd.clear (); // Limpa a tela lcd.setCursor (0, 0); // Na primeira linha, primeira coluna lcd.prin t ("CIRCUITDIGEST"); // Imprime isso lcd.setCursor (0, 1); // Na segunda linha, primeira coluna n lcd.print ("STM32F103C8"); // Imprimir thi s delay (2000); // espera por dois segundos lcd.clear (); // Limpa a tela lcd.setCursor (0, 0); // Na primeira linha, primeira coluna lcd.print ("USING ADC IN"); // Imprime isso lcd.setCursor (0,1); // Na segunda linha da primeira coluna lcd.print ("STM32F103C8"); // Imprimir este atraso (2000); // espera por dois segundos lcd.clear (); // Limpar a tela
Finalmente, dentro de nossa função loop infinito () , começamos a ler a tensão analógica fornecida ao pino PA7 do potenciômetro. Como já discutimos, o microcontrolador é um dispositivo digital e não pode ler o nível de tensão diretamente. Usando a técnica SAR, o nível de tensão é mapeado de 0 a 4096. Esses valores são chamados de valores ADC, para obter este valor ADC basta usar a seguinte linha
int val = analogRead (A7); // leia o valor ADC do pino PA 7
Aqui, a função analogRead () é usada para ler o valor analógico do pino. Por fim, salvamos este valor em uma variável chamada “ val ”. O tipo desta variável é inteiro porque obteremos apenas valores variando de 0 a 4096 para serem armazenados nesta variável.
A próxima etapa seria calcular o valor da tensão a partir do valor ADC. Para fazer isso, temos as seguintes fórmulas
Tensão = (ADC Valor resolução / ADC) * Voltag Referência e
No nosso caso já sabemos que a resolução ADC do nosso microcontrolador é 4096. O valor ADC também se encontra na linha anterior e armazenou a variável chamada val. A tensão de referência é igual à tensão na qual o microcontrolador está operando. Quando a placa STM32 é alimentada via cabo USB, a voltagem operacional é 3,3V. Você também pode medir a tensão de operação usando um multímetro no Vcc e o pino terra na placa. Portanto, a fórmula acima se encaixa em nosso caso, conforme mostrado abaixo
tensão flutuante = (flutuante (val) / 4096) * 3,3; // fórmulas para converter o valor ADC para tensã e
Você pode ser confundido com a linha float (val). Isso é usado para converter a variável “val” do tipo de dados int para o tipo de dados “float”. Esta conversão é necessária porque somente se obtivermos o resultado de val / 4096 em float podemos multiplicá-lo por 3,3. Se o valor for recebido em número inteiro será sempre 0 e o resultado também será zero. Depois de calcularmos o valor ADC e a tensão, tudo o que resta é exibir o resultado na tela LCD, o que pode ser feito usando as seguintes linhas
lcd.setCursor (0, 0); // define o cursor para a coluna 0, linha 0 lcd.print ("ADC Val:"); lcd.print (val); // Exibir valor ADC lcd.setCursor (0, 1); // define o cursor para a coluna 0, linha 1 lcd.print ("Voltage:"); lcd.print (voltagem); // Exibir tensão
O código completo e o vídeo de demonstração são fornecidos abaixo.