Aula: Gerar sinal PWM no CCS

23:36 |

Fala pessoal. No post de hoje irei ensinar a vocês a configurarem o PIC para gerar um sinal PWM.

Antes de tudo preciso que vocês saibam o que seria o PWM. Isso já foi postado aqui no blog: Manual PWM Completo

Para gerar um sinal PWM com o PIC, nós utilizamos o Timer 2 qu eé um timer de 8 bits.

O Timer 2 é usado como base de tempo para a modulação PWM com o módulo CCP.

Veja que a frequência de saída é dada por:
                                            Frequencia do Cristal
PWM Freq  = -----------------------------------------------------------------
                        (Carga do timer2 + 1) * (Timer2 Prescaler) * 4

O prescaler do Timer2 pode ser 1, 4 ou 16.

A carga do Timer2 que também pode ser chamar de período pode ser 0 a 255.

Considerando que você utiliza um cristal de 4Mhz, vamos calcular qual seria a frequência mínima e máxima para esse cristal.

Valor mínimo:

         4 MHz                       4,000,000
 --------------------------- =  ------------------  = 244 Hz    
 (255 + 1) * 16 * 4             16,384

Valor Máximo:

        4 MHz                    4,000,000
 -----------------------  =  -------------------  =  500000 Hz    
 (1 + 1) * 1 * 4                      8

Lembrem-se que são valores teóricos.

Vamos agora configurar utilizando um exemplo prático:

Gerar um sinal quadrado de 1Khz utilizando o Timer 2 e o módulo CCP1 no PIC C da CCS.

Solução:

Para gerar um sinal de 1Khz, é necessário um período T=(1/1000)=1mS, um período de 1mS (mili-segundos). Onde T=período.

Temos uma equação para cálculo do overflow (estouro) do Timer 2:

T=1/clock*4*Prescaler*(carga Timer2+1)*Postcaler]

Usando a fórmula, temos:
1mS=1/4000000*4*4*(X+1)*1], onde X=249

O Timer 2 fica assim:

setup_timer_2(T2_DIV_BY_4,249,1);

O duty cycle é configurado por:

set_pwm1_duty(valor);

O conteudo de "valor" NÃO dever ser maior do que o periodo (ou carga do timer 2).

Podemos trabalhar com valores de 8 ou 16 bits para o valor.

Para valores de 16 Bits:

Temos que setup_timer_2(T2_DIV_BY_4,249,1) e com isso temos um periodo de 249. Se fizermos set_pwm1_duty(124L) (note o "L") temos que:

         16-bit Duty cycle             124                         124
--------------------------------- =  --------------------- = ------------ = 12.4%
 (Timer 2 periodo +1) * 4       (249 +1) * 4            100


Para valores de 8 Bits:

Agora se ao invés de set_pwm1_duty(124L) usarmos set_pwm1_duty(124) sem o "L", quer dizer q estamos no modo 8 bits. Isso nos dá:

        8-bit Duty cycle                  124
---------------------------------  =  ------------  = 49.6% (Duty-Cicle)
  (Timer 2 periodo +1)               250

Criei um aplicativo para vc poder facilitar o cálculo do Timer2. Lembre-se que é melhor vocês aprenderem a calcular e não depender do programa.

OBS: O programa é Promo-version. Quer dizer que tem bug. Programei ele rapidin aqui só pra teste mesmo. Se for útil diz aí.

O programa tem 3 tipos. 1 para o net framework 3, para o netframawork 3.5 e para o 4.0. Se vc tiver o 4.0 instalado, funciona os outros. Recomendo o 4.0.

Se o programa não funcionar ou der erro, é porq vc precisa baixar e instalar o net framework daqui ó:

Download details: Microsoft .NET Framework 4 (Standalone Installer)

Programa:

Timer 2 para NetFramework 3.0

Timer 2 para NetFramework 3.5

Timer 2 para NetFramework 4.0 (RECOMENDADO)

Repito: O programa tem bugs. Serve como base. Se for útil, posso melhorá-lo.

flw

2 comentários:

Paulo Roberto Colosi Junior disse...

olá colega. tudo bem? olha estou com uma duvida vc disse que o valor em set_pwm1_duty(valor) nao deve ser maior do que o valor do periodo do tmr2, mas e
se eu fizer setup_timer_2(T2_DIV_BY_4,1,1) para gerar uma frequencia de 125 KHZ como devo setar o duty se o valor da carga do tmr2 é 1, e nao posso passar este valor ? tem alguma ideia? desde ja obrigado. ha e otimo blog parabens!

Daniela Matos Vila seca disse...

Otimo blog, gostei, exatamenteo que precisava

Postar um comentário

Related Posts Plugin for WordPress, Blogger...
Related Posts Plugin for WordPress, Blogger...