Você está na página 1de 75

AULA 4

Conversor AD e PWM
Microcontroladores PIC
Prof. Msc. Francisco Fambrini
27/06/2015
LAB 4L
Intervalo para cooffe break 9:25hs a 9:40hs

Conversor A/D
O papel do Conversor Analgico/Digital (A/D) converter valores de tenso analgicas para valores digitais.
O conversor analgico-digital converte tenso analgica para nmeros binrios.
Estes nmeros binrios podem ser de comprimento diferentes: 2, 4, 8, 10, 12 ou 16 bits.
Quanto mais bits o conversor AD tiver, maior ser a resoluo deste AD.
Por exemplo: Suponha que a tenso fornecida ao conversor A/D varia de 0 a 5 volt, e o conversor A/D converte
a voltagem de entrada a um nmero binrio de 2 bits apenas.
Com 2 bits ns podemos ter apenas 4 sadas diferentes:

Conversor AD
A linha azul descreve as mudanas na tenso de entrada analgica do
microcontrolador. A linha vermelha representa os nveis digitais na sada
do conversor AD do microcontrolador.
Podemos ver que o sinal vermelho est longe de ser ideal, ou seja, no
reproduz os valores de tenso de entrada analgica original.
Assim, podemos dizer que este AD de 2-bit possui baixa resoluo e h uma
grande diferena entre o valor real da tenso de entrada analgica e os
valores representados por este A D.
Agora, suponhamos que a tenso fornecida ao conversor A D varia de 0 a 5
volt, no entanto, o conversor A / D converte a voltagem de entrada a um
nmero binrio de 3-bits.
Com 3-bits podemos obter 8 opes diferentes:

Conversor AD de 3 bits

Exemplo: Um hipottico AD de 3-bit de resoluo

Exemplo: Um hipottico AD de 3-bit de


resoluo
Neste exemplo, os valores de tenso analgico de 0V a 0.62v tem uma
representao binria de 000; os valores de tenso analgica de 0,621 V
at 1,25V tem uma representao binria de 001 assim por diante.

Conversor AD interno dos PICs


O mdulo de conversor de analgico para digital localizado dentro do
microcontrolador PIC tem uma resoluo de 10-bits.
Portanto, o conversor pode dividir a tenso de entrada analgica entre 0v e
5V para 2^10 nveis, ou seja, 1024 nveis distintos
Ento, o valor lido pelo conversor AD ser sempre um nmero no intervalo
entre 0 e 1023 (em decimal) ou entre 0x00 e 0x3FF em hexadecimal.
Podemos usar a regra de trs para calcular a representao binria de uma
tenso de entrada analgica. Por exemplo, vamos calculara representao
binria de valor sobre a tenso analgica de 3,65 volts de entrada:

A tenso analgica de 3.65V na entrada ser representado pelo nmero


decimal 748 ou pelo nmero binrio 1011101100. De maneira
semelhante, podemos encontrar uma representao binria para qualquer
nvel desejado de tenso de entrada analgica.
O Conversor A D tem quatro registradores 8 bits:
ADCON0 - determina o comportamento do conversor AD.
ADCON1 - determina a configurao do PORTA e PORTE e como o resultado
da converso AD ser armazenado em ADRESH e ADRESL
ADRESH armazena os bits mais significativos resultantes da converso AD.
ADRESL - armazena os bits menos significativos resultantes da converso AD.

ADCON0

ADCS1, ADCS0 Estes dois bits do registrador ADCON0 selecionam a freqncia de


clock usado para sincronizao interna do conversor AD.
Ele tambm afeta a durao de converso.

Se ambos os bits forem feitos iguais a 1, o clock ser gerado por um oscilador RC
interno ao chip.

Bits CHS3 at CHS0


- Analog Channel Select Bits
Selecionam um pino ou um canal analgico para converso AD, para medio de
tenso, de acordo com a seguinte tabela:

Bits: GO/DONE e ADON


GO/DONE - A/D Conversion Status Bit
Determina o status atual de converso:
1 - converso A / D est em andamento.
0 - converso A / D est completa. Este bit automaticamente
limpo por hardware quando a converso AD est completa.
ADON Liga ou desliga o conversor AD.
1 - Uma converso AD ativada.
0 - Conversor AD est desativado.

Registrador ADCON1 ( no PIC16F887, ateno! )

ADFM - AD Result Format Select Bit


1 - resultado da converso justificado direita.
Seis bits mais significativos do ADRESH no so utilizados.
0 - resultado da converso justificado esquerda.
Seis bits menos significativos do ADRESL no so utilizados.

Bits VCFG1 e VCFG0


VCFG1 -Voltage Reference Bit -1
Seleciona fonte de referncia de tenso negativa necessria para a operao
do conversor AD.
1 - referncia de tenso negativa aplicada ao pino Vref-.
0 - Tenso de alimentao Vss usado como fonte de referncia de tenso
negativa.
VCFG0 - Voltage Reference Bit -0
Seleciona fonte de referncia de tenso positiva necessria para o
funcionamento do conversor AD.
1 - referncia de tenso positiva aplicada ao pino Vref+.
0 - Tenso de alimentao Vdd usado como fonte de referncia de tenso
positiva.

ADCON1 no PIC16F876 / 877


Os microcontroladores PIC16F87x (objeto deste curso) tem um registrador
ADCON1 um pouco diferente do mostrado anteriormente

Bits PCFGx
PCFG3 a PCFG0: A/D Port Configuration Control bits

Resumo: Como fazer uma Leitura do conversor AD


A fim de medir a tenso num pino de entrada do conversor AD, o seguinte procedimento deve ser feito:
Passo 1 - Configurao de porta:
Faa uma lgica 1 a um bit do registrador TRIS, configurando assim o pino apropriado para uma entrada.
Faa uma lgica 1 a um bit do registrador ANSEL, configurando assim o pino apropriado para uma
entrada analgica.
Passo 2 - configurao do mdulo ADC:
Configurar referncia de tenso no registrador ADCON1.
Escolha um clock de converso ADC no registrador ADCON0.
Escolha um dos canais de entrada CH0-CH13 do registrador ADCON0.
Escolha um formato de dados usando o bit ADFM do registrador ADCON1.
Ativar conversor AD, definindo o bit ADON do registrador ADCON0.

Passo 3 - configurao de interrupo ADC (opcionalmente):


Limpar o bit ADIF.
Defina a ADIE, PEIE e bits GIE.

Resumo
Passo 4 - Aguarde o tempo de aquisio ( aproximadamente 20us ).

Passo 5 - Inicie a converso, setando o bit GO/DONE do registrador


ADCON0.
Passo 6 - Aguarde at que a converso ADC esteja concluda.
necessrio verificar no lao do programa se o bit GO/DONE
seja limpo ou esperar por uma interrupo do AD (que deve ser
previamente habilitada).
Passo 7 - Leia resultados ADC:
Leia os registradores ADRESH e ADRESL.

Modelo eltrico para a Entrada Analgica do PIC

Note a presena do Capacitor de Amostragem C- Hold, sua funo reter


a tenso que ser amostrada pelo conversor AD.

O tempo mnimo de amostragem depende do valor do


capacitor C-Hold e do resistor Rss

Equao que permite calcular o tempo mnimo de amostragem para o PIC16F877.


Depende fundamentalmente do tempo de carga do capacitor C-Hold

IMPORTANTSSIMO !
O Tempo de Aquisio Tad depende fundamentalmente da impedncia de
entrada do sinal colocado na entrada analgica !
A impedncia mxima da fonte de sinal analgico deve ser de 10 Kohms;
O tempo mnimo de aquisio para uma impedncia de 10K de 19,72us
O tempo mnimo de aquisio para uma impedncia de entrada de 50
ohms de 10,61us.
Para usar fontes de entrada com impedncia maior do que 10K,
recomenda-se o uso de um buffer (conversor de impedncia) externo ao
microcontrolador:

Amplificador Operacional ligado como seguidor de tenso (buffer)

A fim de permitir que o conversor AD possa ser executado sem


problemas, bem como para evitar resultados indesejveis,
necessrio considerar:
a) Conversor AD no distingue entre sinais digitais e analgicos.
b) Para evitar erros de medio ou danos no chip, pinos devem ser
configurados como entradas analgicas antes que o processo de
converso seja iniciado.
Os bits usados para este fim so armazenados nos registradores TRIS e
ANSEL ( Obs: ANSEL no existe no PIC16F87x ) ;
Quando for feita a leitura da porta com entradas analgicas, o estado
dos bits correspondentes sero lidos com o valor zero (0);
A grosso modo a medio de tenso no conversor baseado na
comparao de tenso de entrada com escala interna, que tem
1.024 marcas ( 2^10 = 1024 ).
A marca de escala menor significa a tenso Vref-, enquanto que a sua
maior marca significa a tenso Vref +.
A figura a seguir mostra referncias de tenso selecionveis, bem
como seus valores mnimos e mximos.

Valores mnimo e mximo da Tenso de


referncia Vref

Valores mnimo e mximo da Tenso de


referncia Vref
O valor mnimo de Vref+ ( Vcc - 2.5V )
O valor mximo de Vref+ ( Vcc+0,3V )
O valor mnimo de Vref- ( GND - 0,3V )
O valor mximo de Vref- (Vref+ - 2V )

Questo
a) Se a tenso de alimentao Vcc do PIC for de
5 volts, qual o menor intervalo possvel
entre Vref- e Vref+ ?
b) Para este menor intervalo possvel, qual o
menor valor de tenso que pode ser lido pelo
conversor AD ?

Perodo do clock do conversor AD


O tempo necessrio para completar a converso de um bit definido
como Tad.
necessrio esperar pelo menos 1,6 us para o PIC16F876 entre uma
converso e outra.
O menor tempo Tad varia conforme o modelo de microcontrolador, e
os valores corretos podem ser obtidos nos datasheets.
Uma converso AD de 10 bits ligeiramente mais demorada do que o
esperado e dura 11,5 perodos Tad (para uma converso de 10
bits).
Uma vez que tanto a frequncia de clock quanto a fonte de converso
AD so especificados pelo firmware, necessrio selecionar uma
das combinaes de bits disponveis em ADCS1 e ADCS0 antes da
medio da tenso em algumas das entradas analgicas comear.
Estes bits so armazenados no registrador ADCON0.

O tempo total que uma amostragem demora


...

Tempo Total = Tempo Aquisio + Tempo de Converso

O tempo total que demora uma converso ...

Teorema de Nyquist
O critrio de Nyquist afirma que, para evitar o aliasing, devemos amostrar um
sinal a uma taxa igual a pelo menos duas vezes sua largura de banda.

Em outras palavras:
A Frequncia de Amostragem deve ser 2 vezes maior
que a frequencia que desejamos amostrar (Teorema
de Nyquist).
Na minha experincia prtica de desenvolvedor de sistemas embarcados, eu
reescreveria o Teorema de Nyquist assim:
A Frequncia de Amostragem deve ser pelo menos 10 vezes maior que a
frequencia que desejamos amostrar (Teorema de Fambrini).

Exemplo: Aplicando o Teorema de Nyquist


Problema: Deseja amostrar a senide da rede eltrica, cuja frequencia de
60 Hz.
a)
b)
c)
d)

Qual deve ser a menor frequencia de amostragem, de acordo com Nyquist ?


Qual o maior tempo permitido entre amostras consecutivas ?
Na prtica, qual deveria ser a frequencia de amostragem ?
Qual deve ser na prtica o periodo entre as amostras ?

Configurao dos bits ADCS01 e ADCS02

11 ciclos da Converso do AD

IMPORTANTSSIMO !
1- O registrador ADCON1 est no Banco 1 da memria
( bsf STATUS,RP0) mas o registrador ADCON0 est no
Banco 0 da RAM ( bcf STATUS,RP0). Uma opo
usar a diretiva BANKSEL para selecionar o banco de
memria correto. Exemplo: banksel ADCON1.
Esquecer de chavear corretamente os bancos de
memria acarreta o no funcionamento do programa
2 Os microcontroladores PIC16F87x no possuem o
registrador de configurao ANSEL. A configurao
do AD feita apenas nos registradores ADCON0 e
ADCON1

