- Pinos PWM no microcontrolador AVR Atmega16
- O que é um sinal PWM?
- Componentes necessários
- Diagrama de circuito
- Programando Atmega16 para PWM
A modulação por largura de pulso (PWM) é uma técnica poderosa em que a largura do pulso é alterada mantendo a frequência constante. A técnica é usada em muitos sistemas de controle hoje. A aplicação do PWM não é limitada e é usado em uma ampla gama de aplicações, como controle de velocidade do motor, medição, controle de potência e comunicação, etc. Na técnica PWM, pode-se facilmente gerar um sinal de saída analógico usando sinais digitais. Este tutorial irá ajudá-lo a entender o PWM, suas terminologias e como podemos implementá-lo usando um microcontrolador. Neste tutorial, iremos demonstrar o PWM com o microcontrolador AVR Atmega16 variando a intensidade de um LED.
Para entender os fundamentos do PWM em detalhes, vá para nossos tutoriais anteriores sobre PWM com vários microcontroladores:
- ARM7-LPC2148 PWM Tutorial: Controlando o brilho do LED
- Modulação de largura de pulso (PWM) usando MSP430G2: Controlando o brilho do LED
- Gerando PWM usando Microcontrolador PIC com MPLAB e XC8
- Modulação de largura de pulso (PWM) em STM32F103C8: Velocidade de controle do ventilador DC
- Gerando sinais PWM nos pinos GPIO do microcontrolador PIC
- Tutorial Raspberry Pi PWM
Pinos PWM no microcontrolador AVR Atmega16
Atmega16 tem quatro pinos PWM dedicados. Esses pinos são PB3 (OC0), PD4 (OC1B), PD5 (OC1A), PD7 (OC2).
Além disso, o Atmega16 tem dois temporizadores de 8 bits e um temporizador de 16 bits. Timer0 e Timer2 são temporizadores de 8 bits, enquanto o Timer1 é temporizador de 16 bits. Para gerar o PWM, devemos ter uma visão geral dos temporizadores, pois os temporizadores são usados para gerar o PWM. Como sabemos, a frequência é o número de ciclos por segundo em que o cronômetro funciona. Portanto, a frequência mais alta nos dará um cronômetro mais rápido. Na geração de PWM, uma frequência de PWM mais rápida fornecerá um controle mais preciso sobre a saída porque pode responder mais rápido a novos ciclos de trabalho de PWM.
Neste tutorial do Atmega16 PWM, usaremos o Timer2. Você pode escolher qualquer ciclo de trabalho. Se você não sabe o que é o ciclo de trabalho em PWM, vamos discutir brevemente.
O que é um sinal PWM?
A modulação por largura de pulso (PWM) é um sinal digital mais comumente usado em circuitos de controle. O tempo durante o qual o sinal permanece alto é chamado de “tempo de ativação” e o tempo durante o qual o sinal permanece baixo é chamado de “tempo de desligamento”. Existem dois parâmetros importantes para um PWM, conforme discutido abaixo:
Ciclo de trabalho do PWM
A porcentagem de tempo em que o sinal PWM permanece ALTO (no tempo) é chamada de ciclo de serviço.
Como no sinal de pulso de 100ms, se o sinal for ALTO por 50ms e BAIXO por 50ms, significa que o pulso foi metade ALTO e metade BAIXO. Portanto, podemos dizer que o ciclo de trabalho é de 50%. Da mesma forma, se o pulso estiver no estado 25ms HIGH e 75ms no estado LOW de 100ms, o ciclo de trabalho seria de 25%. Observe que calculamos apenas a duração do estado HIGH. Você pode consultar a imagem abaixo para compreensão visual. A fórmula para o ciclo de trabalho é, então,
Ciclo de trabalho (%) = On Time / (On Time + Off Time)
Portanto, ao alterar o ciclo de trabalho, podemos alterar a largura do PWM, resultando na alteração do brilho do LED. Teremos uma demonstração do uso de diferentes ciclos de trabalho no controle de brilho do LED. Confira o vídeo de demonstração no final deste tutorial.
Depois de selecionar o ciclo de trabalho, a próxima etapa seria selecionar o modo PWM. O modo PWM especifica como você deseja que o PWM funcione. Existem basicamente 3 tipos de modos PWM. São os seguintes:
- PWM rápido
- PWM de correção de fase
- PWM correto de fase e frequência
O PWM rápido é usado onde a mudança de fase não importa. Usando Fast PWM, podemos produzir os valores de PWM rapidamente. O PWM rápido não pode ser usado onde a mudança de fase afeta a operação, como o controle do motor, portanto, em tal aplicação, outros modos de PWM são usados. Como controlaremos o brilho do LED, onde a mudança de fase não afetará muito, usaremos o modo Fast PWM.
Agora, para gerar o PWM, controlaremos o cronômetro interno para fazer uma contagem progressiva e, em seguida, voltará a zero em uma contagem específica, então o cronômetro fará uma contagem progressiva e, em seguida, voltará a zero repetidamente. Isso define o período. Agora temos a opção de controlar um pulso, ligando um pulso em uma contagem específica no cronômetro enquanto sobe. Quando o contador voltar a 0, desligue o pulso. Há muita flexibilidade com isso porque você sempre pode acessar a contagem do temporizador e fornecer pulsos diferentes com um único temporizador. Isso é ótimo quando você deseja controlar vários LEDs de uma vez. Agora vamos iniciar a interface de um LED com Atmega16 para PWM.
Verifique todos os projetos relacionados a PWM aqui.
Componentes necessários
- Microcontrolador Atmega16 AVR IC
- Oscilador de cristal de 16 MHz
- Dois capacitores 100nF
- Dois capacitores 22pF
- Botão de apertar
- Jumper Wires
- Tábua de pão
- USBASP v2.0
- 2 Led (qualquer cor)
Diagrama de circuito
Estamos usando OC2 para PWM, ou seja, Pin21 (PD7). Portanto, conecte um LED no pino PD7 do Atmega16.
Programando Atmega16 para PWM
O programa completo é fornecido abaixo. Grave o programa em Atmega16 usando JTAG e Atmel Studio e veja o efeito PWM no LED. Seu brilho aumentará e diminuirá lentamente devido à variação do ciclo de trabalho do PWM. Confira o vídeo fornecido no final.
Comece a programar Atmega16 com a configuração do Registro Timer2. Os bits de registro Timer2 são os seguintes e podemos definir ou redefinir os bits de acordo.
Agora vamos discutir sobre todos os bits do Timer2 para que possamos obter o PWM desejado usando o programa escrito.
Existem principalmente quatro partes no registro Timer2:
FOC2 (Forçar comparação de saída para Timer2): O bit FOC2 é definido quando os bits WGM especificam um modo não-PWM.
WGM2 (Modo de geração de onda para Timer2): Esses bits controlam a sequência de contagem do contador, a fonte para o valor máximo do contador (TOP) e o tipo de geração de forma de onda a ser usado.
COM2 (modo de comparação de saída para Timer2): esses bits controlam o comportamento de saída. A descrição completa do bit é explicada abaixo.
TCCR2 - = (1 <
Defina os bits WGM20 e WGM21 como HIGH para ativar o modo rápido PWM. O WGM significa modo de geração de forma de onda. Os bits de seleção são os seguintes.
WGM00 |
WGM01 |
Operação do modo Timer2 |
0 |
0 |
Modo normal |
0 |
1 |
CTC (Clear Timer On Compare Match) |
1 |
0 |
PWM, fase correta |
1 |
1 |
Modo PWM rápido |
Para obter mais detalhes sobre o modo de geração de forma de onda, você pode consultar a folha de dados oficial do Atmega16.
TCCR2 - = (1 <
Além disso, não usamos nenhum pré-escalonamento, então definimos o registro de origem do relógio como '001'.
Os bits de seleção de relógio são os seguintes:
CS22 |
CS21 |
CS20 |
Descrição |
0 |
0 |
0 |
Sem fonte de relógio (temporizador / contador parado) |
0 |
0 |
1 |
clk T2S / (sem pré-escala) |
0 |
1 |
0 |
Clk T2S / 8 (do Prescaler) |
0 |
1 |
1 |
Clk T2S / 32 (do Prescaler) |
1 |
0 |
0 |
Clk T2S / 64 (do Prescaler) |
1 |
0 |
1 |
Clk T2S / 128 (do Prescaler) |
1 |
1 |
0 |
Clk T2S / 256 (do Prescaler) |
1 |
1 |
1 |
Clk T2S / 1024 (do Prescaler) |
Além disso, OC2 é limpo na correspondência de comparação definindo o bit COM21 como '1' e COM20 como '0'.
As opções de seleção Compare Output Mode (COM) para Fast PWM Mode são fornecidas abaixo:
COM21 |
COM21 |
Descrição |
0 |
0 |
Operação normal da porta, OC2 desconectado. |
0 |
1 |
Reservado |
1 |
0 |
Limpar OC2 na comparação, definir OC2 no TOPO |
1 |
1 |
Definir OC2 na comparação, limpar OC2 no TOPO |
Aumente o ciclo de trabalho de 0% a 100% para que o brilho aumente com o tempo. Pegue o valor de 0-255 e envie para o pino OCR2.
para (dever = 0; dever <255; dever ++) // 0 ao ciclo de trabalho máximo { OCR2 = dever; // aumenta lentamente o brilho do LED _delay_ms (10); }
Da mesma forma, diminua o ciclo de trabalho de 100% para 0% para diminuir gradualmente o brilho do LED.
para (dever = 0; dever> 255; dever--) // ciclo de trabalho máximo a 0 { OCR2 = dever; // diminui lentamente o brilho do LED _delay_ms (10); }
Isso conclui nosso Tutorial sobre como usar PWM no Atmega16 / 32.