Você está na página 1de 37

Conversor AD e Saı́das PWM

Rodrigo Almeida

Universidade Federal de Itajubá

rodrigomax@unifei.edu.br

ECOP04 Conversor AD e Saı́das PWM rodrigomax@unifei.edu.br 1 / 37


Revisão

Revisão

ECOP04 Conversor AD e Saı́das PWM rodrigomax@unifei.edu.br 2 / 37


Revisão

Display de LCD

Rotina para envio de dados/comando para o LCD


Para comando RS = 0; Para dados RS = 1;
Habilitar a escrita (RW=1) ou leitura (RW=0)
Acionar terminal EN (enable)
Delay para o LCD entender o comando
Desabilita o terminal EN
Retorna os terminais para nı́vel baixo 1

1
Para melhor uso é interessante retornar os terminais para o valor que tinham antes
de chamar a rotina, já que eles estão multiplexados com outros dispositivos
ECOP04 Conversor AD e Saı́das PWM rodrigomax@unifei.edu.br 3 / 37
Revisão

Display de LCD

Dados (bit) Tempo


Instrução RS RW
7 6 5 4 3 2 1 0 (máx.)
Limpa 0 0 0 0 0 0 0 0 0 1 37 us
Reset 0 0 0 0 0 0 0 0 1 - 1.5ms
Config. 0 0 0 0 0 0 0 1 ID S 37 us
Config. 0 0 0 0 0 0 1 D C B 37 us
Movim. 0 0 0 0 0 1 SC RL - - 37 us
Config. 0 0 0 0 1 DL N F - - 37 us
Move(l,c) 0 0 1 X 0 0 Coluna 37 us
Ocup. 0 1 BF - - - - - - - 10 us
http://www.sparkfun.com/datasheets/LCD/HD44780.pdf - Datasheet Hitachi

ECOP04 Conversor AD e Saı́das PWM rodrigomax@unifei.edu.br 4 / 37


Revisão

Display de LCD

Definições
ID: 1 – Incrementa, 0 – Decrementa
S: 1 – O display acompanha o deslocamento
SC: 1 – Desloca o display, 0 – Desloca o cursor
RL: 1 – Move para direita, 0 – Move para esquerda
DL: 1 – 8 bits, 0 – 4 bits
N: 1 – 2 linhas, 0 – 1 linha
F: 1 – 5x10 pontos, 0 – 5x8 pontos
BF: 1 – Ocupado, 0 – Disponı́vel
X: 1 – 2a linha, 0 – 1a linha
Coluna: nible que indica a coluna

ECOP04 Conversor AD e Saı́das PWM rodrigomax@unifei.edu.br 5 / 37


Revisão

Display de LCD

Desenvolvimento da biblioteca
Criação de rotinas de delay (2ms e 40us)
Função para enviar comandos
Função para enviar dados
Função de inicialização

ECOP04 Conversor AD e Saı́das PWM rodrigomax@unifei.edu.br 6 / 37


Revisão

Display de LCD

1 # include " basico . h "


2 # include " config . h "
3 # include " lcd . h "
4
5 // inı́cio do p r o g r a m a
6 void main ( void ) {
7 unsigned int i , j ;
8 char msg [] = " Hello World ! " ;
9 lcdInit () ;
10 for ( i = 0 ; i < 11 ; i ++) {
11 lcdData ( msg [ i ]) ;
12 for ( j = 0 ; j < 65000 ; j ++) ;
13 }
14 for (;;) ;
15 }

ECOP04 Conversor AD e Saı́das PWM rodrigomax@unifei.edu.br 7 / 37


Conversor AD

Conversor AD

ECOP04 Conversor AD e Saı́das PWM rodrigomax@unifei.edu.br 8 / 37


Conversor AD

Conversor AD

Transdutores
Processo de conversão analógico digital
Utilização de comparadores de tensão
Discretização do sinal

ECOP04 Conversor AD e Saı́das PWM rodrigomax@unifei.edu.br 9 / 37


Conversor AD

Conversor AD
Sensor de ângulo (passivo)

Potenciômetro como divisor de tensão

VS ∗ R2 R2
VRL = = VS ∗ ( )
R1 + R2 RPot
ECOP04 Conversor AD e Saı́das PWM rodrigomax@unifei.edu.br 10 / 37
Conversor AD

Conversor AD

Conversor analógico digital de 2 bits


