Sites com explicações sobre conversão A/D
Exemplo de teste do conversor A/D - PIC18F4550
Código em linguagem C para teste do conversor A/D no PIC18F4550
/*
* File: teste_conv_ad.c
* Author: Pilger
*
* Created on 26 de Maio de 2017, 19:16
*
* 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
* Transforma e mostra o valor convertido em tensão (0V a 5V) na linha 2 do LCD
*
*/
#define _XTAL_FREQ 48000000
#include <xc.h>
#include <stdio.h>
#include "c:\h\Config_PIC18F4550.h"
#include "c:\h\biblioteca_lcd_2x162_48M_XC.h"
// 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 segundos
void delay_ms(int i) {
for (int x = 0; x < i; x++) {
__delay_ms(1);
}
}
void delay_s(unsigned char tempo) {
for (int i = 0; i < tempo; i++) { // Gera um delay de múltiplos de 1s
delay_ms(1000); // Gera um delay de 1s
}
}
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,3);
imprime_string_lcd ("Teste do AD");
delay_s (2);
while (1){
valor_convertido = conv_AD();
// mostra no lcd o valor convertido (0-1023)
lcd_posicao (1,1);
sprintf (buffer,"Conversao= %04d ", valor_convertido);
imprime_buffer_lcd (buffer,16);
// calcula o valor em tensão e mostra no lcd
tensao = (float)valor_convertido * 5 /1023;
lcd_posicao (2,1);
sprintf (buffer,"Tensao= %f ", tensao);
imprime_buffer_lcd (buffer,16);
delay_s (1);
}
}
Parabéns Pilger, em tempos de individualidade total é raro contarmos com conteúdo livre de qualidade, parabéns pelo seu ótimo trabalho e continue sempre assim.
ResponderExcluir