quarta-feira, outubro 09, 2019

Timer1 do ATmega328 - Parte 3

Nesta parte vamos falar na função de Captura do Timer1. A figura abaixo (extraída do datasheet) é o diagrama de blocos da Unidade de Captura (troque "n" por "1" nos nomes dos registradores e dos pinos).



TCNT1 é o contador que é incrementado pelo clock (ver a parte 1) conforme o modo (ver a parte 2). O objetivo da captura é copiar o conteúdo do TCNT1 para o registrador ICR1 quando um evento for detectado.

O registrador TEMP na figura permite ler valores coerentes nos registradores de 16 bits com a contagem ativa. Ao ler o byte menos significativo (ICR1L ou TCNT1L), o byte mais significativo é simultaneamente salvo no registrador TEMP, quando o byte mais significativo é lido ele é obtido de TEMP. Por exemplo, imagine que TCNT1 contem 0x00FF  quando TCNT1L for lido; a leitura posterior de TCNT1H devolverá 0x00 mesmo que TCNT1 já tenha sido incrementado para 0x0100. Sem o registrador TEMP neste caso seria lido o valor incorreto 0x01FF.

Voltando à Unidade de Captura, a parte inferior da figura mostra de onde vem o evento que será capturado. Temos duas opções de origem: o pino ICP1 e o Comparador Analógico. A seleção entre estas duas origens é feita pelo bit ACIC no registrador ACSR.

O sinal selecionado passa por um Cancelador de Ruído se o bit ICNC1 do registrador TCCR1B for 1. O cancelador de ruído consiste em só considerar o valor do sinal de entrada quando ele for igual por 4 clocks do processador. Uma consequência do seu uso é um delay de quatro clocks na detecção de variações do sinal.

Por último, o bit ICES1 do registrador TCCR1B determina se a captura deve ser feita quando o sinal passar do nível baixo para alto (ICES1=1, borda de subida) ou quando o sinal passar do nível alto para baixo (ICES1=0, borda de descida).


Como veremos futuramente, o evento de capturar pode gerar uma interrupção.

Neste ponto você deve estar se perguntando: para que serve tudo isso? Para medir tempos entre mudanças de sinais. Como primeiro exemplo, imagina que tenhamos um sinal PWM ligado ao pino ICP1. Com a unidade de captura podemos contar quantos pulsos do clock do timer1 se passam entre as mudanças do sinal. Sabendo as contagens e a frequência do clock podemos determinar a frequência e o duty cycle do sinal. Por exemplo, se o a frequência do nosso clock for 100KHz e contarmos 10 pulsos da borda de subida até a a de descida e 30 pulsos da borda de descida até a de subida, concluímos que um ciclo completo do sinal leva 40 pulsos (fequência de 100KHz/40 = 2,5KHz) e que o duty cycle é 25% (o sinal fica em nível alto 10 pulsos em cada ciclo de 40 pulsos).

Um exemplo completo, usando o comparador analógico, pode ser visto no meu projeto de capacímetro usando o Arduino.

Nenhum comentário: