Identificando valores de conversão para cada tecla (divisor de tensão)
Utilizando o programa “Tec_atv01.c” (listado no fim deste post) monte compile um projeto no MPLAB X IDE.
1. Elabore o hardware no simulador.
2. Preencha a tabela abaixo baseado nos dados obtidos do simulador.
3. Elabore o hardware físico.
4. Preencha a tabela abaixo baseado nos dados do obtidos no hardware físico.
5. Compare os valores obtidos no simulador e no hardware físico e explique por que as diferenças.
6. Explique o que deveria ser feito no programa para:
- Baixar o menor valor
- Elevar o maior valor
7. Se fossem executadas as mudanças do item 6, o que aconteceria com a faixa entre os valores? Por que?
Entregue (mostre) escrita as questões 2, 4, 5, 6 e 7.
/*
* File: Tec_atv01.c
* Author: Pilger
*
* Created on 16 de Setembro de 2017, 09:26
* Teclado - Atividade 01
* Entendimento inicial do circuito divisor de tensão no conversor A/D
*
* Utiliza a entrada AN0 como sinal de entrada e converte um sinal entre 0 e 5V
* Apresenta o resultdo convertido (0 a 1023) na linha 1 do LCD
*
*/
#define _XTAL_FREQ 48000000
#include <stdio.h>
#include <xc.h>
#include "C:\h\Config_PIC18F4550.h"
#include "c:\h\biblioteca_lcd_2x162_48M_XC.h"
// protótipos de funções
void config_AD(void);
int conv_AD(void);
void delay_ms(int i);
void main(void) {
// variáveis locais
int valor_convertido;
unsigned char buffer[16];
float tensao;
// define os pinos de IO
TRISA = 0b00000001;
TRISB = 0x00;
TRISC = 0x00;
TRISD = 0x00;
TRISE = 0x00;
config_AD(); // configura e inicializa o conversor AD
lcd_inicia(0x28, 0x0f, 0x06); // incializa o LCD com 4 linhas
lcd_LD_cursor(0); // Desliga o cursor
lcd_posicao(1, 1);
imprime_string_lcd("Teclado A/D");
while (1) {
valor_convertido = conv_AD();
// mostra no lcd o valor convertido (0-1023)
lcd_posicao(2, 1);
sprintf(buffer, "Conversao= %04d ", valor_convertido);
imprime_buffer_lcd(buffer, 16);
delay_ms(1000); // atraso de 1s
}
}
// função de configuração do conversor A/D
void config_AD (void) {
ADCON0 = 0b00000001; /* canal AN0 selecionado <5:2> 0000
* Flag GO - /DONE desligado <1> 0
* Módulo conversor ligado <0> 1 */
ADCON1 = 0b00001110; /* Vref- = VSS <5> 0
* Vref+ = VDD <4> 0
* pino RA0/AN0 analógico e demais digitais <3:0> 1110 */
ADCON2 = 0b10110110; /* Resultado justificado a direita <7> 1
* Tempo de Aquisição de 16 TDA <5:3> 110
* mínimo recomendado p/ automático = 4TDA
* TDA = 1,33us <2:0> 110
* 48MHz/64 = 750kHz = 1,33us */
}
// função que efetua uma conversão A/D e retorna um inteiro com o valor convertido
int conv_AD (void) {
int result_AD; // Variável local para armazenar o resultado da conv
ADCON0bits.GO=1; // inicia a conversão
while (ADCON0bits.GO); // Aguarda a o fim da conversão
result_AD = (((int)ADRESH)<<8)|(ADRESL);
return result_AD;
}
// função que gera atraso em mlisegundos
void delay_ms(int i){
for ( int x = 0; x < i; x++ ) {
__delay_ms(1);
}
}
* File: Tec_atv01.c
* Author: Pilger
*
* Created on 16 de Setembro de 2017, 09:26
* Teclado - Atividade 01
* Entendimento inicial do circuito divisor de tensão no conversor A/D
*
* Utiliza a entrada AN0 como sinal de entrada e converte um sinal entre 0 e 5V
* Apresenta o resultdo convertido (0 a 1023) na linha 1 do LCD
*
*/
#define _XTAL_FREQ 48000000
#include <stdio.h>
#include <xc.h>
#include "C:\h\Config_PIC18F4550.h"
#include "c:\h\biblioteca_lcd_2x162_48M_XC.h"
// protótipos de funções
void config_AD(void);
int conv_AD(void);
void delay_ms(int i);
void main(void) {
// variáveis locais
int valor_convertido;
unsigned char buffer[16];
float tensao;
// define os pinos de IO
TRISA = 0b00000001;
TRISB = 0x00;
TRISC = 0x00;
TRISD = 0x00;
TRISE = 0x00;
config_AD(); // configura e inicializa o conversor AD
lcd_inicia(0x28, 0x0f, 0x06); // incializa o LCD com 4 linhas
lcd_LD_cursor(0); // Desliga o cursor
lcd_posicao(1, 1);
imprime_string_lcd("Teclado A/D");
while (1) {
valor_convertido = conv_AD();
// mostra no lcd o valor convertido (0-1023)
lcd_posicao(2, 1);
sprintf(buffer, "Conversao= %04d ", valor_convertido);
imprime_buffer_lcd(buffer, 16);
delay_ms(1000); // atraso de 1s
}
}
// função de configuração do conversor A/D
void config_AD (void) {
ADCON0 = 0b00000001; /* canal AN0 selecionado <5:2> 0000
* Flag GO - /DONE desligado <1> 0
* Módulo conversor ligado <0> 1 */
ADCON1 = 0b00001110; /* Vref- = VSS <5> 0
* Vref+ = VDD <4> 0
* pino RA0/AN0 analógico e demais digitais <3:0> 1110 */
ADCON2 = 0b10110110; /* Resultado justificado a direita <7> 1
* Tempo de Aquisição de 16 TDA <5:3> 110
* mínimo recomendado p/ automático = 4TDA
* TDA = 1,33us <2:0> 110
* 48MHz/64 = 750kHz = 1,33us */
}
// função que efetua uma conversão A/D e retorna um inteiro com o valor convertido
int conv_AD (void) {
int result_AD; // Variável local para armazenar o resultado da conv
ADCON0bits.GO=1; // inicia a conversão
while (ADCON0bits.GO); // Aguarda a o fim da conversão
result_AD = (((int)ADRESH)<<8)|(ADRESL);
return result_AD;
}
// função que gera atraso em mlisegundos
void delay_ms(int i){
for ( int x = 0; x < i; x++ ) {
__delay_ms(1);
}
}
Nenhum comentário:
Postar um comentário