TODOPIC
Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: Enigma en 28 de Octubre de 2008, 23:16:21
-
Hola amigos, como están?, me disculpan la ausencia, pero es que he estado trabajando en unos proyectos que no me ha dejado tiempo pero para nada.... Precisamente en uno de esos proyectos se me ha presentado una cuestión que la verdad ya no encuentro como resoolver, despues de haber pensado mil y una formas, a ver si alguien se le ocurre una idea. Estoy trabajando con nuestro amigo el 18F4550, con C... La cuestión es que necesito escalar unos valores sin perder resolución, me explico... Por el conversor analógico dígital, me esta entrando un voltaje comprendido en rangos de 2.17 y 3.22 V, no como normalmente lo vemos de 0 a 5V. La cuestión es que trato de hacer que el conversor, me vea ese 2.17 como 0 tanto en decimal como en binario, y el 3.22 como 255, ya que la resolución es de 8 bits... He intentado formulas, aproximaciones, de todo, pero no he logrado nada ya que la resolución se me va a tierra, es decir si se dan cuenta, solo tengo menos de 60 números (esto por la resta de 2.17 y 3.22V en binario es decir, 110.64 para 2.17 y 164.17 para 3.22V), es decir, aproximadamente una resolución de 6 bits.... Mi última acción es usar una tabla equivalente, pero igual la resolución se me está yendo a pique.... Y lo peor de todo es que no puedo usar algún comnponente ajeno, todo ha de ser por software...
Como les dije he hecho muchas formulas, de unidades de ingenieria y nada, no logro mantener la resolución de 8 bits... Ya que por ejemplo 2.17 V me tienen que representar 4mA y 3.22 me tienen que representar 20mA, y pues ni maquillando el programa me sale... ya que los valores que me dan son saltos muy grandes... Por ejemplo si estoy en 2.17 y cambia a 2.20 pues el valor de corriente me cambia de 4mA a 10mA :shock:, algo muy insolito!!!! esto es en software y simulación.... Si alguien tiene una idea de como escalar sin perder resolución, bienvenida sea porque de verdad ya no doy más!" :z)
Atte: Enigma... La llanerita de Guayana :-)
-
Se puede con VREFS?
-
No acabo de entender el problema que tienes. Veamos haber si lo desliamos un poco. En primer lugar el ADC te mide tensión y no corriente, supongo que estarás haciendo algún tipo de conversión sobre una resistencia shunt y por lo tanto divide V/R para obtener la intensidad. En segundo lugar si tus voltajes van entre 2.17 y 3.22 no tienes que realizar nada, solo leer la entrada del ADC y multiplicar el valor obtenido por 5/255 (como float para conservar la parte decimal). La resolución en 8 bits es 5/255=0.0196 osease aproximadamente 0,02 voltios por salto del conversor, como casi son 0,02 voltios no podrás discriminar entre 2,33 y 2,34 ya que la precisión es de 0,02V. Si utilizas 10 bits la precisión será de 0,00488 voltios por salto, valor más que suficiente para lo que tu quieres realizar.
Un saludo
-
Hola Enigma, el problema que tu tienes es porque el micro necesita de una diferencia entre tensiones de referencias al menos de 1,8V alimentandolo con menos de 3V y de 3V si lo alimentas con 3V o más, osea:
dVRef= (VRef+) - (VRef-) >= 1,8V para Vcc<3V
dVRef= (VRef+) - (VRef-) >= 3V para Vcc>=3V
según el índice del datasheet PIC18F2455/2550/4455/4550 en la página 393, Tabla 28-28: A/D CONVERTER CHARACTERISTICS , Parámetro A20 Reference Voltage Range.
Todo esto me pasó ya una vez por eso lo recuerdo, lo discutimos en este hilo: SALTO EN EL CONVERTIDOR A/D DE UN 16F877 (http://www.todopic.com.ar/foros/index.php?topic=14529.0)
Si bien el problema era con un 16F877, te recomiendo que veas esa referencia que te indiqué en el DS del 18f4550.
Por lo tanto te recomiendo implementes un amplificador para la señal y así no perder la resolución en ese rango, puedes ver el ejemplo aquí:Adaptación de sensor LM35 a PIC 16F877 (http://www.todopic.com.ar/foros/index.php?topic=13389.msg77809#msg77809)
También puede que tengas el problema discutido en este hilo: Conversor AD PIC16f877a y lcd problema resolución??? (http://www.todopic.com.ar/foros/index.php?topic=13543.0) aunque me inclino por el problema del primer hilo.
Saludos!!
-
Se puede con VREFS?
Umm Bueno, ya pense en esa opción... Pero eso implicariacolocar elementos externos para fijar los voltajes (como zeners, opamps, etc).... Y los Vref internos no me sirven de mucho puesto que no tiene os valores exactos que neceto...
No acabo de entender el problema que tienes.
Con respecto a lo de la corriente, si se que el ADC no mide corriente! jejeje, y la conversión la estoy hacieno a través de una formula genérica!!!!
Con respecto al la resolución de 10 bits, creeme lo intente, pero el micro, no discriminaba tampoco mucho entre los valores además de que me fluctuaba demasiado, ya qu le estoy restando resolución y para más ñapa voltaje... Ya qe el pic, cuando ve los 2.17 en la entrada lo que está viendo en binario, es 110 y cuando observa el valor másimo que es 3.22 pues observa 164, imaginate, 164 menos 110, serian 54 valores :shock:, es decir menos de la mitad e la resolución de 8 bits.... Por eso es que te digo que lo saltos son enormes!!!!
Por lo tanto te recomiendo implementes un amplificador para la señal y así no perder la resolución en ese rango,
Umm.... No puedo olocar componentes externos mi estimado... :(... aunque lo de la dferencia del vrf, pues si se me cumple, porque estoy alimentando con 4V ese seria vrf+ y vrf- pues es cero....
Yo más bien creo que tendré que hacer un sacrificio de resolución.... :(
Atte: Enigma... La llanerita de Guayana :-)
-
Hola
Talvez ya hayas intentado algo así, pero lo escribo por si notas alguna diferencia entre tus cálculos y los míos.
Vref+ = 5V
Vref- = 0V
Resolución ADC 10 bits
Error de la medición ADC 1 LSb
El programa recibe la conversión binaria de 10 bits en binaria:
int16 binaria;
Despreciemos el último bit ya que es erróneo y oscila mucho; además no podemos filtrarlo usando componentes externos.
binaria=binaria>>1; //lo rota y desaparece el LSb
Nuestro ADC ya es de 9 bits.
Luego se deduce la ecuación que convierte a binario.
5V -> 2^9, 5V -> 512
2.17V -> 222bits
3.22 -> 329bits
222bits serán 4mA y 329 serán 20mA, entonces...
m= (20-4)mA / (329-222)bits = 0.149532 mA/bit
y=mx+b
20mA = (0.149532mA/bit) + b
b= -29.196028
Corriente = 0.159532mA/bit (binario) - 29.196028mA
Ejemplo...
Si llegan 2.22V al ADC y se convierten a 227bits.
Corriente = (0.149532)(227)-29.196028
Corriente = 4.747736mA
Si llegan 3.0V y se convierten a 307bits.
Corriente = (0.149532)(307) - 29.196028
Corriente = 16.71mA
La ecuación en c puede quedar:
float corriente;
corriente=(float)(0.149532)*(binario>>1)-29.196028;
-
Hola Enigma o note entendí o no me entendiste :D
"me vea ese 2.17 como 0 tanto en decimal como en binario, y el 3.22 como 255,"
"porque estoy alimentando con 4V ese seria vrf+ y vrf- pues es cero..."
No entiendo hay un dato que no me cierra...
Santiago, con justificar a la izquierda ya te quedan 8 bits...
-
Santiago, con justificar a la izquierda ya te quedan 8 bits...
Sí, pero en ensamblador y configurando el adc. Yo recomiendo que haga la medición a 10 bits y rote un bit a la derecha para que tenga 9 bits y desprecie el décimo bit menos significativo que varía mucho en su circuito.
-
Cual dato flacocau??
a ver me explico otra vez... a lo mejor soy yo que no me doy a entender... es que con tanto strees, y tantos calculos hechos ultimamamente ya mi manera de expresar está ificil..
El voltaje, de alimentación del pic es de 4 V, pero de otro circuito, vienen el voltaje comprendido en un rango de 2.17 y 3.22... Es decir, el otro circuito nunca mpieza de cero, es como si sucero fuera 2,17, es por eso que el pic siempre verá ese voltaje como minimo, el 2.17... No se si me explique está vez....=?
Migsantiago, si había pensado algo así, e incluso aplique una formula que invente allí, pero no me funciono, la diferencia con respecto a tu aporte es que yo no use el adc de 10 bits porque como dije antes pues me fluctuaban los valores, no se me ocurrio rotar el bit para hacerlo de 9 bits.... Voy a intentarlo, y también que tu estás tomando la alimentación de 5V, yo estoy alimentando con 4, por tanto ya no sería 512 sino más bien 409 aproximadamente...., en donde para 2,17 me daria 221 y para 3.22 me daria 329... si no estoy mal :shock:... Pero igual, creo que la resolución aumenta un poco más con tu metodo si no estoy mal....
Santiago, con justificar a la izquierda ya te quedan 8 bits...
Creo que el tiene la idea de usar 9 bits y no 8... o me equivoco.... :?
Seguiré trabajando en esto, implementaré lo de 9 bits a ver.... Aunque ahorita estaba haciendo una gran tabla de 54 valores y estaba haciendo aproximaciones... pero la resolución con esta tabla está pata de perro!!! :(
Atte: Enigma... La llanerita de Guayana :-)
-
Trata de mejorar tu circuito de entrada al pic porque si te fluctuan los valores es porque la entrada al pic viene muy ruidosa. Si muestreas a baja velocidad digamos 1Hz pued podria mejorarte si colcaras un filtro pasa bajo eso hará que la señal que lee el pic sea mas estable, revisa esa señal con osciloscopio si pudieras.
Javicho.
-
Lo que pasa es que tratar de estabilizarlo involucra como dices colocar una red rc, y eso sería añadir más componentes al circuito cuestión que no puedo hacer, porque eso seria un consumo de corriente más, y bueno ya la corriente que tengo es la necesaria para alimentar el circuito, no puedo tomar más... :(
Es como tratar de hacer un cohete con solo chatarra! tengo lo que tngo y solo puedo acudir a la programación... :S
Atte: Enigma... La llanerita de Guayana
-
Migsantiago, si había pensado algo así, e incluso aplique una formula que invente allí, pero no me funciono, la diferencia con respecto a tu aporte es que yo no use el adc de 10 bits porque como dije antes pues me fluctuaban los valores, no se me ocurrio rotar el bit para hacerlo de 9 bits.... Voy a intentarlo, y también que tu estás tomando la alimentación de 5V, yo estoy alimentando con 4, por tanto ya no sería 512 sino más bien 409 aproximadamente...., en donde para 2,17 me daria 221 y para 3.22 me daria 329... si no estoy mal :shock:... Pero igual, creo que la resolución aumenta un poco más con tu metodo si no estoy mal....
Aunque tengas como Vref+ a 4V, la resolución del ADC será siempre de 2^9=512, el que utilices solo un área del adc para tu medición no implica que la resolución del adc cambie.
Reajustando los valores a 4V la fórmula para tu cálculo queda así...
4V -> 2^9
4V -> 512
2.17V -> 277bits
3.22 -> 412bits
Lo anterior fue calculado por regla de 3.
277bits serán 4mA y 412 serán 20mA, entonces...
m= (20-4)mA / (412-277)bits = 0.118518 mA/bit
y=mx+b
20mA = (0.118518mA/bit)(412) + b
b= -28.829629
Corriente = 0.118518mA/bit (binario) - 28.829629
Ejemplo...
Si llegan 2.22V al ADC y se convierten a 284bits...
2.22*512/4= 284 bits
Corriente = (0.118518)(284)-28.829629
Corriente = 4.829483mA
El nuevo código a emplear es:
float corriente;
corriente=(float)(0.118518)*(binario>>1)-28.829629;
Debes resolver parte de la conversión usando la ecuación de la recta, no debes usar reglas de 3 ni ajustar la referencia positiva a 3.22, esa siempre será 4V.
-
Migsantiago, si tienes razón, pero te digo que los resultados cambian, y no entiendo porque, ya que la difrenecia no es tan grande entre ambos voltajes y los calculos entre ambos... Mirá estas pruebas...
Esto es sacando 4V con resolución en 409, en el minimo voltaje, es decir en 2.17V
(http://img114.imageshack.us/img114/4183/con409ix5.jpg)
Fijate que el valor de la corriente si es aproximado a 4mA, con poca resolución pero mucho mejor de la que yo tenia con la tabla....
Esto es sacando 4V con resolución en 409, en el maximo voltaje, es decir en 3.22V
(http://img529.imageshack.us/img529/6549/con409en317vny0.jpg)
El valor de corriente aquí es aproximadamente 20mA.
Esto es sacando 4V con resolución en 512, en el minimo voltaje, es decir en 2.17V
(http://img114.imageshack.us/img114/9826/con512en216vwc3.jpg)
Fijate en el valor de corriente... Negativo..... :?
Esto es sacando 4V con resolución en 512, en el maximo voltaje, es decir en 3.22V
(http://img114.imageshack.us/img114/8383/con512en317vwj2.jpg)
Y mira la corriente en el valor máximo... solo lega hasta 10...mA
Y el código está bien...
(http://img114.imageshack.us/img114/5305/codigogx4.jpg)
Que opinas al respecto....?
Atte: Enigma... La llanerita de Guayana :-)
-
Hola Enigma.
¿Por qué no pones la simulación y el programa para que lo podamos ejecutar y ver el problema?
Un saludo
-
Que opinas al respecto....?
Atte: Enigma... La llanerita de Guayana :-)
En ningún lado veo la alimentación del pic18. Proteus conecta automáticamente el pic a 5V. Debes dar click derecho al pic18 y ponerle que NO oculte los pines Vdd y Vss. Luego a esos pines conectas 4V y 0V respectivamente.
La conversión adc en la simulación que publicas se está haciendo con Vref+ a 5V, y no a 4V como debe ser... hasta donde recuerdo de cuando yo simulaba en proteus.
Edito: Se me olvidó decirte que por si las dudas no quites el casting (float) en la conversión.
-
O.k, jfh900 colocare el programa y la simulaciòn.....
Edito: Se me olvidó decirte que por si las dudas no quites el casting (float) en la conversión.
Quieres decir aquí en la formula???
corriente=(float)(0.118518)*(binario>>1)-28.829629; dejarlo así tal cual????
Disculpa mi ignorancia Migsantiago, pero no logro mostrar los pines de alimentación del pic, ya he buscado en editar propiedades del mismo, pero nada! :(
Atte: Enigma... La llanerita de Guayana :-)
-
Bueno en vista de que no consegui como colocar los pines de alimentación al pic en el proteus, tuve que probar todo en vivo y directo....
Los resultados....
Funcionó muy bien la idea de migsantiago, cosa que agradezco puesto que ya no encontraba que más hacer, por lo menos la resolución me aumento un poco más de como la tenía antes.... Eso de usar un conversor a 9 bits no se me hubiera ocurrido...
La única cuestión es que tengo demaisadas fluctuaciones, es decir, el valor no se queda estático, si está en el nivel más bajo, pues me fluctua de 4, 7mA a 5,8mA a 6.1mA, luego baja de nuevo a 4,7mA, 5,8mA , 6.1mA y así va..... Supongo que han de ser las condiciones del sistema....
Agradezco su total colaboración.... de verdad que si.... No lo hubiera logrado sin su gentil ayuda...
Todavia sigo con la duda de como hacer que aparezcan los pines de alimentación del pic....
Atte: Enigma... La llanerita de Guayana :-)
-
Hola Enigma, te aconsejo leer el link de este post
http://www.todopic.com.ar/foros/index.php?topic=20721.msg157377#msg157377
y los siguientes mensajes.
Suerte. :-)
-
Bueno en vista de que no consegui como colocar los pines de alimentación al pic en el proteus, tuve que probar todo en vivo y directo....
Los resultados....
Funcionó muy bien la idea de migsantiago, cosa que agradezco puesto que ya no encontraba que más hacer, por lo menos la resolución me aumento un poco más de como la tenía antes.... Eso de usar un conversor a 9 bits no se me hubiera ocurrido...
La única cuestión es que tengo demaisadas fluctuaciones, es decir, el valor no se queda estático, si está en el nivel más bajo, pues me fluctua de 4, 7mA a 5,8mA a 6.1mA, luego baja de nuevo a 4,7mA, 5,8mA , 6.1mA y así va..... Supongo que han de ser las condiciones del sistema....
Agradezco su total colaboración.... de verdad que si.... No lo hubiera logrado sin su gentil ayuda...
Todavia sigo con la duda de como hacer que aparezcan los pines de alimentación del pic....
Atte: Enigma... La llanerita de Guayana :-)
Si tienes problemas de oscilación de la medición entonces habrá que reducir la resolución a 8 bits y reajustar las ecuaciones; otra opción es poner un filtro pasa altas de 60Hz digital, pero eso ya es mucho show :D
Proteus siempre me dio dolores de cabeza con las simulaciones y solo había una forma de aliviarlos... probar el circuito en vivo y en directo. Por eso hace años que no simulo con proteus.
Sobre los pines, Veguepic tiene la respuesta (http://www.todopic.com.ar/foros/Themes/babylon/images/post/thumbup.gif) , yo solo sé que ya no sé nada de Proteus. :-)
-
Si bueno, pero reajustar a 8 bits implica tener mucha menos resoolución.... Al menos que sacrifique resoución por precisión.... Todo es un sacrificio.... :? Bueno probaré a ver cuanto da con 8 bits..... Aunque no creo que sea muy satisfactorio puesto que vulevo a lo que teía antes... Aunque iualmente agradezco toda tu ayuda!!! Con lo de Proteus ya consegui hacerlo, solo que me da un error extraño, creo que es porque el pic viene predeterminado para 5V, bueno ya veré como soluciono..... Igualmente muchas gracias Migsantiago! :mrgreen:
Atte: Enigma... La Llanerita de Guayana :-)
-
:mrgreen:
Qué bueno que al menos ya avanzaste :-/
La resolución si usaras 8 bits se calcula también con una ecuación de la recta...
y = mx+b
Calcula m...
m = (20-4)mA / (3.22-2.17)V
m = 15.23mA / V
Despeja b conociendo un punto, por ejemplo (3.22V, 20mA)...
20=(15.23)(3.22)+b
b=-29.06
La ecuación queda...
Corriente = (15.23 mA / V) * Voltaje - 29.06mA
Se tiene que 4V es el máximo voltaje que ha de llegar al pic (hipotéticamente ya que nunca pasarás de los 20mA, pero hace falta para el cálculo)...
Corriente = (15.23*4)-29.06
Corriente = 31.89mA (equivalentes a 4V)
Luego se calculan las resoluciones...
- A 8 bits
31.89mA / 256 = 0.124mA / bit
- A 9 bits
31.89mA / 512 = 0.062mA / bit
- A 10 bits
31.89mA / 1024 = 0.0311mA/bit
No creo que persigas resoluciones menores a 0.124mA, ¿o sí? :o
Ahora me toca preguntarte... ¿porqué no puedes agregar elementos externos?
-
Umm interesante!!!! jejeje no, esa resolución está bien, de hecho es la que tengo actualmente... Pero resulta que de tanto probar y experimentar he descubierto que las fluctuaciones no son debidas al convertidor ni a la baja resolución... El que me genera tanta fluctuación es el compañero PIC o el programa, cuestión que me parece muy extraña ya que hace unas dos semanas atrás el mismo programa estaba funcionando de mil maravillas... Si te fijas en el estoy trabajando con el modo sleep, para bajarle el consumo, el cual hasta hace dos semanas se me mantenia fijo en 0.8mA... y de buenas a primeras con el mismo programa pues nuestro amiguito me está oscilando entre los 4uA, 9uA,90uA y 0.1mA :shock: No se si exista la posibilidad de que el pic se me haya dañado o algo... Aunque no creo puesto que todavia mueve la LCD y eso... He probado con varios programas que me funcionaban bien y pues la verdad nada, funcionan mal... El bendito pic me ha estado generando las fluctuaciones :? Ahora estoy prueba que prueba con programas distintos a ver que sale... Si no me tocará probar con otro pic... :(
Respondiendo a tu pregunta... No puedo adicionar elementos externos, ya que el proyecto que estoy trabajando es de caracter pasivo, el cual toda la circuiteria en general (lcd,pic,amplificador de instrumentación, sensor, entre otros) debería tener idealmente 4mA de consumo total, digo idealmente porque ahorita tengo 4.5 mA :? Entonces si adiciono otro componente, pues este disipa potencia, potencia es equivalente a consumo de corriente, y bueno más bien ya tengo demás de ella y tengo que ver como bajarla, así eso signifique sacrificar unos cuantos bits de resolución.... :( Más chiiiiiiiimbo!
Bueno corrijo no era el mismo programa, a este le añadi unas cositas más, no muchas y de repente empezo a fluctuar... he probado el programa de hace dos semanas y pues la verdad se me mantiene la corriente estable.... que suerte tan triste la mia!
Atte: Enigma... La Llanerita de Guayana :-)
-
Ah bueno, con razón no puedes usar ni lo más mínimo :D
Sobre los cambios de corriente talvez se deben a que enciendes y apagas módulos y periféricos del pic, por ejemplo el ADC. Haz la prueba y déjalo siempre encendido y a ver si la potencia se mantiene fija.
De todas formas es raro que de 40uA a 100uA el voltaje de la fuente sea modificado, a mi se me hace que la fuente trae un rizo mal filtrado.
-
No ya intente eso.... Es bien raro, no puedo entender que le pasa.... Porque antes estaba haciendo lo mismo, solo que con instrucciones diferentes, y ahora de repente al cambiar unas simples ecuaciones y unas simples variables todo se me vino abajo... Antes la corriente se me mantenia fija en 0.7mA, y ahora presenta ese poco de fluctuaciones, ya cambie de pic, cambie de fuente, cambie de componentes, De verdad que no puedo entender.... :?
Atte: Enigma... La llanerita de Guayana :-)