- O que é PWM (pulso com modulação)?
- PWM em STM32
- Componentes necessários
- Detalhes do pino de STM32
- Diagrama de circuito e conexões
- Programando STM32
No artigo anterior, vimos sobre a conversão ADC usando STM32. Neste tutorial, aprenderemos sobre PWM (Modulação por Largura de Pulso) no STM32 e como podemos controlar o brilho do LED ou a velocidade da ventoinha DC usando a técnica PWM.
Sabemos que existem dois tipos de sinal: Analógico e Digital. Os sinais analógicos têm tensões como (3V, 1V… etc) e os sinais digitais têm (1 'e 0's). As saídas dos sensores são de sinais analógicos e esses sinais analógicos são convertidos em digitais usando ADC, porque os microcontroladores só entendem digital. Depois de processar esses valores ADC, novamente a saída precisa ser convertida na forma analógica para acionar os dispositivos analógicos. Para isso, usamos certos métodos como PWM, conversores digital para analógico (DAC), etc.
O que é PWM (pulso com modulação)?
PWM é uma forma de controlar os dispositivos analógicos usando valores digitais como controlar a velocidade do motor, brilho de um led etc. Sabemos que o motor e o led funcionam com sinal analógico. Mas o PWM não fornece saída analógica pura, o PWM parece um sinal analógico feito por pulsos curtos, que é fornecido pelo ciclo de serviço.
Ciclo de trabalho do PWM
A porcentagem de tempo em que o sinal PWM permanece ALTO (no tempo) é chamada de ciclo de serviço. Se o sinal estiver sempre LIGADO, ele está em 100% do ciclo de trabalho e se estiver sempre desligado, ele está em 0% do ciclo de trabalho.
Ciclo de trabalho = tempo para ligar / (tempo para ligar + tempo para desligar)
PWM em STM32
STM32F103C8 tem 15 pinos PWM e 10 pinos ADC. Existem 7 temporizadores e cada saída PWM é fornecida por um canal conectado a 4 temporizadores. Ele tem resolução PWM de 16 bits (2 16), ou seja, contadores e variáveis podem chegar a 65535. Com uma taxa de clock de 72 MHz, uma saída PWM pode ter um período máximo de cerca de um milissegundo.
- Portanto, o valor de 65535 dá BRILHO TOTAL do LED E VELOCIDADE COMPLETA do ventilador DC (ciclo de trabalho de 100%)
- Da mesma forma, o valor de 32767 dá MEIO BRILHO do LED E MEIA VELOCIDADE do ventilador DC (50% do ciclo de trabalho)
- E o valor de 13107 dá (20%) BRILHO E (20%) VELOCIDADE (20% do ciclo de trabalho)
Neste tutorial, estamos usando o potenciômetro e o STM32 para variar o brilho do LED e a velocidade de uma ventoinha DC pela técnica PWM. Um LCD 16x2 é usado para exibir o valor ADC (0-4095) e a variável modificada (valor PWM) que é produzida (0-65535).
Aqui estão alguns exemplos de PWM com outro microcontrolador:
- Gerando PWM usando Microcontrolador PIC com MPLAB e XC8
- Controle servo motor com Raspberry Pi
- Dimmer LED baseado em Arduino usando PWM
- Modulação de largura de pulso (PWM) usando MSP430G2
Verifique todos os projetos relacionados a PWM aqui.
Componentes necessários
- STM32F103C8
- Ventilador DC
- ULN2003 Motor Driver IC
- LED (VERMELHO)
- LCD (16x2)
- Potenciômetro
- Tábua de pão
- Bateria 9V
- Jumper Wires
Ventilador DC: O ventilador DC usado aqui é o ventilador BLDC de um PC antigo. Requer uma fonte externa, então estamos usando uma bateria de 9 Vcc.
ULN2003 Motor Driver IC: É usado para acionar o motor em uma direção, pois o motor é unidirecional e também é necessária alimentação externa para o ventilador. Saiba mais sobre o circuito do driver do motor baseado em ULN2003 aqui. Abaixo está o diagrama de imagem de ULN2003:
Os pinos (IN1 a IN7) são pinos de entrada e (OUT 1 a OUT 7) são pinos de saída correspondentes. COM recebe a tensão de fonte positiva necessária para os dispositivos de saída.
LED: LED de cor VERMELHA é usado que emite luz VERMELHA. Todas as cores podem ser usadas.
Potenciômetros: Dois potenciômetros são usados, um é para divisor de tensão para entrada analógica para ADC e outro é para controlar o brilho do led.
Detalhes do pino de STM32
Como podemos ver, os pinos PWM são indicados em formato de onda (~), existem 15 desses pinos, os pinos ADC são representados em verde, 10 pinos ADC estão lá, os quais são usados para entradas analógicas.
Diagrama de circuito e conexões
As conexões do STM32 com vários componentes são explicadas a seguir:
STM32 com entrada analógica (ADC)
O potenciômetro presente no lado esquerdo do circuito é usado como regulador de tensão que regula a tensão do pino de 3,3V. A saída do potenciômetro, ou seja, o pino central do potenciômetro, está conectado ao pino ADC (PA4) do STM32.
STM32 com LED
O pino de saída STM32 PWM (PA9) é conectado ao pino positivo do LED por meio de um resistor em série e um capacitor.
LED com resistor e capacitor
Um resistor em série e um capacitor em paralelo são conectados com LED para gerar a onda analógica correta da saída PWM, já que a saída analógica não é pura quando gerada diretamente do pino PWM.
STM32 com ULN2003 e ULN2003 com ventilador
O pino de saída STM32 PWM (PA8) é conectado ao pino de entrada (IN1) de ULN2003 IC e o pino de saída correspondente (OUT1) de ULN2003 é conectado ao fio negativo do FAN DC.
O pino positivo do ventilador DC é conectado ao pino COM do IC ULN2003 e a bateria externa (9 V DC) também é conectada ao mesmo pino COM do IC ULN2003. O pino GND de ULN2003 está conectado ao pino GND de STM32 e o negativo da bateria está conectado ao mesmo pino GND.
STM32 com LCD (16x2)
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) |
Um potenciômetro no lado direito é usado para controlar o contraste do display LCD. A tabela acima mostra a conexão entre o LCD e o STM32.
Programando STM32
Como no tutorial anterior, programamos o STM32F103C8 com Arduino IDE através da porta USB sem usar o programador FTDI. Para aprender a programar STM32 com Arduino IDE, siga o link. Podemos prosseguir com a programação como no Arduino. O código completo é fornecido no final.
Nesta codificação, vamos pegar um valor analógico de entrada do pino ADC (PA4) que é conectado ao pino central do potenciômetro esquerdo e, em seguida, converter o valor analógico (0-3,3 V) em formato digital ou inteiro (0-4095). Este valor digital é ainda fornecido como saída PWM para controlar o brilho do LED e a velocidade do ventilador DC. Um LCD 16x2 é usado para exibir ADC e o valor mapeado (valor de saída PWM).
Primeiro, precisamos incluir o arquivo de cabeçalho do LCD, declarar os pinos do LCD e inicializá-los usando o código abaixo. Saiba mais sobre a interface do LCD com o STM32 aqui.
#incluir
Em seguida, declare e defina os nomes dos pinos usando o pino do STM32
const int analoginput = PA4; // Entrada do potenciômetro const int led = PA9; // Saída de LED const int fan = PA8; // saída do ventilador
Agora dentro de setup () , precisamos exibir algumas mensagens e limpá-las após alguns segundos e especificar o pino INPUT e os pinos de saída PWM
lcd.begin (16,2); // Preparando o LCD lcd.clear (); // Limpa o LCD lcd.setCursor (0,0); // Define o cursor na linha0 e na coluna0 lcd.print ("CIRCUIT DIGEST"); // Mostra o resumo do circuito lcd.setCursor (0,1); // Define o Cursor na coluna0 e linha1 lcd.print ("PWM USING STM32"); // Exibe PWM usando STM32 delay (2000); // Tempo de atraso lcd.clear (); // Limpa LCD pinMode (analoginput, INPUT); // define o modo de pino analoginput como INPUT pinMode (led, PWM); // define o modo do pino led como saída PWM pinMode (fan, PWM); // define o modo de pino do ventilador como saída PWM
O pino de entrada analógica (PA4) é definido como INPUT por pinMode (analoginput, INPUT), o pino do LED é definido como saída PWM por pinMode (led, PWM) e o pino do ventilador é definido como saída PWM por pinMode (ventilador, PWM) . Aqui, os pinos de saída do PWM são conectados ao LED (PA9) e ao ventilador (PA8).
Em seguida, na função void loop () , lemos o sinal analógico do pino ADC (PA4) e o armazenamos em uma variável inteira que converte a tensão analógica em valores inteiros digitais (0-4095) usando o código abaixo int valueadc = analogRead (analoginput);
Uma coisa importante a se notar aqui são os pinos PWM que são canais de STM32 tem resolução de 16 bits (0-65535), então precisamos mapear isso com valores analógicos usando a função de mapa como abaixo
resultado int = map (valueadc, 0, 4095, 0, 65535).
Se o mapeamento não for usado, não obteremos a velocidade total da ventoinha ou o brilho total do LED variando o potenciômetro.
Em seguida, gravamos a saída PWM no LED usando pwmWrite (led, resultado) e a saída PWM no ventilador usando as funções pwmWrite (ventilador, resultado ).
Finalmente, exibimos o valor de entrada analógica (valor ADC) e os valores de saída (valores PWM) no visor LCD usando os seguintes comandos
lcd.setCursor (0,0); // Define o cursor na linha0 e na coluna0 lcd.print ("ADC value ="); // imprime as palavras “” lcd.print (valueadc); // exibe valueadc lcd.setCursor (0,1); // Define o Cursor na coluna0 e linha1 lcd.print ("Output ="); // imprime as palavras em "" lcd.print (resultado); // exibe o resultado do valor
O código completo com um vídeo de demonstração é fornecido abaixo.