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:
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
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:
(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:
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!
Otimo blog, gostei, exatamenteo que precisava
Postar um comentário