Autor Tema: Seguimiento a los Voltajes de I/O de un trafo  (Leído 7960 veces)

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

Desconectado scientist

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 999
Re: Seguimiento a los Voltajes de I/O de un trafo
« Respuesta #15 en: 10 de Mayo de 2008, 10:20:07 »
 :-/ gracias Gonzalo_BlackHawk por tomarte el tiempo de hacer una explicacion tan buena, gracias a esto comprendo mas a los adc del pic, yo estoy utilizando un 16f877a asi que supongo que esta bien la division del reloj, y esto del clock no sabia nada, ahora en tu programa utilizas una interrupcion del adc no? esto como funciona? se activa cada vez que el adc obtiene el muestreo de un canal? en este caso, de ser asi, depende de si es de 8 o 10 bits el adc? ademas con el sleep lo que haces es que no consuma mucha corriente?, este pedazo de tu programa se puede declarar como una funcion? o crea conflictos? perdon por demasiadas preguntas, pero es que mientras mas aprende uno, mas dudas tienes  :)
NO le digas a DIOS que tienes un gran problema, dile a tu problema que tienes un GRAN DIOS!!
Alma mia y castillo mio, mi Dios en quien yo confiare....

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Seguimiento a los Voltajes de I/O de un trafo
« Respuesta #16 en: 10 de Mayo de 2008, 16:55:49 »
Hola Gonzalo.

De pronto me apresure a dar el nivel de error  :mrgreen: . El error que obtengo es en la unidades (se mueve como loco) y claro cuando esta en el intermedio de un cambio a 10, pareceria que las decenas tambien estan inestables!!!!!, las centenas si son muy estables (de pronto escribi mal ... disculpas poe eso si lo hice :oops: )

El error que estoy obteniendo es de +-4LSb, que cuando estamos cercanos a los 5 voltios no importa mucho, pero a voltajes pequenos .... bueee.. ahi la cosa cambia. Por eso uso el filtro Moving, lo que si he hecho siempre es utilizar el oscilador interno ........ pero desde ahora NO!!!!!!  me tomare el tiempo de hacer el calculo que dices para garantizar de esa manera una buena conversion  :mrgreen: (a veces por afanados ... nos retrasamos!!!!)

Muy utiles tus explicaciones y muy entendibles!!!

Gracias.

Saludos
El papel lo aguanta todo

Desconectado Gonzalo_BlackHawk

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 519
Re: Seguimiento a los Voltajes de I/O de un trafo
« Respuesta #17 en: 11 de Mayo de 2008, 16:27:20 »
Hola a todos. Scientist, por favor, no tienes porque disculparte por preguntar, a uno le da gusto poder ser útil y mas aún cuando la gente a la que le has respondido te agradece y se interesa aun mas en el tema. :-/ :-/ :-/

La interrupción INT_AD se dispara cuando la conversión por parte del ADC ha finalizado, esto es válido para PIC's con ADC con resoluciones de 8, 10, 11, 12 o 16 bits. Es muy útil cuando no quieres perder tiempo en la conversión y entonces mientras el ADC esta convirtiendo el valor por HW, el procesador puede seguir realizando tareas. Ten en cuenta que una conversión típica en el ADC del PIC 16F877A demora 12 veces el TAD y suponiendo un TAD minimo de 1.6 us entonces esta tarea no demora menos de 19,2 us. Si tu PIC esta corriendo, supongamos, a 20 MHz entonces puedes realizar 96 instrucciones de ciclo de reloj único en este tiempo en el que ADC convierte el valor. Eso realmente son muchas instrucciones y uno a veces no se puede dar el lujo de quedarse sentado a mirar como el ADC hace su trabajo.
Si utilizas la instrucción read_adc() o read_adc(ADC_START_AND_READ) que es lo mismo, utilizar la interrupción no tiene sentido pues la función no retorna el valor hasta que la conversión halla finalizado y el microprocesador pasa ese tiempo (20 us con suerte) sin  hacer nada. Sin embargo en CCS tenemos la oportunidad de utilizar en conjunto la instrucción read_adc(ADC_START_ONLY) y la función read_adc(ADC_READ_ONLY) para evitar este despilfarro de tiempo pues con la primera solo iniciamos la conversión y luego con la segunda solo leemos el valor del registro del ADC donde se almaceno la tensión convertida. Aqui la interrupción INT_AD cobra importancia pues esta nos indica cuando podemos ejecutar la función read_adc(ADC_READ_ONLY) y terminar con la conversión actual.

