Aula 03 - Temporizadores, Contadores, Interrupções e Modulação PWM


1. Princípios de Temporização e Contagem por Hardware

O controle determinístico de tempo é a espinha dorsal dos sistemas embarcados em engenharia. A utilização de laços de retardo por software (software delay loops), como a função _delay_ms() que bloqueia a UCP consumindo ciclos em loops vazios, é inaceitável em aplicações profissionais, pois degrada a responsividade da máquina e impede o atendimento simultâneo a sensores e atuadores.

Os microcontroladores incorporam circuitos periféricos dedicados de contagem puramente por hardware denominados Temporizadores/Contadores (Timers/Counters). Estes módulos operam de forma assíncrona e autônoma, acumulando pulsos de clock independentemente do fluxo de instruções da UCP.


2. Estrutura dos Módulos Timer0, Timer1 e Timer2

Na arquitetura de microcontroladores de 8 bits (como o PIC16F877A), coexistem três temporizadores distintos, cada um otimizado para propósitos circuítais específicos:

MóduloResoluçãoFontes de ClockPrescaler DisponívelRegistrador de ComparaçãoAplicação Primária
Timer08 bits ()Interno () ou Externo (T0CKI)Não possuiBase de tempo geral, contagem de pulsos
Timer116 bits ()Interno ou Externo (T1CKI / Cristal 32k)Modo Captura/ComparaçãoBase de tempo longa, relógio RTC de 1 s
Timer28 bits com PR2Exclusivamente Interno ()Prescaler () + Postscaler ()Registrador PR2 (Período)Base de tempo para PWM e chaveamento

3. Equacionamento Matemático do Estouro de Temporização

3.1 Dedução da Equação do Timer0 (8 Bits)

O registrador TMR0 incrementa a cada pulso entregue pela saída de seu divisor de frequência programável (Prescaler). Ao atingir a contagem máxima de () e receber o próximo pulso, o contador sofre transbordamento (overflow) retornando a , setando simultaneamente o flag de interrupção INTCONbits.TMR0IF = 1.

Se o registrador for pré-carregado com um valor inicial , o número de incrementos necessários para o estouro é exatamente:

O intervalo de tempo exato decorrido até o estouro () é dado formalmente por:

Isolando o valor a ser carregado no registrador para obter um tempo de estouro desejado:

3.2 Dedução da Equação do Timer1 (16 Bits)

O Timer1 opera com dois registradores em cascata de 8 bits (TMR1H e TMR1L), perfazendo contagem de estados:


4. O Sistema de Interrupções: Estrutura, Controle e Atendimento

Uma interrupção é um mecanismo assíncrono disparado por eventos de hardware internos ou externos que suspende temporariamente a execução do programa principal, força a UCP a salvar seu contexto e desvia a execução para uma Rotina de Serviço de Interrupção (Interrupt Service Routine - ISR) localizada em um vetor de endereço pré-determinado da memória Flash ( na linha média).

4.1 A Lógica de Habilitação em Três Portas AND

Para que qualquer evento periférico consiga efetivamente interromper a CPU, uma cadeia lógica de três condições deve ser satisfeita simultaneamente:

  1. Chave Geral de Interrupções (GIE): Bit 7 de INTCON deve estar em ;
  2. Chave de Periféricos (PEIE): Bit 6 de INTCON deve estar em (para interrupções que não sejam Timer0, Externa RB0 ou Mudança em PORTB);
  3. Habilitação Individual do Módulo (IE): O bit específico de ativação daquele módulo deve estar em (ex: TMR1IE = 1);
  4. Sinalização do Evento (IF): O flag de hardware que atesta a ocorrência física do evento sobe para (ex: TMR1IF = 1).

4.2 Protocolo de Execução da ISR

Ao aceitar o pedido de interrupção, o hardware executa automaticamente:

  1. O bit GIE é zerado imediatamente por hardware para bloquear interrupções aninhadas;
  2. O endereço do PC atual () é salvo na pilha de hardware (Stack);
  3. O ponteiro de instrução é forçado para o vetor fixo ;
  4. O compilador C ou programador salva o contexto dos registradores WREG e STATUS;
  5. A ISR verifica qual dos flags causou a interrupção através de testes condicionais (if (TMR1IF) { ... });
  6. Limpeza Mandatória do Flag por Software: O desenvolvedor deve obrigatoriamente limpar o flag do evento (TMR1IF = 0). Se esta linha for omitida, ao retornar da rotina o flag continuará em nível 1, provocando o re-disparo imediato da interrupção em um loop perpétuo;
  7. A instrução RETFIE restaura o contexto, desempilha o PC e reabilita atomicamente GIE = 1.

5. Módulo CCP e Modulação por Largura de Pulso (PWM)

O módulo CCP (Capture / Compare / PWM) opera associado ao Timer2 para produzir trens de pulsos retangulares de alta frequência com razão cíclica (Duty Cycle) programável sem exigir nenhuma intervenção contínua da UCP.

5.1 Dedução Analítica do Período e Frequência do PWM