Exemplo de uso do AD em Assembly


; configurao dos registradores
inicio:
bsf STATUS,5
movlw b'00000001' ;ajusta os pinos RA0 at RA4 como entradas e RA5 como saida
movwf TRISA
movlw b'00000000' ;ajusta o PORTD como saida (Leds)
movwf TRISD
clrf INTCON

; desligas as interrupes

movlw b'10001110 ; fosc/2 = 2MHz clock do conversor AD


movwf ADCON1

bcf STATUS, 5
movlw b'00000101' ;Justificado direita, a referencia VDD=5 volts, AN0 entrada analog
movwf ADCON0 ;Ajusta RA0 como entrada analgica
bsf PORTA,5
clrf PORTD

; necessrio para ligar os leds na Placa Abreu's


; inicialmente, leds do PORTD apagados

Rotina principal Uso do AD em Assembly


MAIN:
call DELAY
bsf ADCON0,2

; aguarda 20us
; liga o bit GO do ADCON0

CHECK:
btfsc ADCON0,2 ; Aguarda 12 Tad, aproximadamente 24us se clock= 4MHz
goto CHECK
; loop que aguarda o termino da converso AD

bsf STATUS,RP0
movf ADRESL,W

; muda para BANCO1 da memoria


; transfere o registrador de Leitura do AD para o W

bcf STATUS,RP0
; muda para o banco0 da memria
movwf PORTD ; coloca o valor do W no PORTD, acendendo os LEDs correspondentes
nop
nop

; desperdia dois ciclos de maquina

goto MAIN

; retorna para o inicio deste loop

Exemplo 1- Testando o Conversor AD em


Assembly
Rode o Exemplo 1:
Teste_ADC_Assembly

Exerccio
No programa anterior, identifique todas as
configuraes atribudas a cada bit dos
registradores ADCON0 e ADCON1.
Explique cada uma delas, escrevendo-as no seu
caderno.
ADCON0=00000101

ADCON1=10001110

Exemplo 2 Conversor AD em Linguagem C

// Configurao do conversor AD
SETUP_ADC_PORTS(RA0_ANALOG);
setup_ADC(ADC_CLOCK_INTERNAL);
set_adc_channel(0);

Exemplo 2 Conversor AD em Linguagem C

while(true){
resultado = read_adc( );
output_D (resultado);
delay_us(20);
}//while(true)
}//main

Exemplo 2: Conversor AD em C
Abra e execute o Exemplo 2: Conversor AD em
linguagem C compilador CCS

Exemplo 3 Conversor AD e interrupes

Neste exemplo, ilustraremos o uso do


Conversor AD usando-se interrupo, em
Linguagem Assembly.

Rotina de interrupo do ADC


;-----------------------------------------------------------AD_ISR:
banksel ADRESL
movf ADRESL,W
; L o resultado do conversor AD
movwf PORTD
; escreve este resultado no PORTD
banksel PORTD
call DELAY
; Aguarda o tempo de aquisio
banksel ADCON0
bsf ADCON0,2
; Inicia a converso AD (faz o bit GO=1 )
BANKSEL PIR1
bcf PIR1, ADIF
; Limpa o flag de interrupo do conversor AD
retfie
;----------------------------------------------------------

Inicializao da Interrupo do ADC


;-------------------------------------------------------------------------------INICIA_IRQ:
bcf PIR1, ADIF
; Limpa o Flag ADIF (bit 6)
bsf STATUS,RP0
; Acessa o Bank1
bsf PIE1, ADIE
; Habilita a interrupo do ADC
bcf STATUS, RP0
; Acessa o Bank 0
bsf INTCON, PEIE
; Habilita Interrupo de Perifericos
bsf INTCON, GIE
; Habilita a chave geral das interrupes
call DELAY
; espera pelo tempo de Aquisio TACQ
bsf ADCON0,2
; Inicia converso do AD (faz o bit GO=1 )
;----------------------------------------------------------------------------------

Exemplo 4: Interrupes do Conversor AD em