Todo este codigo puede estar dentro de una función o no, es indistinto, la función solo será tal si es llamada varias veces durante el programa, de lo contrario CCS la une al main en tiempo de compilación y la función pierde su estructura (Salvo que especifique su independencia con el preprocesador #separate). Ten cuidado solamente de que no desborde el stack cuando se dispara la interrupción del ADC en estos casos.

Con respecto al Sleep, en el código que he posteado este no cumple la funcion de ahorrar energia durante la conversión, es más, con este método tambien se pierde el tiempo de conversión del ADC y no se puede realizar ninguna tarea durante este lapso. El objetivo en realidad es que, en modo Sleep, el PIC apaga mucho de sus circuitos internos y por lo tanto se evita que la conmutación digital y señales afecten la lectura del ADC, puesto que este no esta nada más ni nada menos que dentro de todo el paquete del microcontrolador. Es la forma más precisa y exacta de convertir una tensión, por lo menos con el ADC embebido del PIC.

Hay dos cosas importantisimas para resaltar en este metodo de conversion. La primera es que para poder convertir con el ADC con el pic durmiendo es necesario que este funcione en base a su oscilador interno (configurandolo mediante setup_adc(ADC_CLOCK_INTERNAL)) de lo contrario la conversion se aborta.
La segunda es que cuando uno tiene configurado el oscilador interno del ADC, luego de ejecutar read_adc(ADC_START_ONLY) el ADC espera solito un ciclo de reloj antes de iniciar la conversión, para que nos de tiempo para poner el PIC a dormir. Por eso la instruccion Sleep() debe ir siempre inmediatamente después de read_adc(ADC_START_ONLY).

Espero haber sido de utilidad.

Nos escribimos.
"Siempre piensa si el jugo vale la exprimida..."

"La muerte esta tan segura de vencer que nos da toda una vida de ventaja."

Desconectado scientist

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 999
Re: Seguimiento a los Voltajes de I/O de un trafo
« Respuesta #18 en: 13 de Mayo de 2008, 20:54:38 »
gracias por todo Gonzalo_BlackHawk usted si que sabe explicar, y se ve cuando las personas tiene ganas de ayudar, gracias a este foro, la tecnologia crece, y en un hilo aparte estoy tratando de implementarlo en un propulsor de ac, espero ayude a alguien
NO le digas a DIOS que tienes un gran problema, dile a tu problema que tienes un GRAN DIOS!!
Alma mia y castillo mio, mi Dios en quien yo confiare....

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Seguimiento a los Voltajes de I/O de un trafo
« Respuesta #19 en: 14 de Mayo de 2008, 23:45:27 »
OK!!!!!  :-/  :-/  :-/  :-/

El ADC se estabilizo mucho mas teniendo en cuenta el TAD de las conversiones, ahora ya no son necesarios promediar tantos datos ( de 100 a 10 !!!!!!  :-/ :-/ ) Muy cierto Gonzalo BH, ese tiempo es crucial!!!!

Gracia por tus explicaciones, muy utiles.

Saludos
El papel lo aguanta todo

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Seguimiento a los Voltajes de I/O de un trafo
« Respuesta #20 en: 15 de Mayo de 2008, 02:16:51 »
Muy buena explicación Gonzalo, he aprendido algunas cosas.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Seguimiento a los Voltajes de I/O de un trafo
« Respuesta #21 en: 15 de Mayo de 2008, 02:22:03 »
Ciertamente interesante. Me ha gustado mucho el truco del sleep() para que no haya actividad eléctrica que pueda afectar a la lectura del ADC.
Gracias Gonzalo.