http://en.wikipedia.org/wiki/File:Flash ADC.png - Jon Guerber

ECOP04 Conversor AD e Saı́das PWM rodrigomax@unifei.edu.br 11 / 37


Conversor AD

Conversor AD

5 5,00

Limites da comparação
11
4

Valor original, em Volts


3,75

3 10
2,50
2 01
1,25
1
00

Valor convertido
para binário

Faixa de valores na conversão de AD com 2 bits

ECOP04 Conversor AD e Saı́das PWM rodrigomax@unifei.edu.br 12 / 37


Conversor AD

Conversor AD

LM35
Sensor ativo de temperatura
Entrega um sinal proporcional à temperatura
Possui diversos circuitos internos de estabilização e correção
Mais simples e mais caro
Evita uso de CPU’s mais caras ou circuitos de interface (NTC/PTC)

mV
VS = T ∗ 0.5( oC
)

ECOP04 Conversor AD e Saı́das PWM rodrigomax@unifei.edu.br 13 / 37


Conversor AD

Conversor AD

Circuito integrado LM35

ECOP04 Conversor AD e Saı́das PWM rodrigomax@unifei.edu.br 14 / 37


Conversor AD

Conversor AD

Lendo o sensor com um AD de 10 bits:


Faixa de temperatura = -40 à 150 graus
Faixa de tensão do sensor = -400 à 1500 milivolts
Faixa de conversão = 0 à 1023
Faixa de tensão do AD = 0 à 5 volts
Calcular fator de conversão.

ECOP04 Conversor AD e Saı́das PWM rodrigomax@unifei.edu.br 15 / 37


Conversor AD

Conversor AD

comparador memória

> término da conversão

controle

início
entradas
analógicas
incremento do valor

valor
conversor tensão
canal

ECOP04 Conversor AD e Saı́das PWM rodrigomax@unifei.edu.br 16 / 37


Criação da biblioteca para o conversor AD

Criação da biblioteca para o conversor AD

ECOP04 Conversor AD e Saı́das PWM rodrigomax@unifei.edu.br 17 / 37


Criação da biblioteca para o conversor AD

Conversor AD

Toda conversão AD exige um determinado tempo. Para que o


microcontrolador realize corretamente a conversão é necessário seguir os
seguintes passos:
1 Configurar o conversor
2 Iniciar a conversão
3 Aguardar o final da conversão
4 Ler o valor

ECOP04 Conversor AD e Saı́das PWM rodrigomax@unifei.edu.br 18 / 37


Criação da biblioteca para o conversor AD

Conversor AD

1 # include " adc . h "


2 # include " pic18f45220 . h "
3 void adcInit ( void ) {
4 BitSet ( TRISA , 0 ) ; // seta o bit 0 como entrada
5 ADCON0 = 0b00000001 ; // s e l e c i o n a o canal 0 e liga o AD
6 ADCON1 = 0b00001110 ; // só AN0 é analógico , r e f e r ^ e n c i a na ←-
fonte
7 ADCON2 = 0b10101010 ; // FOSC / 32 , A l i n h a d o à direita , t c = 12 ←-
TAD
8 }
9
10 int adcRead ( void ) {
11 unsigned int ADvalor ;
12 BitSet ( ADCON0 , 1 ) ; // inicia c o n v e r s ~
ao
13 while ( BitTst ( ADCON0 , 1 ) ) ; // espera t e r m i n a r a c o n v e r s ~
ao ;
14 ADvalor = ADRESH ; // l^e o resultado
15 ADvalor < <= 8 ;
16 ADvalor += ADRESL ;
17 return ADvalor ;
18 }

ECOP04 Conversor AD e Saı́das PWM rodrigomax@unifei.edu.br 19 / 37


Criação da biblioteca para o conversor AD

Conversor AD

1 # ifndef ADC_H
2 # define ADC_H
3 void adcInit ( void ) ;
4 int adcRead ( void ) ;
5 # endif // A D C H

ECOP04 Conversor AD e Saı́das PWM rodrigomax@unifei.edu.br 20 / 37


Criação da biblioteca para o conversor AD

Conversor AD

1 # include " pic18f4520 . h "


