sexta-feira, 2 de setembro de 2016

Explicação e exemplo Conversor A/D


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);
    }
}



  



Um comentário:

  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