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