linguagem C

// Configurao do conversor AD
SETUP_ADC_PORTS(RA0_ANALOG);
setup_ADC(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
//configura a Interrupo do AD
enable_interrupts(INT_AD );
enable_interrupts(GLOBAL);

Rotina de Interrupo do AD em Linguagem C


//---------------------------------------------------------------#INT_AD
void ADC_ISR( ){
output_D(resultado);
// delay_us(20);
//AGUARDA PELO
TEMPO DE AQUISIO
}
//---------------------------------------------------------------

Loop Principal do programa em C


while(true){
//Quando termina a converso, ocorre a
// interrupo do ADC
resultado = read_adc( );
// Coloque aqui seu programa principal
}//while(true)

PWM
MODULAO POR LARGURA DE PULSOS

PWM
PWM um acrnimo de Pulse Width Modulator (Modulao por Largura de Pulsos).
Trata-se de uma tcnica poderosa usada para gerar tenso analgica a partir de sinais
digitais.
PWM tem uma ampla variedade de aplicaes tais como controlar a potncia mdia
fornecida a uma carga, gerando nveis de tenso analgica, gerao de onda senoidal e
controle de velocidade do motores.
Sinais PWM so sinais do tipo On-Off (da o nome de pulso) cuja durao do tempo ligado
"On" pode variar de acordo com nossas necessidades.
A frao do perodo de tempo durante o qual o sinal ON dividida perodo de tempo total
denominado Ciclo Ativo (em ingls, DutyCycle=DC ).
Os microcontroladrores PIC possuem os mdulos CCP que podem ser usados para gerar
ondas PWM.
CCP uma sigla para para Capture/Compare/PWM.
O PIC 16F877A tem dois mdulos CCP chamados de CCP1 e CCP2.
Neste curso estudaremos apenas o mdulo PWM.
Os PIC16F877 podem produzir PWM com resoluo de at 10-bit (ou menos).

Outra definio para PWM


PWM so sinais digitais de frequncia fixa e ciclo ativo varivel.
O ciclo ativo (DC) pode ser calculado por:

Observe que o perodo total de cada pulso t = t1+t2. Num sistema PWM,
o perodo t constante.

Exemplo de sinais PWM com vrios ciclos ativos diferentes

Recuperando o nvel DC de um sinal PWM


Para recuperar o nvel DC de um sinal PWM, necessrio faz-lo passar por um filtro
passa-baixas (ou integrador) formado por um capacitor ligado em srie e um
capacitor ligado em paralelo com a sada.
A Frequencia de corte deste integrador calculada por:

Para que este filtro passa-baixas se comporte como um integrador, preciso


que a frequencia de corte Fc seja pelo menos 10 vezes maior do que a
frequencia do sinal PWM:

Recuperando o Sinal DC possivel sintetizar qualquer forma


de onda ver Exemplo 7
Pode-se gerar senides, ondas quadradas, triangulares, enfim, qualquer forma de
onda, simplesmente passando-se a saida do PWM por um integrador:

Ver o seguinte site:


http://fdi-ffambrin.blogspot.com.br/2015/02/gerando-onda-senoidal-com.html

Perodo do Sinal PWM


O perodo do sinal PWM gerado no pino RC2/CCP1 definido pelo valor escrito no
registrador PR2, pela Fosc e pelo fator de Prescaler aplicado ao TMR2. O valor
exato do perodo dado pela frmula:

T(PWM) =
Perodo do Sinal PWM
Tosc =
1 / Fosc
Prescaler do TMR2 = Fator de Prescaler aplicado ao TMR2

Isolando-se PR2 na frmula anterior

PR2= Valor necessrio para gerar a frequencia F(pwm)


Fosc =

Frequencia do oscilador principal (ver no prx. slide)

F(pwm)= Frequencia do sinal PWM


Prescaler do TMR2 = Fator de Prescaler aplicado ao TMR2

O que significa Fosc ?


a frequencia do oscilador de clock .
A velocidade de clock do processador a velocidade do oscilador
escalado para cima ou para baixo pela cadeia de divisores de
osciladores e multiplicadores.
Por exemplo:
a) se voc estiver usando um PIC com um oscilador externo (cristal) de
4 MHz e no possui PLL (ou o PLL est desativado), Fosc igual a
4 MHz.
b) Se voc estiver usando um PIC com um oscilador interno de 8 MHz e
um PLL ativado na modalidade 4x PLL, Fosc ser igual 32 MHz.

