Autor Tema: Convertidor AD Sigma-Delta con PIC16F628  (Leído 4018 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Tec_Claudio_Perez

  • PIC12
  • **
  • Mensajes: 62
Convertidor AD Sigma-Delta con PIC16F628
« en: 25 de Junio de 2004, 09:53:00 »
Hola a todos,

Quisiera hacer un conversor AD Sigma Delta con el PIC16F628, utilizando los comparadores analogicos.

Página en Alemán:
http://www.sprut.de/electronic/pic/programm/compadc/compadc.html

Traduccion al inglés con www.SystranBox.com

http://www.systranbox.com/systran/box?systran_lp=de_en&systran_id=SystranSoft-en&systran_url=http://www.sprut.de/electronic/pic/programm/compadc/compadc.html&systran_f=1088174471

Se que con este tipo de conversores se logran resoluciones más altas, a costa de mayor tiempo de conversión, según estas tablas:

Cristal de 4.0 Mhz

  8 bits (5 ms)
10 bits (21 ms)
12 bits (82 ms)
14 bits (328 ms)
16 bits (1.3 seg)


Cristal de 20.0 Mhz

  8 bits (1 ms)
10 bits (5 ms)
12 bits (17 ms)
14 bits (66 ms)
16 bits (262 ms)

Este método funciona con señales que no varían mucho en el tiempo, por ejemplo medición de temperatura.
Sé que para señales mas rápidas se utilizan circuitos "sample and hold" a la entrada del AD que "congelan" el valor instantáneo del voltaje hasta que el AD termine la conversión.
Ahora bien, alguien conoce algún circuito integrado "sample and hold" o sino uno hecho con componentes discretos (capacitores, transistores, etc) que sea controlado por el pic y congele la señal, por ejemplo, durante los 66 ms que lleva una conversión de 14 bits ?
Desde ya, muchas gracias.

    Téc. Claudio J. Pérez
Ciberar-Sistemas & Desarrollos
       Jujuy-Argentina

Desconectado cHiPmAn

  • PIC16
  • ***
  • Mensajes: 110
RE: Convertidor AD Sigma-Delta con PIC16F628
« Respuesta #1 en: 26 de Junio de 2004, 12:54:00 »
HOlas,

mirate bien como funcionan los comparadores del PIC pq me parece que solo lo puedes comparar con un rango muy pequeño de valores, creo q en ningun caso te acercas a los 8 bits. De todas maneras hace bastante tiempo que me lo miré y puede que hayan cambiado alguna cosilla.

Salu2!

Desconectado Ginho_rj

  • PIC12
  • **
  • Mensajes: 87
RE: Convertidor AD Sigma-Delta con PIC16F628
« Respuesta #2 en: 26 de Junio de 2004, 13:21:00 »
este codigo é bem rapido:


#include <16f628.h>
#use delay(clock=4000000)
#fuses HS,NOWDT,PUT,NOMCLR,NOBROWNOUT,NOLVP
#use rs232(baud=19200, xmit=PIN_B2,rcv=PIN_B1)
#include <regs_16.h>

#bit saida_comp = 0x1F.6 // C1OUT
#bit pino_modul = 0x05.3 // RA3
#bit tris_modul = 0x85.3 // TRISA3
#byte cmcon_reg = 0x1F
#byte vrcon_reg = 0x9F

void inicializa_delta_sigma()
{
   vrcon_reg = 0xEC;
   tris_modul = 0;
   cmcon_reg = 6;
}

long int adc_delta_sigma (long int resolucao)
// Função de conversão analógico digital utilizando a técnica delta-sigma
// Para garantir que a cada ciclo possua a mesma duração, utiliza-se o
// timer 0, atuando como um contador de instruções. No início do ciclo o
// timer 0 é iniciado com o valor 247. Ao final do loop, antes de retornar
// ao seu início, o programa aguarda que o T0IF seja setado
{
   long int resultado = 0;
   t0cs = 0;  // timer 0 com clock interno
   psa = 1;  // clock tmr0 = 1Mhz
   cmcon_reg = 3;
   while (resolucao)
   {
      tmr0 = 247;  // configura o timer 0
      t0if = 0;  // apaga flag do timer 0
      if (saida_comp)
      {
         pino_modul = 1;
      } else
      {
         pino_modul = 0;
         resultado ++;  // incrementa acumulador de resultado
      }
      resolucao --; // decrementa o contador de ciclos
      while (!t0if);
   }
   cmcon_reg = 6;
   return (resultado);
}

main()
{
   long int valor;
   float val;
   printf ("
ADC delta sigma
");
   inicializa_delta_sigma();
   while (true)
   {
      // a conversão será de 14 bits (16384)
      valor = adc_delta_sigma(16384);
      val = 5 * (float) valor / 16384;
      // se a tecla enter for pressionada
      if (kbhit()) if (getc() == 13)
      {
         // imprime os resultados na serial
         printf ("Tensao = %1.4f Volts
",val);
         printf ("Valor = %lu
",valor);
      }
   }
}