2 # include " config . h "
3 # include " ssd . h "
4 # include " adc . h "
5 void main ( void ) {
6 unsigned int i ;
7 int temp = 0 ;
8 ssdInit () ;
9 adcInit () ;
10 for (;;) {
11 temp = adcRead () ;
12 ssdDigit (( temp / 1000 ) % 10 , 3);
13 ssdDigit (( temp / 100 ) % 10 , 2);
14 ssdDigit (( temp / 10 ) % 10 , 1);
15 ssdDigit (( temp / 1 ) % 10 , 0);
16 ssdUpdate () ;
17 for ( i = 0 ; i < 1000 ; i ++) ;
18 }
19 }

ECOP04 Conversor AD e Saı́das PWM rodrigomax@unifei.edu.br 21 / 37


Saı́das PWM

Saı́das PWM

ECOP04 Conversor AD e Saı́das PWM rodrigomax@unifei.edu.br 22 / 37


Saı́das PWM

Saı́das PWM
Início do
Baixo: Saída desligada
ciclo
Alto: Saída ligada

10%

50%

90%

Sinais PWM com variação do duty cycle


ECOP04 Conversor AD e Saı́das PWM rodrigomax@unifei.edu.br 23 / 37
Saı́das PWM

Saı́das PWM

Vantagens
Mais barato que uma saı́da analógica
Pode ser transformado numa saı́da analógica através de um filtro passa
baixa
Para algumas situações o filtro não é necessário2
Desvantagens
Não é uma saı́da analógica

2
Quando o dispositivo a ser controlado já possui um filtro passa baixa, normalmente
por causa da sua construção fı́sica. Ex: aquecimento por resistências
ECOP04 Conversor AD e Saı́das PWM rodrigomax@unifei.edu.br 24 / 37
Saı́das PWM

Saı́das PWM

Saı́da PWM acionando resistor

ECOP04 Conversor AD e Saı́das PWM rodrigomax@unifei.edu.br 25 / 37


Saı́das PWM

Saı́das PWM

Saı́da PWM acionando resistor

ECOP04 Conversor AD e Saı́das PWM rodrigomax@unifei.edu.br 26 / 37


Saı́das PWM

Saı́das PWM

Frequência do PWM
Depende do circuito que implementa o PWM
Quanto mais alta melhor para simular uma saı́da analógica
Pode ser utilizada para sinalização sonora
Cálculo:

FOSC
FrequenciaPWM =
[(PR2 ) + 1] ∗ 4 ∗ (TMR2 Prescaler )

Para um cristal de 8 MHz podemos atingir frequências de 488Hz até


2MHz

ECOP04 Conversor AD e Saı́das PWM rodrigomax@unifei.edu.br 27 / 37


Saı́das PWM

Saı́das PWM

Problemas com frequências muito altas: Perda de resolução

log( FFPWM
OSC
)
Resolucao PWM (max) = bits
log(2)

Para frequência de 2MHz 3 a resolução é de 2 bits, ou seja, podemos


configurar o duty cycle apenas para 12.5%, 37.5%, 62.5% ou 87.5%
do valor.

3
Frequência máxima com um clock de 8MHz
ECOP04 Conversor AD e Saı́das PWM rodrigomax@unifei.edu.br 28 / 37
Saı́das PWM

Saı́das PWM

Conhecendo a quantidade de bits de resolução disponı́veis para a


frequência escolhida podemos ajustar o duty-cycle de acordo com a
expressão abaixo:

[CCPRxL : CCPxCON(5 : 4)]


DutyCycle PWM =
(PR2 + 1) ∗ 4

O valor do duty cycle pode ser entendido como uma porcentagem do


tempo, onde 1023 = 100%4

4
Na realidade 1023=99,95%, devido aos efeitos de discretização do circuito digital
ECOP04 Conversor AD e Saı́das PWM rodrigomax@unifei.edu.br 29 / 37
Saı́das PWM

Saı́das PWM

memória

reinicia início

VCC controle

>
reiniciar

>
ligar

GND

ECOP04 Conversor AD e Saı́das PWM rodrigomax@unifei.edu.br 30 / 37


Criação da biblioteca para as saı́das PWM

Criação da biblioteca para as saı́das PWM

ECOP04 Conversor AD e Saı́das PWM rodrigomax@unifei.edu.br 31 / 37


Criação da biblioteca para as saı́das PWM

Saı́das PWM

Para configurar as saı́das PWM devemos especificar:


1 Frequência de trabalho através de PR25 e TCON2
2 Duty cycle em CCPR1L e CCPR2L
3 Configurar como saı́da em TRISC
4 Configurar a saı́da como PWM em CCP1CON e CCP2CON

