Prévia do material em texto
CCE1070 – MICROCONTROLADORES
Aula 12
MICROCONTROLADORES
AULA 12
Apresentação da Disciplina
Professor: Marcus Pantoja da Silva
E-mail: marcus.pantoja@estacio.br
MICROCONTROLADORES
AULA 12
Configurando Conversor A/D PIC18F4520
MICROCONTROLADORES
AULA 12
Configurando Conversor A/D PIC18F4520
O PIC18F4520 possui um módulo conversor A/D com 13 entradas analógicas que podem ser chaveada para ter acesso, uma de cada vez, ao conversor.
O conversor do PIC18F4520 possui resolução de 10 bits.
Três registradores de controle são utilizados para configurar o conversor A/D
ADCON0
ADCON1
ADCON2
MICROCONTROLADORES
AULA 12
ADCON0
O registrador ADCON0 controla a operação do módulo conversor A/D. Possui 8 bits
Bits 7 – 6: não implementados. Lidos como ‘0’
MICROCONTROLADORES
AULA 12
ADCON0
Bit 5-2 CHS3:CHS0: bit de seleção de canal analógico
MICROCONTROLADORES
AULA 12
ADCON0
Bit 1: GO/DONE: inicia a conversão A/D
1 = conversão A/D em progresso
0 = apagado automaticamente pelo hardware quando a conversão terminar.
Bit 0: ADON: liga/desliga o conversor A/D
1 = conversor A/D está em operação
0 = conversor A/D desligado.=
MICROCONTROLADORES
AULA 12
ADCON1
O registrador ADCON1 configura as funções dos pinos de entrada do conversor
Bits 7 – 6: não implementados. Lidos como ‘0’
MICROCONTROLADORES
AULA 12
8
ADCON1
Bit 5: VCFG1 bit de seleção da tensão de referência (VREF - ):
1 = VREF – (AN2)
0 = VREF - (VSS)
Bit 4: VCFG0 bit de seleção da tensão de referência (VREF +):
1 = VREF + (AN3)
0 = VREF - (VDD)
MICROCONTROLADORES
AULA 12
ADCON1
Bit 3-0 PCFG3:PCFG0: configura os pinos do conversor A/D
MICROCONTROLADORES
AULA 12
ADCON2
O registrador ADCON2 configura a origem do clock, a aquisição programada e a justificação.
Bits 7: ADFM: bit de seleção do resultado da conversão:
0 – ajustado à direita
1 – ajustado à esquerda
MICROCONTROLADORES
AULA 12
11
ADCON2
Bit 6: não implementado
Bits 5 - 3: ACQT2:ACQT0: bit de seleção do tempo de aquisição:
Obs: TAD é o tempo de conversão por bit (Consultar datasheet)
MICROCONTROLADORES
AULA 12
12
ADCON2
Bits 2 - 0 ADSC2:ADSC0: bits de seleção do clock do conversor A/D:
MICROCONTROLADORES
AULA 12
13
Obter o resultado de um conversão
Para iniciar um conversão, é necessário setar o bit GO/DONE (ADCON0<2>).
Quando a conversão termina esse bit é apagado automaticamente pelo hardware.
O conversor A/D do PIC18F4520 possui resolução de 10 bits. O resultado da conversão estará disponível em dois registradores de 8 bits cada, dando um total de 16 bits.
A sobra dos bits nos registradores permite deslocar o resultado para esquerda ou para direita.
Os registradores são: ADRESH e ADRESL
MICROCONTROLADORES
AULA 12
14
Obter o resultado de um conversão
MICROCONTROLADORES
AULA 12
15
Utilizando o conversor A/D para ler a temperatura de um sensor
Para demonstrar o funcionamento de um conversor A/D vamos desenvolver um projeto que utilize um conversor A/D para ler a temperatura de um sensor.
Para tal iremos utilizar a placa McLAB2 que possui alguns componentes interessantes.
A placa possui um sensor de temperatura ligado ao pino RA0 conforme manual da mesma (manual pode ser baixado em: www.mosaico.com.br/Midias/Documentacao/Manual%20McLab2.pdf)
MICROCONTROLADORES
AULA 12
16
Utilizando o conversor A/D para ler a temperatura de um sensor
Além disso iremos mostrar o valor do conversor A/D no display LCD da mesma placa. Para tanto vamos utilizar uma biblioteca desenvolvida para esta placa. Essa biblioteca está disponível no sia com o nome de lcd2. Salve-a em seu computador como lcd.h.
MICROCONTROLADORES
AULA 12
17
Utilizando o conversor A/D para ler a temperatura de um sensor
Inicialmente precisamos configurar os pino RA0 do PORTA como um pino de entrada de dados haja vista que ele será responsável por ler o sinal fornecido pelo sensor de temperatura (0 – 5 V).
Vamos precisar configurar também, mas como saída de dados os pinos dos PORTD e PORT E, pois ambos são utilizados pelo display LCD.
MICROCONTROLADORES
AULA 12
18
Utilizando o conversor A/D para ler a temperatura de um sensor
Conexão dos pinos do DISPLAY LCD
PINO LCD
1 TERRA
2 VCC
3 RESISTOR
4 RE0
5 TERRA
6 RE1
7 RE2
8 RD1
9 RD2
10 RD3
11 RD4
12 RD5
13 RD6
14 RD7
15 VCC
16 TERRA
MICROCONTROLADORES
AULA 12
19
Utilizando o conversor A/D para ler a temperatura de um sensor
Agora devemos configurar os registradores ADCON0, ADCON1 e ADCON2
ADCON0 = 0b00000001;
Bits 5 – 2 :0000 – Utiliza o pino RA0 (AN0) como leitura para A/D
Bit 0: ADON: liga/desliga o conversor A/D – setado como 1
MICROCONTROLADORES
AULA 12
20
Utilizando o conversor A/D para ler a temperatura de um sensor
ADCON1 = 0b00001110;
Bit 5: VCFG1 bit de seleção da tensão de referência (VREF - ):
0 = VREF - (VSS)
Bit 4: VCFG0 bit de seleção da tensão de referência (VREF +):
0 = VREF - (VDD)
Bit 3-0 PCFG3:PCFG0: configura os pinos do conversor A/D
1110 – Apenas o pino AN0 como entrada analógica.
MICROCONTROLADORES
AULA 12
21
Utilizando o conversor A/D para ler a temperatura de um sensor
ADCON2 = 0b10101001;
Bits 7: ADFM: bit de seleção do resultado da conversão:
1 – ajustado à esquerda
Bit 6: não implementado
Bits 5 - 3: ACQT2:ACQT0: bit de seleção do tempo de aquisição: 12TAD
Bits 2 - 0 ADSC2:ADSC0: bits de seleção do clock do conversor A/D
001 – Fosc/8
MICROCONTROLADORES
AULA 12
22
Programa para ler temperatura do conversor A/D
// PIC18F4520 Configuration Bit Settings
// 'C' source line config statements
// CONFIG1H
#pragma config OSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
#pragma config IESO = OFF // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)
// CONFIG2L
#pragma config PWRT = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = OFF // Brown-out Reset Enable bits (Brown-out Reset disabled in hardware and software)
#pragma config BORV = 3 // Brown Out Reset Voltage bits (Minimum setting)
// CONFIG2H
#pragma config WDT = OFF // Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit))
#pragma config WDTPS = 32768 // Watchdog Timer Postscale Select bits (1:32768)
// CONFIG3H
#pragma config CCP2MX = PORTC // CCP2 MUX bit (CCP2 input/output is multiplexed with RC1)
#pragma config PBADEN = ON // PORTB A/D Enable bit (PORTB<4:0> pins are configured as analog input channels on Reset)
#pragma config LPT1OSC = OFF // Low-Power Timer1 Oscillator Enable bit (Timer1 configured for higher power operation)
#pragma config MCLRE = ON // MCLR Pin Enable bit (MCLR pin enabled; RE3 input pin disabled)
// CONFIG4L
#pragma config STVREN = ON // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
#pragma config LVP = ON // Single-Supply ICSP Enable bit (Single-Supply ICSP enabled)
#pragma config XINST = OFF // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))
// CONFIG5L
#pragma config CP0 = OFF // Code Protection bit (Block 0 (000800-001FFFh) not code-protected)
#pragma config CP1 = OFF // Code Protection bit (Block 1 (002000-003FFFh) not code-protected)
#pragma config CP2 = OFF // Code Protection bit (Block 2 (004000-005FFFh) not code-protected)
#pragma config CP3 = OFF // Code Protection bit (Block 3 (006000-007FFFh) not code-protected)
// CONFIG5H#pragma config CPB = OFF // Boot Block Code Protection bit (Boot block (000000-0007FFh) not code-protected)
#pragma config CPD = OFF // Data EEPROM Code Protection bit (Data EEPROM not code-protected)
// CONFIG6L
#pragma config WRT0 = OFF // Write Protection bit (Block 0 (000800-001FFFh) not write-protected)
#pragma config WRT1 = OFF // Write Protection bit (Block 1 (002000-003FFFh) not write-protected)
#pragma config WRT2 = OFF // Write Protection bit (Block 2 (004000-005FFFh) not write-protected)
#pragma config WRT3 = OFF // Write Protection bit (Block 3 (006000-007FFFh) not write-protected)
// CONFIG6H
#pragma config WRTC = OFF // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) not write-protected)
#pragma config WRTB = OFF // Boot Block Write Protection bit (Boot block (000000-0007FFh) not write-protected)
#pragma config WRTD = OFF // Data EEPROM Write Protection bit (Data EEPROM not write-protected)
// CONFIG7L
#pragma config EBTR0 = OFF // Table Read Protection bit (Block 0 (000800-001FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR1 = OFF // Table Read Protection bit (Block 1 (002000-003FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR2 = OFF // Table Read Protection bit (Block 2 (004000-005FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR3 = OFF // Table Read Protection bit (Block 3 (006000-007FFFh) not protected from table reads executed in other blocks)
#pragma config EBTRB = OFF // Boot Block Table Read Protection bit (Boot block (000000-0007FFh) not protected from table reads executed in other blocks)
#include <xc.h>
#include <stdlib.h>
// biblioteca para display lcd
#include "C:\Users\marcu\Desktop\lcd.h"
#define _XTAL_FREQ 4000000
unsigned int LerADC(void) {
unsigned int temp;
ADCON0bits.GO = 1; // Inicia aquisição
while (ADCON0bits.DONE); // Aguarda o fim da aquisição (quando bit DONE = 0)
temp = ADRESH; // Parte alta do valor lido
temp = ((temp << 8) | ADRESL); // Junta parte alta com parte baixa em um valor de 16 bits
return temp;
}
void main() {
// configura portas
TRISA = 0b00000001;
TRISD = 0x00;
TRISE = 0x00;
//configura conversor A/D
ADCON0 = 0b00000001;
ADCON1 = 0b00001110;
ADCON2 = 0b10101001;
// inicializa o display LCD
Lcd_Init();
while (1) {
char s[20];
Lcd_Set_Cursor(1, 1);
Lcd_Write_String(itoa(s, LerADC(), 10));
}
}
MICROCONTROLADORES
AULA 12
23
Biblioteca lcd.h
//Desenvolvido por Marcus Pantoja da Silva com bas em
// https://electrosome.com/lcd-pic-mplab-xc8/
/** LCD PIC EXEMPLO FUNCAO
1 TERRA TERRA
2 VCC VCC
3 RESISTOR RESISTOR
4 RE0 RD2 SELECAO DE COMANDOS
5 TERRA TERRA
6 RE1 RD3 ENABLE
7 RE2 TERRA
8 RD1 TERRA
9 RD2 TERRA
10 RD3 TERRA
11 RD4 RD4
12 RD5 RD5
13 RD6 RD6
14 RD7 RD7
15 VCC VCC
16 TERRA TERRA*/
#define _XTAL_FREQ 4000000
#define RS RE0
#define EN RE1
#define D4 RD4
#define D5 RD5
#define D6 RD6
#define D7 RD7
void Lcd_Port(char a)
{
if(a & 1)
D4 = 1;
else
D4 = 0;
if(a & 2)
D5 = 1;
else
D5 = 0;
if(a & 4)
D6 = 1;
else
D6 = 0;
if(a & 8)
D7 = 1;
else
D7 = 0;
}
void Lcd_Cmd(char a)
{
RS = 0; // => RS = 0
Lcd_Port(a);
EN = 1; // => E = 1
__delay_ms(4);
EN = 0; // => E = 0
}
Lcd_Clear()
{
Lcd_Cmd(0);
Lcd_Cmd(1);
}
void Lcd_Set_Cursor(char a, char b)
{
char temp,z,y;
if(a == 1)
{
temp = 0x80 + b - 1;
z = temp>>4;
y = temp & 0x0F;
Lcd_Cmd(z);
Lcd_Cmd(y);
}
else if(a == 2)
{
temp = 0xC0 + b - 1;
z = temp>>4;
y = temp & 0x0F;
Lcd_Cmd(z);
Lcd_Cmd(y);
}
}
void Lcd_Init()
{
Lcd_Port(0x00);
__delay_ms(20);
Lcd_Cmd(0x03);
__delay_ms(5);
Lcd_Cmd(0x03);
__delay_ms(11);
Lcd_Cmd(0x03);
/////////////////////////////////////////////////////
Lcd_Cmd(0x02);
Lcd_Cmd(0x02);
Lcd_Cmd(0x08);
Lcd_Cmd(0x00);
Lcd_Cmd(0x0C);
Lcd_Cmd(0x00);
Lcd_Cmd(0x06);
}
void Lcd_Write_Char(char a)
{
char temp,y;
temp = a&0x0F;
y = a&0xF0;
RS = 1; // => RS = 1
Lcd_Port(y>>4); //Data transfer
EN = 1;
__delay_us(40);
EN = 0;
Lcd_Port(temp);
EN = 1;
__delay_us(40);
EN = 0;
}
void Lcd_Write_String(char *a)
{
int i;
for(i=0;a[i]!='\0';i++)
Lcd_Write_Char(a[i]);
}
void Lcd_Shift_Right()
{
Lcd_Cmd(0x01);
Lcd_Cmd(0x0C);
}
void Lcd_Shift_Left()
{
Lcd_Cmd(0x01);
Lcd_Cmd(0x08);
}
MICROCONTROLADORES
AULA 12
24
Resultado
Lcd_Cmd(0x01);
Lcd_Cmd(0x08);
}
MICROCONTROLADORES
AULA 12
25
Exercício 1
Faça com que ao invés do nível do conversor A/D, o display lcd mostre o valor da temperatura
MICROCONTROLADORES
AULA 12
26
Trabalho AV2 – 2,0 pontos
O Placa McLAB 2 possui um potenciômetro P2 ligado no pino AN1 do microcontrolador.
Na segunda entrada analógica do PIC (RA1/AN1) temos conectado um potenciômetro capaz de variar a tensão de entrada analógica entre 0 e +5V.
Desenvolva um programa para o PIC18F4520 para essa placa que mostra o valor da tensão a partir da variação do potenciômetro P2.
MICROCONTROLADORES
AULA 12
27
Trabalho AV2 – 2,0 pontos
Dica 1: Utilize a função sprintf para converter o valor da saída do conversor A/D para o tipo String, para isso você deve incluir a biblioteca #include<stdio.h>.
Dica 2: Utilize a função Lcd_Clear() para limpar o display LCD após cada atualização do valor a ser exibido
MICROCONTROLADORES
AULA 12
28
Trabalho AV2 – 4,0 pontos
A placa McLAB2 possui, próximo ao sensor de temperatura (ligado ao pino AN0), um aquecedor consiste numa resistência de 68Ω com 5W de dissipação. Pode ser acionada através do pino RC2 do microcontrolador. Veja que este pino pode ser configurado como PWM e, portanto a potência de aquecimento pode ser regulada através deste recurso. O jumper JP1 deve ser colocado entre os pinos 2 e 3 para ativar o sistema de aquecimento. Gere um sinal PWM para este pino em torno de 50% de ciclo de trabalho de forma que a temperatura varie e mostre o valor da temperatura no display LCD.
MICROCONTROLADORES
AULA 12
29
AVANCE PARA FINALIZAR A APRESENTAÇÃO.
MICROCONTROLADORES
AULA 12