Mini curso sobre AVR parte 5 - Timer 0 em modo fast PWM

Mais uma parte do mini curso, agora uma primeira parte sobre o TIMER0, é um timer de 8 bits, existem três timers nesse AVR, este é o mais simples, e é muito fácil configurá-lo, leia atentamente o capítulo do datasheet que trata desse timer antes de tentar entender o exemplo proposto.

Para este timer há além do contador, uma saída de output compare, pino PB3-OC0, que pode ser usada para a função de output compare ou para dois tipos de PWM, o modo fast PWM, que é de rampa única, o valor do contador TCNT0 vai de 0 a 255, e, de acordo com o valor de COM0x pode setar ou dar clear no pino do OC0 quando o valor do contador for igual ao ao do registro OCR (output compare register).

Há um outro modo de PWM, chamado phase correct PWM, onde o contador conta de 0 a 255 em modo crescente, e em seguida de 255 a 0 de modo decrescente, de tal modo que o estado de OC0 é relativo à direção de contagem (configurável se é 1 ou 0 quando em contagem descrente ou crescente), a grande vantagem nesse modo é obter resolução maior.

Além desses modos, o timer pode atuar no modo CTC, onde o valor do contador é zerado quando for igual ao valor de OCR0, atuando no output compare, é possível se fazer uma saída no output compare com frequência variável.

E também em cada um desses modos podem ser configurados flags para monitoração do estado do timer e também para se gerar interrupções, a geração de interrupções por esse timer será discutida em uma parte posterior.

O modo discutido no exemplo será o de fast PWM, sem geração de interrupção, a figura à esquerda, retirada do datasheet ilustra a relação entre o pino de saída do output compare OC0 e o valor de TCNT0.

Observe que o estado de OC0 varia quando o valor de OCR0 é igual à TCNT0, além disso, o TCNT0 é zerado no próximo ciclo de clock na entrada desse timer e uma interrupção poderá ser gerada quando houver a igualdade e/ou então quando houver overflow de TCNT0, onde poderá haver uma mudança no valor de OCR0, caso o projetista deseje.

Agora tratando dos registros, em TCCR0 há a maioria dos registros de configuração do timer, os flags ficam em TIFR e a máscara dos flags está em TIMSK, observe que nesses dois últimos registros há parâmetros que configuram o timer1 também, logo altere apenas os bits necessários, não o registro todo.

No exemplo, a configuração do timer0 foi feita em apenas uma linha, a alteração de TIMSK não foi necessária, já que todas as interrupções são mascaradas ao se inicializar o AVR.

Em TCCR0 temos os seguintes registros:
-Bit 7: Force output compare (FOC0), somente pode ser utilizado em modo não PWM, força o OC0 a ser mudado de estado, de acordo com o tipo de mudança escolhida.

-Bits6 e 3: Waveform generation mode WGM01 e WGM00, escolhe o modo do timer0, nesse caso foi escolhido o modo 3 (fast PWM), com ambos bits em 1.

-Bits 5 e 4: Compare match output mode COM01, COM00: especificam como vai ser a mudança de estado no output compare, cada modo tem suas diferenças, abaixo a tabela 40 que resume o comportamento somente para o modo fast PWM.

-Bits 2 a 0 Clock Select CS02, CS01, CS00: Selecionam se o timer está sem contar (sem clock), ou de onde virá o clock desse timer, são várias fontes, onde podem vir do prescaler ou do pino entrada de clock para esse timer. Para o exemplo o clock será sem o prescaler (12MHz), diretamente do clock da CPU.

Com tudo isso você pode entender como foi feita a inicialização do timer0, na função inicializatimer0.

Toda a informação do datasheet foi apenas resumida aqui para somente esse modo, releia o datasheet, onde você encontrará os demais modos desse timer, o mais simples desse AVR.

O exemplo:

A inicialização foi feita de modo que o fast PWM ficasse o mais rápido possível para o dado clock, por isso não foi usado um prescaler.

O exemplo propõe um gerador de senóides utilizando PWM, de tal forma, que sem o prescaler, a frequência de chaveamento do PWM ficou em 46,875kHz .

O sinal gerado por esse PWM é uma senóide de 60Hz, para isso o seno foi tabelado de 0 a pi, em incrementos de 10 graus, de forma que o PWM da senóide fosse atualizado a aproximadamente 460 microsegundos.

Observe que não há interrupções sendo geradas, a atualização da senóide foi colocada no programa principal para se facilitar o entendimento desse exemplo.

Ou seja, a senóide foi dividida em 36 partes, e a cada uma dessas partes o PWM é mudado, de forma que o sinal de 46,875kHz após passar por filtragem tenha forma de onda senoidal.

Onde esse tipo de aplicação pode ser útil? Em aplicações de nobreaks, por exemplo, a perda de potência por efeito Joule em, por exemplo um mosfet é algo inadmissível, para se obter os 60Hz senoidais na saída um método de se diminuir essas perdas é usando PWM no chaveamento.

Abaixo como ficou o código ,repetindo a frase do professor aqui, quem copia aprende!


Abaixo alguns screenshots do osciloscópio, o filtro foi implementado de forma digital, pelo próprio equipamento:


Errei na continha do seno? Gostou do que viu? Comente, não custa nada!!!

0 comentários:

Postar um comentário