5
O prescaler foi configurado para 16 bits de modo a obter a maior faixa de frequência
audı́vel.
ECOP04 Conversor AD e Saı́das PWM rodrigomax@unifei.edu.br 32 / 37
Criação da biblioteca para as saı́das PWM

Saı́das PWM
1 # include " pwm . h "
2 # include " pic18f4520 . h "
3
4 void pwmSet1 ( unsigned char porcento ) {
5
6 // formula do duty cycle :
7 // D C p o r c e n t o = V / (( PR2 + 1 ) ∗ 4 ) ;
8 // V = DC / 100 ∗ ( PR2 + 1 ) ∗ 4 ) = DC ∗ ( PR2 + 1 ) / 25
9
10 unsigned int val = (( unsigned int ) porcento ) *( PR2 + 1 ) ;
11 val = val / 25 ;
12
13 // garante que tem apenas 10 bits
14 val &= 0x03ff ;
15
16 // os 8 p r i m e i r o s bits s~
a o c o l o c a d o s no CCPR1L
17 CCPR1L = val >> 2 ;
18
19 // os últimos dois s~
a o c o l o c a d o s na posiç~
a o 5 e 4 do CCP1CON
20 CCP1CON |= ( val & 0x0003 ) << 4 ;
21 }

ECOP04 Conversor AD e Saı́das PWM rodrigomax@unifei.edu.br 33 / 37


Criação da biblioteca para as saı́das PWM

Saı́das PWM
1 void pwmSet2 ( unsigned char porcento ) {
2 unsigned int val = porcento * PR2 ;
3 val /= 25 ;
4 val &= 0x03ff ;
5 CCPR2L = val >> 2 ;
6 CCP2CON |= ( val & 0x0003 ) << 4 ;
7 }
8 void pwmFrequency ( unsigned int freq ) {
9 // PR2 = fosc /( fpwm ∗ 4 ∗ p r e s c a l e r )−1 = ( 8000000 /( freq ∗ 4 ∗ 16 ) ) ←-
− 1
10 PR2 = ( 125000 /( freq ) ) - 1 ;
11 }
12
13 void pwmInit ( void ) {
14 BitClr ( TRISC , 2 ) ; // c o n f i g u r a os pinos como saı́das
15 BitClr ( TRISC , 1 ) ;
16 T2CON |= 0b00000011 ; // c o n f i g u r a o p r e s c a l e para 1 : 16
17 BitSet ( T2CON , 2 ) ; // Liga o timer 2
18 CCP1CON |= 0b00001100 ; // c o n f i g u r a CCP1 como um PWM
19 CCP2CON |= 0b00001100 ; // c o n f i g u r a CCP2 como um PWM
20 }

ECOP04 Conversor AD e Saı́das PWM rodrigomax@unifei.edu.br 34 / 37


Criação da biblioteca para as saı́das PWM

Saı́das PWM

1 # ifndef PWM_H
2 # define PWM_H
3 void pwmSet1 ( unsigned char porcento ) ;
4 void pwmSet2 ( unsigned char porcento ) ;
5 void pwmFrequency ( unsigned int freq ) ;
6 void pwmInit ( void ) ;
7 # endif // P W M H

ECOP04 Conversor AD e Saı́das PWM rodrigomax@unifei.edu.br 35 / 37


Criação da biblioteca para as saı́das PWM

Saı́das PWM

ECOP04 Conversor AD e Saı́das PWM rodrigomax@unifei.edu.br 36 / 37


Criação da biblioteca para as saı́das PWM

Saı́das PWM

1 # include " config . h "


2 # include " pic18f4520 . h "
3 # include " pwm . h "
4 # include " adc . h "
5 // inı́cio do p r o g r a m a
6 void main ( void ) {
7 int value ;
8 pwmInit () ;
9 adcInit () ;
10 for (;;) {
11 value = adcRead () ;
12 // a j u s t a n d o a f r e q u ^
e n c i a de acordo com entrada a n a l ó g i c a
13 pwmFrequency ( value ) ;
14 // a j u s t a n d o o duty−cycle para 50 %
15 pwmSet1 ( 50 ) ;
16 }
17 }

ECOP04 Conversor AD e Saı́das PWM rodrigomax@unifei.edu.br 37 / 37

Você também pode gostar