Exerccio
Qual o valor que deve ser escrito no registrador PR2
para gerar um sinal PWM no pino RC2/CCP1 com
uma frequncia de 15625Hz, sendo a frequncia do
oscilador principal de 4MHz e o fator de Prescaler do
TMR2 de 1:1 ?

Soluo

PR2=63

Ciclo Ativo do Sinal PWM


O ciclo do sinal PWM se inicia quando TMR2=(PR2+1). Nesse momento, os seguinte eventos
ocorrem:
a) O TMR2 apagado dando incio a um novo ciclo do sinal PWM.
b) O pino RC2/CCP1 setado, dando inicio ao ciclo ativo (exceto se o duty cycle for de 0%)
c) O registrador CCPR1H carregado com o conteudo do registrador CCPR1L, com a finalidade de
atualizar a largura do ciclo ativo no ciclo do sinal que se inicia.
IMPORTANTSSIMO:
O tempo correspondente ao ciclo ativo controlado por 10 bits, chamados bits de controle, os
quais so compostos pelo registrador CCPR1L mais os bits 5 e 4 do registrador CCP1CON;
O registrador CCPR1L contm os 8 bits mais significativos, enquanto que os bits 5 e 4 do
registrador CCP1CON guarda os 2 bits menos significativos.
O ciclo ativo termina quando

TMR2 :<Q1:Q0> = ( CCPR1L : CCP1CON<5:4> )

Tendo em vista que o TMR2 s possui 8 bits, ele concatenado com 2 bits obtidos do Oscilador
Principal ou do Prescaler do TMR2 que so aqui representados por <Q1:Q0>, para
completar os 10 bits necessrios para que seja feita a comparao com os bits de controle.

Quando termina o Ciclo Ativo do PWM ?


O ciclo ativo do PWM terminar exatamente quando:
TMR2:<Q1:Q0> == (CCPR1L : CCP1CON<5:4> )

A esquerda, diagrama de blocos simplificado


do PWM do PIC.
Os bits <Q1:Q0> pertencem ou ao oscilador
principal ou ao Prescaler e no podem ser
escritos pelo usurio.

Perodo do Ciclo Ativo do PWM


calculado pela seguinte frmula:

PWM duty cycle =(CCPR1L:CCP1CON<5:4>) Tosc ( Prescaler do TMR2 )


Onde:
PWM duty cycle = Tempo correspondente ao ciclo ativo do sinal PWM
(CCPR1L:CCP1CON<5:4>) = Valor que definir a largura do ciclo ativo
Tosc = 1 / Fosc
Prescaler do TMR2 = Fator de Prescaler aplicado por software ao Timer2

Outra frmula para o Perodo do Ciclo Ativo

PWM duty cycle = (CCPR1L:CCP1CON<5:4>) / (PR2 + 1) x 4

Para ver uma demonstrao desta frmula, ver o Livro:


Microcontroladores PIC uma abordagem prtica e objetiva , Autor: Wagner
Zanco, editora rica 1 edio, 2005, pginas 241 e 242.

Clculo do Nmero de Passos de Controle


O controle do PWM feito a partir da diviso do perodo do sinal de PWM em passos
iguais de tempo, chamados de Passos de Controle.
O sinal PWM dividido em Np passos tal que:
Np = (PR2 + 1) x 4
Np : nmero de passos em que ser dividido o sinal PWM
PR2: valor que o usurio colocou via software no registrador PR2
Por exemplo, se, PR2=63 (decimal), o sinal PWM ser dividido em 256 partes iguais,
podendo-se controlar em qual destas partes o sinal ser colocado em nvel 0 aps
o inicio do ciclo ativo.

