TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Tec_Claudio_Perez 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
-
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!
-
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);
}
}
}