O Timer2 é incrementado a cada ciclo de instrução dividido pelo Prescaler do Timer2 (). O contador TMR2 é comparado continuamente com o registrador de período PR2.

Quando atinge o valor de :

  1. A saída do comparador reseta o contador para zero;
  2. A saída do pino PWM é colocada imediatamente em Nível Lógico Alto ();
  3. O ciclo reinicia.

O período total do sinal de saída e sua correspondente frequência fundamental são dados por:

5.2 Dedução da Largura de Pulso (Duty Cycle)

A largura de tempo em que a saída permanece em nível alto () é controlada por uma palavra digital de 10 bits formada pelo registrador de 8 bits CCPRxL (bits mais significativos) concatenado com os bits 5 e 4 do registrador CCPxCON (os 2 bits menos significativos):

O Duty Cycle Percentual () mede a fração do período em nível alto, proporcional à tensão média contínua entregue à carga:

5.3 Resolução Efetiva do PWM em Bits

A resolução em bits do conversor PWM define o número de degraus discretos de ajuste de duty cycle possíveis para uma dada frequência escolhida:

Para atingir a resolução máxima de ( degraus), o registrador deve ser carregado com (, que multiplicado pelo fator perfaz ).


6. Diagrama Arquitetural Consolidado

O diagrama técnico vetorial a seguir ilustra a cadeia de prescaler e estouro do temporizador, o mecanismo de salvamento de contexto na interrupção e o circuito gerador de PWM baseado na comparação entre TMR2, PR2 e CCPRx:

Temporizadores, PWM e Interrupções


7. Exercícios Resolvidos e Aplicações em Concursos

Exercício 1 (Petrobras - Engenharia Elétrica / CESGRANRIO)

Enunciado: Deseja-se projetar o acionamento de um motor CC industrial através de uma ponte H utilizando o módulo PWM de um microcontrolador com cristal de .

  1. Calcule o valor exato a ser gravado no registrador de período PR2 e configure o Prescaler do Timer2 para produzir uma frequência de chaveamento de (fora da faixa audível humana).
  2. Determine a resolução em bits do PWM resultante nessa frequência.
  3. Dimensione o valor da palavra de 10 bits (CCPR1L:CCP1CON<5:4>) para impor uma tensão média contínua de exatamente no enrolamento do motor, sabendo que a tensão do barramento de alimentação do circuito lógico é .

Resolução Passo a Passo:

  1. Cálculo de e Prescaler: Fórmula da frequência PWM: Como é um registrador de 8 bits ():

    • Se adotarmos : Como , esta é uma solução perfeitamente válida e ideal, pois minimiza o prescaler e maximiza a resolução!
  2. Resolução em Bits: O número total de passos discretos de largura de pulso é .

  3. Cálculo do Duty Cycle e Valor da Palavra Digital: Duty cycle desejado: Valor decimal da palavra de 10 bits (): Decomposição do valor nos registradores:

    • Os 2 bits menos significativos vão para CCP1CON<5:4>:
    • Os 8 bits mais significativos vão para CCPR1L:


Exercício 2 (Marinha do Brasil - Corpo de Engenheiros)

Enunciado: Deseja-se implementar uma base de tempo de interrupção periódica exata de () utilizando o módulo Timer1 de 16 bits de um microcontrolador operando com oscilador a cristal de .

  1. Calcule a opção ótima de Prescaler para o Timer1 () e o valor inteiro a ser recarregado nos registradores TMR1H e TMR1L dentro da rotina ISR.
  2. Explique detalhadamente por que o código de recarga dos registradores dentro da ISR introduz um pequeno erro de acumulação (drift) e apresente uma técnica de software para eliminar essa perda temporal.

Resolução Passo a Passo:

  1. Dimensionamento do Timer1: Período do ciclo de instrução com : Número de ciclos de instrução correspondentes a : Como , o contador de 16 bits acomoda o intervalo diretamente com : Valor a ser pré-carregado no Timer1: Convertendo para hexadecimal:

  2. Análise do Drift de Recarga e Mitigação:

    • Causa Física do Drift: Ao ocorrer o estouro, a CPU leva alguns ciclos de instrução para salvar o contexto e saltar para a ISR. Quando o código executa TMR1H = 0xB1; TMR1L = 0xE0;, o ato de escrever nos registradores do timer reinicia o prescaler interno e apaga os incrementos que ocorreram durante o atendimento da interrupção (cerca de 2 a 6 ciclos de máquina perdidos a cada ). Ao longo de horas, esse erro acumula minutos de atraso em um relógio de tempo real!
    • Técnica de Compensação por Software: Em vez de atribuir o valor fixo com sobrescrita direta (TMR1 = 0xB1E0), utiliza-se uma soma algébrica com compensação de offset: Onde é uma constante calibrada correspondente ao número exato de ciclos de instrução gastos entre a entrada na ISR e a instrução de soma. Dessa forma, nenhum pulso do oscilador é perdido, mantendo precisão de quartzo ao longo de meses de operação contínua.