Obs: Se escrevermos o valor PR2 = 255 (0xFF) no ser possvel obter um ciclo ativo de 100%, porque Np =
1024. Para obtermos um ciclo de 100% seria necessrio escrever o valor 1024 nos bits de controle, mas
isso no possivel, pois s temos 10 bits de controle, ento o maior valor possivel de ser escrito 1023.

Clculo do tempo correspondente a cada Passo


Dividindo o perodo do sinal (Tpwm) pelo nmero de passos temos o tempo
(Tp) correspondente a cada passo:
Tp= Tpwm / Np
Exerccio:
Considere um sinal PWM de frequencia 15625Hz e o valor de PR2=63.
Calcule o tempo correspondente a cada passo. ( Resp: Tp= 250 ns )

O tempo correspondente a cada passo tambm chamado RESOLUO


TEMPORAL DO PWM, e nos informa qual a variao mnima do ciclo
ativo.

Clculo do tempo correspondente ao ciclo ativo


O tempo correspondente ao ciclo ativo pode ser calculado efetuando-se o
produto entre Tp e o valor armazenado em CCPR1L : CCP1CON<5:4>
PWM duty cycle = Tp x CCPR1L : CCP1CON<5:4>
Sendo Tp um valor fixo, o ciclo ativo do PWM depender nica e
exclusivamente dos bits de controle CCPR1L : CCP1CON<5:4>, nos quais
cada unidade equivale a 1x Tp

RESUMO
Para ativar o modo PWM, aconselha-se seguir os seguintes passos:
1- Configurar o perodo do sinal PWM escrevendo o valor correto no
registrador PR2;
2 Configurar a largura do ciclo ativo escrevendo o valor correto nos bits de
controle CCPR1L:CCP1CON<5:4>
3 Configurar o pino RC2/CCP1 como sada, fazendo bcf TRISC, 2
4 Ligar o TMR2 com o valor desejado no Prescaler (T2CON)
5 Ativar o modo PWM fazendo CCP1CON <3:0> = 1100

Afinal, para que serve o registrador CCPR1H ?


O CCPR1H apenas um buffer e no pode ser escrito pelo usurio.
No modo de PWM, CCPR1H um registrador que serve somente para leitura.
O registrador CCPR1L e os bits CCP1CON <5: 4> podem ser escritos a
qualquer momento pelo usurio, mas o valor do ciclo ativo no ser
atualizado em CCPR1H at o momento em que PR2 e TMR2 se igualam
(isto , aps um perodo completo). O registrador CCPR1H e mais um
latch interno de 2 bits so usados como buffer para o ciclo ativo PWM.
Este duplo buffer essencial para o funcionamento do PWM sem falhas.
Quando o registrador CCPR1H concatenado com 2 bits internos se
igualarem com TMR2 concatenado com 2 bits internos <Q1:Q0> do clock,
ou 2 bits do Prescaler do TMR2, ento o pino CCP1 ser zerado e inicia o
tempo desligado do PWM.
Veja novamente o diagrama de blocos no slide anterior chamado Quando
termina o Ciclo Ativo do PWM ?

Mxima Resoluo (em bits) do PWM

Obs: Se o valor do ciclo ativo do PWM mais longo do que


o perodo do PWM, o pino CCP1 no ser zerado.

Explicao para a Frmula do slide anterior


Na arquitetura dos PICs, a resoluo (no tempo) do PWM de 1 ciclo de mquina.
A resoluo mxima em bits (base 2) ser
do nmero de ciclos de mquina
que cabem no perodo escolhido para o PWM.
Vamos a um exemplo:
a) Para um PIC rodando com cristal de 20MHz, o ciclo de mquina ser :
(1/20.000000) * 4 = 0,2us;
Se escolhermos uma frequncia de 20kHz para o PWM, o perodo deste PWM ser
50us; e cabero 50/0,2 = 250 ciclos de mquina.
A resoluo do PWM ser

; na prtica 8 bits

b) Se a frequncia do PWM fosse de 50kHz, a resoluo seria de log2(100) = 6,64 bit.

Como o registrador PR2 que controla o perodo do


PWM, uma mudana de valor de PR2 afeta
diretamente a resoluo do PWM.

Exerccio
Calcule a mxima resoluo (em bits) do ciclo
ativo que pode ser obtida usando-se uma
frequncia de PWM de 78.125 kHz e oscilador
de clock com cristal de 20 MHz.
Dado: log(2) = 0,3010
(Resp: aprox. 8 bits )

Exemplo de Frequncias e Resolues do PWM para oscilador


de clock a 20 MHz

Concluso:
Pode-se ver claramente que o valor escolhido para o registrador PR2 afeta a resoluo
em bits do PWM e consequentemente, o nmero de passos que podem ser obtidos.

Registrador CCP1CON

PROGRAMAS-EXEMPLOS: PWM

Exemplo 5: Gerando PWM em Assembly


; Oscilador de 4 MHz
; Gera um PWM de frequencia 10KHz com ciclo ativo de 50% no pino RC2/CCP1

MAIN
BCF STATUS,RP0
CLRF PORTA
CLRF PORTB
CLRF PORTC
BSF STATUS,RP0
MOVLW B'11111111'
MOVWF TRISA
CLRF TRISB
CLRF TRISC

; limpa o PORTA
; limpa o PORTB
; limpa o PORTC
; muda para bank 1
; PORTA entrada
; PORTB saida

Exemplo 5: Gerando PWM em Assembly


movlw B'01100011' ; periodo = 0.0001 seconds
movwf PR2
bcf STATUS,RP0
movlw B'00110010' ; ajusta o ciclo ativo para 50% ou 0.00005 seconds
movwf CCPR1L
bcf CCP1CON,5
bcf CCP1CON,4
bsf STATUS,RP0
bcf TRISC,2
; pino RC2 do PORTC saida
bcf STATUS,RP0
movlw B'00000100'
movwf T2CON
; prescaler =1 , timer2 ligado
bsf CCP1CON,3
; configura o modulo CCP1 para funcionar como PWM
bsf CCP1CON,2
loop:
goto loop

Exemplo 6: Gerando PWM em Linguagem C


main( ) {
// A saida do mdulo CCP1 o pino 17 do PIC16F877 e pino 13 do PIC16F876
long int ciclo=0;
setup_timer_2 (T2_DIV_BY_16, 61, 1); // timer 2 = 1,008 khz
setup_ccp1 (ccp_pwm);
// configura CCP1 para modo PWM
set_pwm1_duty ( 0 );

// configura o ciclo ativo em 0 (desligado)

while (true) {
for (ciclo=0; ciclo<1024; ciclo++){
set_pwm1_duty (ciclo);
delay_ms(5);
}
delay_ms(1000);
}
}

// configura o ciclo ativo

Avaliao 2
1)
a)
b)
c)
d)
e)
f)

Considere um microcontrolador PIC16F876 com oscilador de clock a cristal de 20 MHz. A frequncia


desejada para o PWM de 78125Hz e o prescaler do TMR2 de 1:1. Calcular:
Qual o valor que deve ser escrito no registrador PR2 ?
Nmero de passos
Tempo correspondente a cada passo
Calcule o ciclo ativo para CCPR1L:CCP1CON<5:4> = 180
Nvel DC do sinal PWM para uma alimentao de 5 volts no PIC
Diagrama de tempo do sinal PWM

2) Escreva um programa para PIC16F876 com cristal de 4MHz que:


a) Leia a tenso obtida a partir de um potencimetro de 10K ligado ao pino AN0 (use o conversor A/D)
fazendo uma leitura a cada 50 ms (use interrupo do timer0 ou timer 1 para pegar as amostras);
b) O valor lido pelo conversor AD deve ser um numero entre 0 e 255 ( 8 bits).
c) Ative o PWM com frequencia de 1KHz e utilize o valor lido pelo conversor AD para ajustar o ciclo ativo do
PWM de 0 at 100% conforme mexemos no potencimetro. A resoluo do PWM pode ser de 8 ou 10
bits, a sua escolha.
Resumo: Ao mexer no potenciometro, muda o ciclo ativo do PWM.
Fique a vontade para usar linguagem C ou Assembly para fazer este programa (ou ambas, se voc quiser).
Simule no PROTEUS.