TODOPIC
FORO TÉCNICO => Foro Técnico => Mensaje iniciado por: Hatsu en 28 de Abril de 2011, 13:16:30
-
Buenas a todos, necesito realizar una conversion AD serial de 12 bit y tengo disponible el ADS7812 (http://focus.ti.com.cn/cn/lit/ds/symlink/ads7812.pdf); he leido los datos tecnicos y por lo que entedi tendre q generar el DATACLK y el CONV segun este esquema (http://img600.imageshack.us/img600/5170/controlo.jpg) (http://img600.imageshack.us/i/controlo.jpg/)
Uploaded with ImageShack.us (http://imageshack.us)
La idea es que generare ambas señales con el PIC16f877A, aun no estoy seguro como nose si con PWM u otra forma.
Mi duda es que la data q sale esta en complemento a 2; pero no veo en el datasheet como identifica el inicio y final de cada muestra de 12 bits. Que es lo q entrara en el uC y se supone q tengo que identificar. Tambien mi duda es que he intentado buscar el ADS7812 en el ISIS Proteus; pero me parece q no esta. Si hubiera aguien tuviera disponible el link de esa libreria seria de gran ayuda.
Bueno agradezco todo apoyo, recomendacion y critica a lo q tengan experiencias con este conversor.
Saludos
-
Mirándolo rápidamente me parece que, al dispositivo generándole un flanco descendente en CONV se le indica que comience la conversión, y BUSY se mantiene a nivel bajo durante el proceso de conversión. Luego el dato ya está disponible y se debe generar 12 clock para obtener los 12-bist, de los cuales el primer enviado es el MSB. También entra ej juego el pin CS que tiene que estar a nivel bajo para seleccionar el dispositivo.
Saludos!
-
El manejo de este conversor es simple, le das el start, esperas un tiempo corto y con un tren de 16 pulsos recibes los datos seriales por el data.
Yo trabaje con este IC pero tube algunos problemas por inestabilidad y por costos, me pasé el ADS1100 (http://focus.ti.com.cn/cn/general/docs/lit/getliterature.tsp?literatureNumber=sbas239b&fileType=pdf), es excelente, no requiere componentes externos, fuente sencilla a 5v, I2C, recibe señales negativas, 16 bit y lo mejor a una quinta parte del costo.
Saludos.
Acá te coloco un código que hice entonces para controlarlo, está en asm.
sen_peso_to call t_104Ms2
bcf porte,ad_st ;RUTINA QUE SENSA EL RESULTADO DEL
nop ;CONVERSOR AD EXTERNO QUE SENSA EL
nop ;PESO
nop
call tiem_conv
bsf porte,ad_st
call tiem_conv
clrf conver_a
clrf conver_b
movlw d'16'
movwf respaldo
otro_bit bsf porte,ad_ck
call t_104Ms2
bcf porte,ad_ck
call t_104Ms2
btfss porte,ad_da
bcf status,c
btfsc porte,ad_da
bsf status,c
rlf conver_b,f
rlf conver_a,f
decfsz respaldo,f
goto otro_bit
-
Gracias a ambos por su respuesta tan rápida, mi duda es mas especificamente para ti Diego E. ya q tienes experiencia trabajando con este conversor.
En esta porción de código generas el pulso t1(de la figura) del CONV , correcto? mi duda es porq el número 16 o es para el otro conversor ADS1100
sen_peso_to call t_104Ms2
bcf porte,ad_st ;RUTINA QUE SENSA EL RESULTADO DEL
nop ;CONVERSOR AD EXTERNO QUE SENSA EL
nop ;PESO
nop
call tiem_conv
bsf porte,ad_st
call tiem_conv
clrf conver_a
clrf conver_b
movlw d'16'
movwf respaldo
En las 4 primera lineas generas el pulso de CLK para el primer bit,cierto?. De ahi no me queda muy claroa partir de la 5ta linea; solo asumo q repites 16 veces para obtener los pulsos de CLK. Y me parece q tas leyendo ya el primer bit de dato con el BTFSS y BTFSC lo del desplazamiento si no lo tengo claro.
otro_bit bsf porte,ad_ck
call t_104Ms2
bcf porte,ad_ck
call t_104Ms2
btfss porte,ad_da
bcf status,c
btfsc porte,ad_da
bsf status,c
rlf conver_b,f
rlf conver_a,f
decfsz respaldo,f
goto otro_bit
Bueno acerca de que comentabas la inestabilidad, parece q tendre q tener mucho cuidado con esos condensadores entonces . Gracias a todos de antemano por responder.
Saludos
-
Hola amigo, lo de los 16 bit es porqué en algún momento utilicé el ADS7813 que sí es de 16 bit, para el 7812 se requiero sólo 12 pulsos.
Para la otra inquietud no sé que experiencia tengas con assembler pero lo que se hace es:
Generar el pulso de reloj:
bsf porte,ad_ck
call t_104Ms2
bcf porte,ad_ck
call t_104Ms2
Preguntar que bit entrega el conversor en este instante, este bit es llevado al carry para luego cargarlo en un registro.
btfss porte,ad_da
bcf status,c
btfsc porte,ad_da
bsf status,c
Llenar dos registros de 8 bit con los bit recibidos del conversor, estos bit se recogen del carry, esto para formar 12 ó 16 bit.
rlf conver_b,f
rlf conver_a,f
decfsz respaldo,f
goto otro_bit
luego el dato final queda así: valor del conversor será igual a conver_a-conver_b
Nota: si utilizas lenguaje C todo será más fácil.
Saludos.
-
Consiguete un pic18f2553
-
Gracias a todos por responder mis duda voy a empezar a programar en C, y bueno usare el 16F877A más q todo por me lo pasaron :D
Mas adelante comentare los resultado y mis posibles problemas y dudas.
Saludos
-
Buenas a todos, hace un par de dias retome el trabajo en el ADS78 y bueno tuve algunos inconvenientes. Genere sin problemas los pulsos el CONV(34us aprox. bajo y 10us alto) y el DATACLOCK(1us alto y 1us bajo) Adjunto la figura de lo q genero con el PIC16F877A confirmado con el multimetro real. Sin embargo cuando meto una onda senoidal de 3V en la entrada de conversor esperaba q salieran al menos pulsos(0's y 1's) en la salida del conversor; DATA, lo q no sucede.
He programado con el PIC C,finalizado un pulso de DATACLOCK leia la entrada RB1(en mi programacion) y luego intentaba obtener el valor decimal de los 12 bits q recibia para enviarlo por hyperteminal. Adjunto el codigo para ver si alguien me hace ver algun error q no veo, por cierto lo he compilado y no he obtenido errores.
Saludos y gracias de antemano.
int dato;
int i;
int16 Ac=0;
void pulse (void){
DATACLK=1;
delay_us(1);
DATACLK=0;
delay_us(1);
}
void main(){
port_b_pullups(TRUE);
set_tris_B(0x02);
while(1)
{
if(CONV==1){
CONV=0;
delay_us(10);
for (i=1;i<=12;++i){
pulse();
dato=DATA;
Ac=Ac+dato*2^(12-i);
}
}
else{
CONV=1;
delay_us(10);}
}
printf("%Lu", Ac);
}
(http://img577.imageshack.us/img577/6428/pulsos.jpg) (http://imageshack.us/photo/my-images/577/pulsos.jpg/)