Trata-se de um conjunto de 72 slides de uma aula de 4 horas de duração na pós-graduação da Unisal_Campinas, sobre o Tema Conversor A/D e PWM dos microcontroladores PIC16F87x.
1. AULA 4
Conversor AD e PWM
Microcontroladores PICMicrocontroladores PIC
Prof. Msc. Francisco Fambrini
27/06/2015
LAB 4L
Intervalo para cooffe break 9:25hs a 9:40hs
2. Conversor A/D
O papel do Conversor Analógico/Digital (A/D) é converter valores de tensão analógicas para valores digitais.
O conversor analógico-digital converte tensão analógica para números binários.
Estes números binários podem ser de comprimento diferentes: 2, 4, 8, 10, 12 ou 16 bits.
Quanto mais bits o conversor AD tiver, maior será a resolução deste AD.
Por exemplo: Suponha que a tensão fornecida ao conversor A/D varia de 0 a 5 volt, e o conversor A/D converte
a voltagem de entrada a um número binário de 2 bits apenas.
Com 2 bits nós podemos ter apenas 4 saídas diferentes:
3. Conversor AD
A linha azul descreve as mudanças na tensão de entrada analógica do
microcontrolador. A linha vermelha representa os níveis digitais na saída
do conversor AD do microcontrolador.
Podemos ver que o sinal vermelho está longe de ser ideal, ou seja, não
reproduz os valores de tensão de entrada analógica original.
Assim, podemos dizer que este AD de 2-bit possui baixa resolução e há uma
grande diferença entre o valor real da tensão de entrada analógica e os
valores representados por este A D.valores representados por este A D.
Agora, suponhamos que a tensão fornecida ao conversor A D varia de 0 a 5
volt, no entanto, o conversor A / D converte a voltagem de entrada a um
número binário de 3-bits.
Com 3-bits podemos obter 8 opções diferentes:
4. Conversor AD de 3 bits
Exemplo: Um hipotético AD de 3-bit de resolução
5. Exemplo: Um hipotético AD de 3-bit de
resolução
Neste exemplo, os valores de tensão analógico de 0V a 0.62v tem uma
representação binária de 000; os valores de tensão analógica de 0,621 V
até 1,25V tem uma representação binária de 001 assim por diante.
6. Conversor AD interno dos PICs
O módulo de conversor de analógico para digital localizado dentro do
microcontrolador PIC tem uma resolução de 10-bits.
Portanto, o conversor pode dividir a tensão de entrada analógica entre 0v e
5V para 2^10 níveis, ou seja, 1024 níveis distintos
Então, o valor lido pelo conversor AD será sempre um número no intervalo
entre 0 e 1023 (em decimal) ou entre 0x00 e 0x3FF em hexadecimal.
Podemos usar a “regra de três” para calcular a representação binária de umaPodemos usar a “regra de três” para calcular a representação binária de uma
tensão de entrada analógica. Por exemplo, vamos calculara representação
binária de valor sobre a tensão analógica de 3,65 volts de entrada:
7. A tensão analógica de 3.65V na entrada será representado pelo número
decimal 748 ou pelo número binário 1011101100. De maneira
semelhante, podemos encontrar uma representação binária para qualquer
nível desejado de tensão de entrada analógica.
O Conversor A D tem quatro registradores 8 bits:
ADCON0 - determina o comportamento do conversor AD.
ADCON1 - determina a configuração do PORTA e PORTE e como o resultado
da conversão AD será armazenado em ADRESH e ADRESL
ADRESH – armazena os bits mais significativos resultantes da conversão AD.
ADRESL - armazena os bits menos significativos resultantes da conversão AD.
8. ADCON0
ADCS1, ADCS0 – Estes dois bits do registrador ADCON0 selecionam a freqüência de
clock usado para sincronização interna do conversor AD.
Ele também afeta a duração de conversão.Ele também afeta a duração de conversão.
Se ambos os bits forem feitos iguais a 1, o clock será gerado por um oscilador RC
interno ao chip.
9. Bits CHS3 até CHS0
- Analog Channel Select Bits
Selecionam um pino ou um canal analógico para conversão AD, para medição de
tensão, de acordo com a seguinte tabela:
10. Bits: GO/DONE e ADON
GO/DONE - A/D Conversion Status Bit
Determina o status atual de conversão:
1 - conversão A / D está em andamento.
0 - conversão A / D está completa. Este bit é automaticamente
limpo por hardware quando a conversão AD está completa.limpo por hardware quando a conversão AD está completa.
ADON – Liga ou desliga o conversor AD.
1 - Uma conversão AD é ativada.
0 - Conversor AD está desativado.
11. Registrador ADCON1 ( no PIC16F887, atenção! )
ADFM - AD Result Format Select Bit
1 - resultado da conversão é justificado à direita.1 - resultado da conversão é justificado à direita.
Seis bits mais significativos do ADRESH não são utilizados.
0 - resultado da conversão é justificado à esquerda.
Seis bits menos significativos do ADRESL não são utilizados.
12. Bits VCFG1 e VCFG0
• VCFG1 -Voltage Reference Bit -1
Seleciona fonte de referência de tensão negativa necessária para a operação
do conversor AD.
1 - referência de tensão negativa é aplicada ao pino Vref-.
0 - Tensão de alimentação Vss é usado como fonte de referência de tensão
negativa.
• VCFG0 - Voltage Reference Bit -0
Seleciona fonte de referência de tensão positiva necessária para o
funcionamento do conversor AD.
1 - referência de tensão positiva é aplicada ao pino Vref+.
0 - Tensão de alimentação Vdd é usado como fonte de referência de tensão
positiva.
13. ADCON1 no PIC16F876 / 877
Os microcontroladores PIC16F87x (objeto deste curso) tem um registrador
ADCON1 um pouco diferente do mostrado anteriormente
15. Resumo: Como fazer uma Leitura do conversor AD
A fim de medir a tensão num pino de entrada do conversor AD, o seguinte procedimento deve ser feito:
Passo 1 - Configuração de porta:
Faça uma lógica 1 a um bit do registrador TRIS, configurando assim o pino apropriado para uma entrada.
Faça uma lógica 1 a um bit do registrador ANSEL, configurando assim o pino apropriado para uma
entrada analógica.
Passo 2 - configuração do módulo ADC:
Configurar referência de tensão no registrador ADCON1.Configurar referência de tensão no registrador ADCON1.
Escolha um clock de conversão 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 - configuração de interrupção ADC (opcionalmente):
Limpar o bit ADIF.
Defina a ADIE, PEIE e bits GIE.
16. Resumo
Passo 4 - Aguarde o tempo de aquisição ( aproximadamente 20us ).
Passo 5 - Inicie a conversão, setando o bit GO/DONE do registrador
ADCON0.
Passo 6 - Aguarde até que a conversão ADC esteja concluída.Passo 6 - Aguarde até que a conversão ADC esteja concluída.
É necessário verificar no laço do programa se o bit GO/DONE
seja limpo ou esperar por uma interrupção do AD (que deve ser
previamente habilitada).
Passo 7 - Leia resultados ADC:
Leia os registradores ADRESH e ADRESL.
17.
18. Modelo elétrico para a Entrada Analógica do PIC
Note a presença do Capacitor de Amostragem C- Hold, sua função é reter
a tensão que será amostrada pelo conversor AD.
19. O tempo mínimo de amostragem depende do valor do
capacitor C-Hold e do resistor Rss
Equação que permite calcular o tempo mínimo de amostragem para o PIC16F877.
Depende fundamentalmente do tempo de carga do capacitor C-Hold
20. IMPORTANTÍSSIMO !
• O Tempo de Aquisição Tad depende fundamentalmente da impedância de
entrada do sinal colocado na entrada analógica !
• A impedância máxima da fonte de sinal analógico deve ser de 10 Kohms;
• O tempo mínimo de aquisição para uma impedância de 10K é de 19,72us
• O tempo mínimo de aquisição para uma impedância de entrada de 50
ohms é de 10,61us.
• Para usar fontes de entrada com impedância maior do que 10K,• Para usar fontes de entrada com impedância maior do que 10K,
recomenda-se o uso de um buffer (conversor de impedância) externo ao
microcontrolador:
Amplificador Operacional ligado como seguidor de tensão (buffer)
21. A fim de permitir que o conversor AD possa ser executado sem
problemas, bem como para evitar resultados indesejáveis, é
necessário considerar:
a) Conversor AD não distingue entre sinais digitais e analógicos.
b) Para evitar erros de medição ou danos no chip, pinos devem ser
configurados como entradas analógicas antes que o processo de
conversão seja iniciado.
Os bits usados para este fim são armazenados nos registradores TRIS e
ANSEL ( Obs: ANSEL não existe no PIC16F87x ) ;
Quando for feita a leitura da porta com entradas analógicas, o estadoQuando for feita a leitura da porta com entradas analógicas, o estado
dos bits correspondentes serão lidos com o valor zero (0);
A grosso modo a medição de tensão no conversor é baseado na
comparação de tensão de entrada com escala interna, que tem
1.024 marcas ( 2^10 = 1024 ).
A marca de escala menor significa a tensão Vref-, enquanto que a sua
maior marca significa a tensão Vref +.
A figura a seguir mostra referências de tensão selecionáveis, bem
como seus valores mínimos e máximos.
23. Valores mínimo e máximo da Tensão de
referência Vref
• O valor mínimo de Vref+ é ( Vcc - 2.5V )
• O valor máximo de Vref+ é ( Vcc+0,3V )
• O valor mínimo de Vref- é ( GND - 0,3V )
• O valor máximo de Vref- é (Vref+ - 2V )
24. Questão
a) Se a tensão de alimentação Vcc do PIC for de
5 volts, qual é o menor intervalo possível
entre Vref- e Vref+ ?
b) Para este menor intervalo possível, qual é o
menor valor de tensão que pode ser lido pelo
conversor AD ?
25. Período do clock do conversor AD
O tempo necessário para completar a conversão de um bit é definido
como Tad.
É necessário esperar pelo menos 1,6 us para o PIC16F876 entre uma
conversão e outra.
O menor tempo Tad varia conforme o modelo de microcontrolador, e
os valores corretos podem ser obtidos nos datasheets.
Uma conversão AD de 10 bits é ligeiramente mais demorada do que oUma conversão AD de 10 bits é ligeiramente mais demorada do que o
esperado e dura 11,5 períodos Tad (para uma conversão de 10
bits).
Uma vez que tanto a frequência de clock quanto a fonte de conversão
AD são especificados pelo firmware, é necessário selecionar uma
das combinações de bits disponíveis em ADCS1 e ADCS0 antes da
medição da tensão em algumas das entradas analógicas começar.
Estes bits são armazenados no registrador ADCON0.
26. O tempo total que uma amostragem demora
é...
Tempo Total = Tempo Aquisição + Tempo de Conversão
28. Teorema de Nyquist
O critério 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 Frequência de Amostragem deve ser 2 vezes maior
que a frequencia que desejamos amostrar” (Teorema
de Nyquist).de Nyquist).
Na minha experiência prática de desenvolvedor de sistemas embarcados, eu
reescreveria o Teorema de Nyquist assim:
“A Frequência de Amostragem deve ser pelo menos 10 vezes maior que a
frequencia que desejamos amostrar” (Teorema de Fambrini).
29. Exemplo: Aplicando o Teorema de Nyquist
Problema: Deseja amostrar a senóide da rede elétrica, cuja frequencia é de
60 Hz.
a) Qual deve ser a menor frequencia de amostragem, de acordo com Nyquist ?
b) Qual é o maior tempo permitido entre amostras consecutivas ?
c) Na prática, qual deveria ser a frequencia de amostragem ?
d) Qual deve ser na prática o periodo entre as amostras ?
32. IMPORTANTÍSSIMO !
1- O registrador ADCON1 está no Banco 1 da memória
( bsf STATUS,RP0) mas o registrador ADCON0 está no
Banco 0 da RAM ( bcf STATUS,RP0). Uma opção é
usar a diretiva BANKSEL para selecionar o banco de
memória correto. Exemplo: banksel ADCON1.memória correto. Exemplo: banksel ADCON1.
Esquecer de chavear corretamente os bancos de
memória acarreta o não funcionamento do programa
2 – Os microcontroladores PIC16F87x não possuem o
registrador de configuração ANSEL. A configuração
do AD é feita apenas nos registradores ADCON0 e
ADCON1
33. Exemplo de uso do AD em Assembly
; configuração 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 interrupções
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 analógica
bsf PORTA,5 ; necessário para ligar os leds na Placa Abreu's
clrf PORTD ; inicialmente, leds do PORTD apagados
34. Rotina principal – Uso do AD em Assembly
MAIN:
call DELAY ; aguarda 20us
bsf ADCON0,2 ; 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 conversão AD
bsf STATUS,RP0 ; muda para BANCO1 da memoriabsf STATUS,RP0 ; muda para BANCO1 da memoria
movf ADRESL,W ; transfere o registrador de Leitura do AD para o W
bcf STATUS,RP0 ; muda para o banco0 da memória
movwf PORTD ; coloca o valor do W no PORTD, acendendo os LEDs correspondentes
nop ; desperdiça dois ciclos de maquina
nop
goto MAIN ; retorna para o inicio deste loop
35. Exemplo 1- Testando o Conversor AD em
Assembly
Rode o Exemplo 1:
Teste_ADC_Assembly
36. Exercício
No programa anterior, identifique todas as
configurações atribuídas a cada bit dos
registradores ADCON0 e ADCON1.
Explique cada uma delas, escrevendo-as no seu
caderno.
ADCON0=00000101 e ADCON1=10001110
37. Exemplo 2 – Conversor AD em Linguagem C
// Configuração do conversor AD
SETUP_ADC_PORTS(RA0_ANALOG);
setup_ADC(ADC_CLOCK_INTERNAL);setup_ADC(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
38. Exemplo 2 – Conversor AD em Linguagem C
while(true){
resultado = read_adc( );
output_D (resultado);
delay_us(20);delay_us(20);
}//while(true)
}//main
39. Exemplo 2: Conversor AD em C
Abra e execute o Exemplo 2: Conversor AD em
linguagem C – compilador CCS
40. Exemplo 3 – Conversor AD e interrupções
• Neste exemplo, ilustraremos o uso do
Conversor AD usando-se interrupção, em
Linguagem Assembly.
41. Rotina de interrupção do ADC
;------------------------------------------------------------
AD_ISR:
banksel ADRESL
movf ADRESL,W ; Lê o resultado do conversor AD
movwf PORTD ; escreve este resultado no PORTD
banksel PORTDbanksel PORTD
call DELAY ; Aguarda o tempo de aquisição
banksel ADCON0
bsf ADCON0,2 ; Inicia a conversão AD (faz o bit GO=1 )
BANKSEL PIR1
bcf PIR1, ADIF ; Limpa o flag de interrupção do conversor AD
retfie
;----------------------------------------------------------
42. Inicialização da Interrupção do ADC
;--------------------------------------------------------------------------------
INICIA_IRQ:
bcf PIR1, ADIF ; Limpa o Flag ADIF (bit 6)
bsf STATUS,RP0 ; Acessa o Bank1
bsf PIE1, ADIE ; Habilita a interrupção do ADCbsf PIE1, ADIE ; Habilita a interrupção do ADC
bcf STATUS, RP0 ; Acessa o Bank 0
bsf INTCON, PEIE ; Habilita Interrupção de Perifericos
bsf INTCON, GIE ; Habilita a chave geral das interrupções
call DELAY ; espera pelo tempo de Aquisição TACQ
bsf ADCON0,2 ; Inicia conversão do AD (faz o bit GO=1 )
;----------------------------------------------------------------------------------
43. Exemplo 4: Interrupções do Conversor AD em
linguagem C
// Configuração do conversor AD
SETUP_ADC_PORTS(RA0_ANALOG);
setup_ADC(ADC_CLOCK_INTERNAL);
set_adc_channel(0);set_adc_channel(0);
//configura a Interrupção do AD
enable_interrupts(INT_AD );
enable_interrupts(GLOBAL);
44. Rotina de Interrupção do AD em Linguagem C
//----------------------------------------------------------------
#INT_AD
void ADC_ISR( ){
output_D(resultado);output_D(resultado);
// delay_us(20); //AGUARDA PELO
TEMPO DE AQUISIÇÃO
}
//---------------------------------------------------------------
45. Loop Principal do programa em C
while(true){
//Quando termina a conversão, ocorre a
// interrupção do ADC
resultado = read_adc( );resultado = read_adc( );
// Coloque aqui seu programa principal
}//while(true)
47. PWM
PWM é um acrônimo de Pulse Width Modulator (Modulação por Largura de Pulsos).
Trata-se de uma técnica poderosa usada para gerar tensão analógica a partir de sinais
digitais.
PWM tem uma ampla variedade de aplicações tais como controlar a potência média
fornecida a uma carga, gerando níveis de tensão analógica, geração de onda senoidal e
controle de velocidade do motores.
Sinais PWM são sinais do tipo On-Off (daí o nome de pulso) cuja duração do tempo ligado
"On" pode variar de acordo com nossas necessidades.
A fração do período de tempo durante o qual o sinal é ON dividida período de tempo total éA fração do período de tempo durante o qual o sinal é ON dividida período de tempo total é
denominado Ciclo Ativo (em inglês, DutyCycle=DC ).
Os microcontroladrores PIC possuem os módulos CCP que podem ser usados para gerar
ondas PWM.
CCP é uma sigla para para Capture/Compare/PWM.
O PIC 16F877A tem dois módulos CCP chamados de CCP1 e CCP2.
Neste curso estudaremos apenas o módulo PWM.
Os PIC16F877 podem produzir PWM com resolução de até 10-bit (ou menos).
48. Outra definição para PWM
• PWM são sinais digitais de frequência fixa e ciclo ativo variável.
O ciclo ativo (DC) pode ser calculado por:
Observe que o período total de cada pulso é t = t1+t2. Num sistema PWM,
o período t é constante.
50. Recuperando o nível DC de um sinal PWM
Para recuperar o nível DC de um sinal PWM, é necessário fazê-lo passar por um filtro
passa-baixas (ou integrador) formado por um capacitor ligado em série e um
capacitor ligado em paralelo com a saída.
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:frequencia do sinal PWM:
51. Recuperando o Sinal DC é possivel sintetizar qualquer forma
de onda – ver Exemplo 7
Pode-se gerar senóides, 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
52. Período do Sinal PWM
O período 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 período é dado pela fórmula:
T(PWM) = Período do Sinal PWM
Tosc = 1 / Fosc
Prescaler do TMR2 = Fator de Prescaler aplicado ao TMR2
53. Isolando-se PR2 na fórmula anterior
PR2= Valor necessário para gerar a frequencia F(pwm)
Fosc = Frequencia do oscilador principal (ver no próx. slide)
F(pwm)= Frequencia do sinal PWM
Prescaler do TMR2 = Fator de Prescaler aplicado ao TMR2
54. 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 não 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.
55. Exercício
Qual é o valor que deve ser escrito no registrador PR2
para gerar um sinal PWM no pino RC2/CCP1 com
uma frequência de 15625Hz, sendo a frequência do
oscilador principal de 4MHz e o fator de Prescaler dooscilador principal de 4MHz e o fator de Prescaler do
TMR2 de 1:1 ?
57. 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 início 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.
IMPORTANTÍSSIMO:
O tempo correspondente ao ciclo ativo é controlado por 10 bits, chamados bits de controle, os
quais são compostos pelo registrador CCPR1L mais os bits 5 e 4 do registrador CCP1CON;quais são compostos pelo registrador CCPR1L mais os bits 5 e 4 do registrador CCP1CON;
O registrador CCPR1L contém 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 são aqui representados por <Q1:Q0>, para
completar os 10 bits necessários para que seja feita a comparação com os bits de controle.
58. 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 não podem ser
escritos pelo usuário.
59. Período do Ciclo Ativo do PWM
É calculado pela seguinte fórmula:
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
60. Outra fórmula para o Período do Ciclo Ativo
PWM duty cycle = (CCPR1L:CCP1CON<5:4>) / (PR2 + 1) x 4
Para ver uma demonstração desta fórmula, ver o Livro:
Microcontroladores PIC – uma abordagem prática e objetiva , Autor: Wagner
Zanco, editora Érica – 1 edição, 2005, páginas 241 e 242.
61. Cálculo do Número de Passos de Controle
O controle do PWM é feito a partir da divisão do período 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 : número de passos em que será dividido o sinal PWM
PR2: valor que o usuário colocou via software no registrador PR2PR2: valor que o usuário 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 nível 0 após
o inicio do ciclo ativo.
Obs: Se escrevermos o valor PR2 = 255 (0xFF) não será possível obter um ciclo ativo de 100%, porque Np =
1024. Para obtermos um ciclo de 100% seria necessário escrever o valor 1024 nos bits de controle, mas
isso não é possivel, pois só temos 10 bits de controle, então o maior valor possivel de ser escrito é 1023.
62. Cálculo do tempo correspondente a cada Passo
Dividindo o período do sinal (Tpwm) pelo número de passos temos o tempo
(Tp) correspondente a cada passo:
Tp= Tpwm / Np
Exercício:
Considere um sinal PWM de frequencia 15625Hz e o valor de PR2=63.
Calcule o tempo correspondente a cada passo. ( Resp: Tp= 250 ns )Calcule o tempo correspondente a cada passo. ( Resp: Tp= 250 ns )
O tempo correspondente a cada passo é também chamado RESOLUÇÃO
TEMPORAL DO PWM, e nos informa qual é a variação mínima do ciclo
ativo.
63. Cálculo 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 quaisexclusivamente dos bits de controle CCPR1L : CCP1CON<5:4>, nos quais
cada unidade equivale a 1x Tp
64. RESUMO
Para ativar o modo PWM, aconselha-se seguir os seguintes passos:
1- Configurar o período 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 saída, 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
65. Afinal, para que serve o registrador CCPR1H ?
O CCPR1H é apenas um buffer e não pode ser escrito pelo usuário.
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 usuário, mas o valor do ciclo ativo não será
atualizado em CCPR1H até o momento em que PR2 e TMR2 se igualam
(isto é, após um período completo). O registrador CCPR1H e mais um
latch interno de 2 bits são usados como buffer para o ciclo ativo PWM.latch interno de 2 bits são 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, então 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 ?”
66. Máxima Resolução (em bits) do PWM
Obs: Se o valor do ciclo ativo do PWM é mais longo do que
o período do PWM, o pino CCP1 não será zerado.
67. Explicação para a Fórmula do slide anterior
Na arquitetura dos PICs, a resolução (no tempo) do PWM é de 1 ciclo de máquina.
A resolução máxima em bits (base 2) será do número de ciclos de máquina
que cabem no período escolhido para o PWM.
Vamos a um exemplo:
a) Para um PIC rodando com cristal de 20MHz, o ciclo de máquina será :
(1/20.000000) * 4 = 0,2us;
Se escolhermos uma frequência de 20kHz para o PWM, o período deste PWM será
50us; e caberão 50/0,2 = 250 ciclos de máquina.50us; e caberão 50/0,2 = 250 ciclos de máquina.
A resolução do PWM será ; na prática 8 bits
b) Se a frequência do PWM fosse de 50kHz, a resolução seria de log2(100) = 6,64 bit.
Como é o registrador PR2 que controla o período do
PWM, uma mudança de valor de PR2 afeta
diretamente a resolução do PWM.
68. Exercício
Calcule a máxima resolução (em bits) do ciclo
ativo que pode ser obtida usando-se uma
frequência de PWM de 78.125 kHz e oscilador
de clock com cristal de 20 MHz.de clock com cristal de 20 MHz.
Dado: log(2) = 0,3010
(Resp: aprox. 8 bits )
69. Exemplo de Frequências e Resoluções do PWM para oscilador
de clock a 20 MHz
Conclusão:
Pode-se ver claramente que o valor escolhido para o registrador PR2 afeta a resolução
em bits do PWM e consequentemente, o número de passos que podem ser obtidos.
72. 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 ; limpa o PORTA
CLRF PORTB ; limpa o PORTBCLRF PORTB ; limpa o PORTB
CLRF PORTC ; limpa o PORTC
BSF STATUS,RP0 ; muda para bank 1
MOVLW B'11111111'
MOVWF TRISA ; PORTA é entrada
CLRF TRISB ; PORTB é saida
CLRF TRISC
73. 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 é saidabcf 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
74. Exemplo 6: Gerando PWM em Linguagem C
main( ) {
// A saida do módulo 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); // configura o ciclo ativo
delay_ms(5);
}
delay_ms(1000);
}
}
75. Avaliação 2
1) Considere um microcontrolador PIC16F876 com oscilador de clock a cristal de 20 MHz. A frequência
desejada para o PWM é de 78125Hz e o prescaler do TMR2 é de 1:1. Calcular:
a) Qual é o valor que deve ser escrito no registrador PR2 ?
b) Número de passos
c) Tempo correspondente a cada passo
d) Calcule o ciclo ativo para CCPR1L:CCP1CON<5:4> = 180
e) Nível DC do sinal PWM para uma alimentação de 5 volts no PIC
f) Diagrama de tempo do sinal PWM
2) Escreva um programa para PIC16F876 com cristal de 4MHz que:2) Escreva um programa para PIC16F876 com cristal de 4MHz que:
a) Leia a tensão obtida a partir de um potenciômetro de 10K ligado ao pino AN0 (use o conversor A/D)
fazendo uma leitura a cada 50 ms (use interrupção 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 potenciômetro. A resolução 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.