quarta-feira, outubro 16, 2019

Timer1 do ATmega328 - Parte 4

Nesta quarta parte vamos examinar um uso muito comum do timer: a geração de sinais do  tipo PWM (Pulse Width Modulation). Em um sinal PWM temos um pulso sendo repetido periodicamente; o tempo em que ele se repete é o seu período (cujo inverso é a frequência). A largura do pulso é o tempo que o sinal permanece em nível alto. É comum falarmos também no duty cycle, que é a relação entre a largura e o período (ou seja, a porcentagem do tempo que o sinal fica em nível alto).


Por exemplo, vamos considerar um pulso de 25 microssegundos (us) que se repete a cada 100 microssegundos. O período é 100 us, a frequência é 10KHz, a largura é 25uS e o duty cycle é 25%.

Embora os princípios sejam simples, os detalhes são complicados. Recomendo ler e reler o manual do ATmega  para ver todos os detalhes da programação destes modos.


Modo Fast PWM

Este é o modo mais simples de PWM do Timer1.  O contador vai de zero até o valor máximo TOP (255 para o modo de 8 bits, 511 para o de 9 bits, 1023 para o de 10 bits ou ICR1 ou OCR1A para os modos de 16 bits, ver a parte 2). No modo não invertido, o sinal de saída (OC1A ou OC1B) vai para o nível alto quando o contador dá a volta para zero e vai para nível baixo quando o contador fica igual a (respectivamente) OCR1A ou OCR1B.



Se você está mais preocupado com o duty cycle do que com a frequência, você pode usar um dos modos de 8, 9 pu 10 bits e usar OCR1A ou OCR1B para mudar o duty cycle. Se você quer controlar a frequência, use o modo de 16 bits e programe a frequência através de OCR1A (com o OC1B) ou ICR1 (com qualquer um dos pinos).

Modo Phase Correct PWM

Este modo só faz sentido se você está usando o Timer1 para gerar dois sinais PWM com frequência igual mas largura diferente, um em OC1A e outro em OC1B. No Fast PWM o sinal sobe sempre no começo do ciclo.


No Phase Correct PWM os dois pulsos estão centrados (ver a figura abaixo), o que é necessário para algumas aplicações. Para gerar os pulsos centrados, o contador é incrementado de zero até o máximo e depois decrementado do máximo até zero. Os sinais mudam quando o contador atinge os valores em OCR1A e OCR1B. Como um período requer uma contagem crescente e uma decrescente, a frequência máxima é a metade que no modo fast.



A limitação deste modo é quando se vai mudar o período (através do valor máximo) com o contador andando. As escritas em TOP e OCR1x não tem efeito imediatamente, os valores ficam num registrador temporário interno até o contador atingir o valor máximo atual. Ao mudar o valor máximo, uma parte da onda é gerada com o valor antigo e outra com o novo, gerando uma onda não simétrica e com uma frequência diferente da antiga e da nova. Portanto só use este modo se você não for mudar o período com o contador andando ou um pulso com frequência errada não atrapalhar.

Modo Frequency and Phase Correct PWM

Este modo tem por objetivo corrigir o problema do modo Phase Correct. Nele as escritas em TOP e OCR1x passam a valer quando o contador atinge zero fazendo com que os ciclos sejam sempre simétricos. Em caso de mudança da frequência não teremos um pulso com período diferente do antigo e do novo.



Nenhum comentário: