TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: mariacontenis en 03 de Abril de 2022, 16:53:10

Título: PIC18F46K22 y problema raro del ADC
Publicado por: mariacontenis en 03 de Abril de 2022, 16:53:10
Amigos del foro, TODOPIC.

Tengo un problema con la lectura del ADC del PIC18F46K22 en CCS C y el problema es el siguiente:
 
Estoy realizando la medición del adc a 10 bits
Código: C++
  1. #device adc=10

y los fuses asi:
Código: C++
  1. #fuses HSH,NOPLLEN,PRIMARY_ON,NOWDT,PUT,NOBROWNOUT,NOPBADEN,MCLR,PROTECT,NOLVP,NOSTVREN,NODEBUG

a 20 Mhz con un crystal fisicop externo de 20Mhz

Código: C++
  1. #use delay(clock=20000000, crystal=20000000)

dentro del el main:

Código: C++
  1. setup_adc_ports (sAN0 | VSS_VDD);           // setup_adc_ports (sAN0 | VSS_VDD);  para 18f46k22  
  2.          setup_adc(ADC_CLOCK_INTERNAL | ADC_TAD_MUL_0);
  3.          set_adc_channel(0);

Bueno, pues resulta sin tener nada conectado en la entrada AN0 del 18F46K22 (deberia de ser 0V cd), me muestra una lectura de 0.82 Vcd medidos con el multimetro (Esta medición la tomo rápido por que casi al momento de medirla cae el voltaje a cero). Coloco mi dedo en la entrada del adc y cae ese voltaje a cero, lo cual es lo que debería de ser correcto, quito mi dedo y ese voltaje de 0.82 vuelve a aparecer como si fuera ruido o no se pero ya me esta volviendo loco :?.

Ese mismo código, claro solo cambiando los #fuses  para que compile el programa con el PIC18F4550 funciona de maravilla, es decir, aquí sin tener nada conectado marca 0 Volts, la cuestion es que ya tengo unas pcb ensambladas y no quisiera cambiar de Pic por presupuesto.

No se que es y me da vueltas la cabeza podría ser:

1.- Configuración de los #fuses que es lo único que cambio del pic 18F46K22 al PIC18F4550 (El 4550 funciona al 100).
2.- Ruido eléctrico.
3.- El adc del 18F46K22 no esta funcionando bien o el compilador de CCS para este pic esta fallando con algún bugs.
4.- Configurar el ADC de otra manera o por registros.
5.- Impedancia de entrada del ADC para este pic.
6.- Los extraterrestres me quieren hacer la vida de cuadritos  :mrgreen:

Por favor alguien a me podría aclarar esto, o alguna ayuda.

Gracias.

Olvidaba decir que ese voltaje de 0.8 o mas ya que varia un poco, lo estoy convirtiendo a porcentaje, el cual muestro en el LCD.

La dinámica en la LCD es que a 0V =% y a 5V 100%.

En la imagen, la lcd muestra 14% y no tengo nada conectado en la entrada del AN0.

Título: Re:PIC18F46K22 y problema raro del ADC
Publicado por: Eduardo2 en 03 de Abril de 2022, 17:59:10
...Bueno, pues resulta sin tener nada conectado en la entrada AN0 del 18F46K22 (deberia de ser 0V cd), me muestra una lectura de 0.82 Vcd medidos con el multimetro (Esta medición la tomo rápido por que casi al momento de medirla cae el voltaje a cero)....

Ese debería es un error de concepto tuyo. En una entrada de alta impedancia podés tener cualquier lectura.  Esos 0.82V probablemente sea ruido que parte se rectifica por el diodo de protección.
Ya ves que al conectar un multímetro (cuya resistencia de entrada suele ser de 10Mohms) cae a 0.

En general esto no tiene importancia porque normalmente esa entrada debe ir conectada, pero si por cuestiones estétitas debe marcar 0 pues ponele una resistencia de 1Mohm a masa.
Título: Re:PIC18F46K22 y problema raro del ADC
Publicado por: DominusDRR en 03 de Abril de 2022, 18:17:37
Amigos del foro, TODOPIC.

Tengo un problema con la lectura del ADC del PIC18F46K22 en CCS C y el problema es el siguiente:
 
Estoy realizando la medición del adc a 10 bits
Código: C++
  1. #device adc=10

y los fuses asi:
Código: C++
  1. #fuses HSH,NOPLLEN,PRIMARY_ON,NOWDT,PUT,NOBROWNOUT,NOPBADEN,MCLR,PROTECT,NOLVP,NOSTVREN,NODEBUG

a 20 Mhz con un crystal fisicop externo de 20Mhz

Código: C++
  1. #use delay(clock=20000000, crystal=20000000)

dentro del el main:

Código: C++
  1. setup_adc_ports (sAN0 | VSS_VDD);           // setup_adc_ports (sAN0 | VSS_VDD);  para 18f46k22  
  2.          setup_adc(ADC_CLOCK_INTERNAL | ADC_TAD_MUL_0);
  3.          set_adc_channel(0);

Bueno, pues resulta sin tener nada conectado en la entrada AN0 del 18F46K22 (deberia de ser 0V cd), me muestra una lectura de 0.82 Vcd medidos con el multimetro (Esta medición la tomo rápido por que casi al momento de medirla cae el voltaje a cero). Coloco mi dedo en la entrada del adc y cae ese voltaje a cero, lo cual es lo que debería de ser correcto, quito mi dedo y ese voltaje de 0.82 vuelve a aparecer como si fuera ruido o no se pero ya me esta volviendo loco :?.

Ese mismo código, claro solo cambiando los #fuses  para que compile el programa con el PIC18F4550 funciona de maravilla, es decir, aquí sin tener nada conectado marca 0 Volts, la cuestion es que ya tengo unas pcb ensambladas y no quisiera cambiar de Pic por presupuesto.

No se que es y me da vueltas la cabeza podría ser:

1.- Configuración de los #fuses que es lo único que cambio del pic 18F46K22 al PIC18F4550 (El 4550 funciona al 100).
2.- Ruido eléctrico.
3.- El adc del 18F46K22 no esta funcionando bien o el compilador de CCS para este pic esta fallando con algún bugs.
4.- Configurar el ADC de otra manera o por registros.
5.- Impedancia de entrada del ADC para este pic.
6.- Los extraterrestres me quieren hacer la vida de cuadritos  :mrgreen:

Por favor alguien a me podría aclarar esto, o alguna ayuda.

Gracias.

Olvidaba decir que ese voltaje de 0.8 o mas ya que varia un poco, lo estoy convirtiendo a porcentaje, el cual muestro en el LCD.

La dinámica en la LCD es que a 0V =% y a 5V 100%.

En la imagen, la lcd muestra 14% y no tengo nada conectado en la entrada del AN0.

¿Usas un filtro pasabanda o pasabajos? Es casi necesario utilizarlo en conjunto con un ADC.
Título: Re:PIC18F46K22 y problema raro del ADC
Publicado por: mariacontenis en 03 de Abril de 2022, 18:29:03
Gracias por responder. Eduardo2 y DominusDRR.

Ahora probare las sugerencias. Aun asi, por que si cambio el pic  un 18F4550 no hay error, el voltaje cae completamente a cero cuando no tengo nada conectado?.

DominusDRR, de que valores recomiendas el RC para el filtro?.

Eduardo2
Citar
En general esto no tiene importancia porque normalmente esa entrada debe ir conectada

Para este caso ese sensor conectado a AN0 se puede dañar y si sucede así el valor debería caer a cero para validar una condición de que el sensor de daño y alarmar el sistema.

Bueno, pruebo y muestro resultados, saludos!!.
Título: Re:PIC18F46K22 y problema raro del ADC
Publicado por: DominusDRR en 03 de Abril de 2022, 18:37:12

Ahora probare las sugerencias. Aun asi, por que si cambio el pic  un 18F4550 no hay error, el voltaje cae completamente a cero cuando no tengo nada conectado?.

Talvez deberías compartir una imagen del esquemático, y si es posible una imagen del hardware (fotografía), tal vez se pueda determinar alguna cosa

DominusDRR, de que valores recomiendas el RC para el filtro?.


Eso deberías determinarlo en función de que frecuencias mínimas y bajas deseas rechazar y el tiempo de respuesta deseada. Por ejemplo, la señal de la empresa eléctrica (60Hz) suele aparecer en muchos circuitos analógicos. Un filtro para eliminar esa frecuencia introduce una latencia grande en el sistema.

Si estás midiendo temperatura, ese retardo no es problema, ya que la temperatura cambia de manera mucho más lento que 60Hz.

Pero si estás midiendo la corriente de un motor eléctrico para determinar una sobre corriente, ahí es un problema antes que una solución, el filtro.
Título: Re:PIC18F46K22 y problema raro del ADC
Publicado por: DominusDRR en 03 de Abril de 2022, 18:39:20

Eso deberías determinarlo en función de que frecuencias mínimas y bajas deseas rechazar y el tiempo de respuesta deseada. Por ejemplo, la señal de la empresa eléctrica (60Hz) suele aparecer en muchos circuitos analógicos. Un filtro para eliminar esa frecuencia introduce una latencia grande en el sistema.

Si estás midiendo temperatura, ese retardo no es problema, ya que la temperatura cambia de manera mucho más lento que 60Hz.

Pero si estás midiendo la corriente de un motor eléctrico para determinar una sobre corriente, ahí es un problema antes que una solución, el filtro.

Yo he utilizado este software para diseñar filtros para utilizarse en conjunto con un ADC.

https://www.microchip.com/en-us/development-tool/FilterLabDesignSoftware (https://www.microchip.com/en-us/development-tool/FilterLabDesignSoftware)
Título: Re:PIC18F46K22 y problema raro del ADC
Publicado por: DominusDRR en 03 de Abril de 2022, 18:42:00

Eso deberías determinarlo en función de que frecuencias mínimas y bajas deseas rechazar y el tiempo de respuesta deseada. Por ejemplo, la señal de la empresa eléctrica (60Hz) suele aparecer en muchos circuitos analógicos. Un filtro para eliminar esa frecuencia introduce una latencia grande en el sistema.

Si estás midiendo temperatura, ese retardo no es problema, ya que la temperatura cambia de manera mucho más lento que 60Hz.

Pero si estás midiendo la corriente de un motor eléctrico para determinar una sobre corriente, ahí es un problema antes que una solución, el filtro.

Yo he utilizado este software para diseñar filtros para utilizarse en conjunto con un ADC.

https://www.microchip.com/en-us/development-tool/FilterLabDesignSoftware (https://www.microchip.com/en-us/development-tool/FilterLabDesignSoftware)

Esta herramienta es mucho más actual. No la he utilizado:

https://mad.microchip.com/SGN_CHAIN (https://mad.microchip.com/SGN_CHAIN)
Título: Re:PIC18F46K22 y problema raro del ADC
Publicado por: mariacontenis en 03 de Abril de 2022, 23:48:34

Eduardo2 coloque la resistencia de 1M en la entrada del AN0 y GND y Wualaaa!!. Funciono...

Ahora desconectado el sensor se va a cero el valor y conectándolo funciona de maravilla.

Gracias por la ayuda.

DominusDRR Gracias de igual manera, opte por la primera opción por que es menos Hardware.

Gracias!!.
Título: Re:PIC18F46K22 y problema raro del ADC
Publicado por: Eduardo2 en 04 de Abril de 2022, 00:29:35
Tené en cuenta que si bien 1Mohm te resuelve el problema,  si la sonda tuviera varios metros de cable y se te corta el de masa -->  1Mohm sea insuficiente y necesites bajarla a 100k...10k etc 
Es experimental porque dependés de por donde pasa el cable y lo "ruidoso" de los cables vecinos.
Título: Re:PIC18F46K22 y problema raro del ADC
Publicado por: mariacontenis en 04 de Abril de 2022, 00:38:59
Gracias Eduardo2, lo tendré en cuenta y no cerrare el tema hasta ponerlo por unos días en operación.

Por lo pronto esta trabajando al 100. :mrgreen:
Título: Re:PIC18F46K22 y problema raro del ADC
Publicado por: DominusDRR en 04 de Abril de 2022, 10:04:46
Gracias Eduardo2, lo tendré en cuenta y no cerrare el tema hasta ponerlo por unos días en operación.

Por lo pronto esta trabajando al 100. :mrgreen:

Yo te recomendaría utilizar un osciloscopio para que veas que realmente está llegando al ADC. Aun que es raro que con el otro microcontrolador no necesites la resistencia mencionada.

También si está muy lejos el sensor respeto a la entrada del ADC, debes usar un amplificador diferencial para disminuir el ruido en los cables que se comportan como antenas, y luego de dicho amplificador, el filtro.

Obviamente estas recomendaciones son si vas a comercializar un producto y de esa manera evitar dolores de cabeza.

Si es algo didáctico, con la resistencia o hasta con simple filtro RC es más que suficiente.

Acá esta la imagen de un amplificador diferencial que reduce una entrada que varía de 0 a 10 V de 3 a 0V de un producto que comercializamos, V1 es el sensor que varía su voltaje de 0 a 10V y la salida de X2 varía ente 3V a 0V



Título: Re:PIC18F46K22 y problema raro del ADC
Publicado por: mariacontenis en 16 de Abril de 2022, 10:19:46
Saludos  a todos. Después de 10 días de operación del circuito todo trabaja de maravilla. Antes de cerrar el tema tengo una pregunta mas (no tan relacionada con lo mismo pero me interesa).

E visto que esto con en ccs.

Código: C++
  1. if(!input(pin_A4))
  2. {
  3. if(!input(pin_A4))
  4. {
  5. delay_ms(10);
  6. Email_Now();
  7. while(!input(pin_A4))
  8. delay_ms(2000);
  9. }
  10. }

Mi pregunta es, que razón tiene ese doble if?.


Título: Re:PIC18F46K22 y problema raro del ADC
Publicado por: Nocturno en 16 de Abril de 2022, 11:53:47
Yo diría que no tiene ningún sentido duplicarlo
Título: Re:PIC18F46K22 y problema raro del ADC
Publicado por: mariacontenis en 16 de Abril de 2022, 11:55:08
Ok. Gracias Sr. Nocturno.
Título: Re:PIC18F46K22 y problema raro del ADC
Publicado por: dogflu66 en 30 de Abril de 2022, 06:37:42
Eso se usa cuando puedes tener una transición muy rápida y quieres estar seguro que la señal estuvo activa un tiempo mínimo.
Es un recurso muy utilizado porque evitas colocar código más complicado.

A eso yo le llamo código redundante necesario.  :mrgreen:
Título: Re:PIC18F46K22 y problema raro del ADC
Publicado por: dogflu66 en 30 de Abril de 2022, 06:57:50
Volviendo al tema anterior de la entrada ADC, las entradas cmos no se pueden dejar al aire, es una regla básica. Tienen que estar polarizadas ya sea por el circuito externo que le conectes, o por un circuito propio de acople, ya sea una simple resistencia, red rc, etc, como bien te indica el amigo forero.

El tema de que un micro te haga lectura o no es por la familia o serie a la que pertenece, por eso hay tantos para elegir según la aplicación. Yo uso desde hace años el Pic18F46K22 y para mis aplicaciones es el idóneo. Este es un micro mejorado que tiene alta impedancia de entrada y por eso te mide cualquier estática del ambiente o cableado cercano, mientras que el otro su impedancia de entrada es muy inferior y no se ve afectado tan directamente. Tanto el uno como el otro tienen su razón de ser.
Título: Re:PIC18F46K22 y problema raro del ADC
Publicado por: Nocturno en 30 de Abril de 2022, 13:13:54
Eso se usa cuando puedes tener una transición muy rápida y quieres estar seguro que la señal estuvo activa un tiempo mínimo.
Es un recurso muy utilizado porque evitas colocar código más complicado.

A eso yo le llamo código redundante necesario.  :mrgreen:
Pero tendría sentido si tuviera un delay de algún tipo; al no tenerlo he descartado que busquen esa redundancia con tiempo mínimo.
Título: Re:PIC18F46K22 y problema raro del ADC
Publicado por: DominusDRR en 30 de Abril de 2022, 16:09:15
Eso se usa cuando puedes tener una transición muy rápida y quieres estar seguro que la señal estuvo activa un tiempo mínimo.
Es un recurso muy utilizado porque evitas colocar código más complicado.

A eso yo le llamo código redundante necesario.  :mrgreen:

¿Pero cómo evitas que el compilador lo optimice?

Porque si haces eso, un buen compilador determina la redundancia y lo simplifica a un sólo if.

Al menos que trabajes sin optimizaciones de código y/o sea un pésimo compilador.

Y eso que indicas de una transición rápida, hay otras maneras de determinar si realmente esta activa presente un mínimo de tiempo.
Título: Re:PIC18F46K22 y problema raro del ADC
Publicado por: dogflu66 en 01 de Mayo de 2022, 07:04:48
Pues eso Manolo; si quieres más tiempo insertas delay del tipo que sea y vuelves ha hacer la comprobación. Todo es cuestión de la aplicación.  :roll:

Tengo algunos automatismos funcionando en las que las salidas activan reles y dependen de alguna entrada, estas entradas están asociadas a funciones que cuentan el tiempo por interrupciones, como es normal para no entorpecer el buen flujo del programa. Pero esto lo uso para tiempos largos, para tiempos mínimos uso esos recursos.

Título: Re:PIC18F46K22 y problema raro del ADC
Publicado por: dogflu66 en 01 de Mayo de 2022, 07:18:22
Eso se usa cuando puedes tener una transición muy rápida y quieres estar seguro que la señal estuvo activa un tiempo mínimo.
Es un recurso muy utilizado porque evitas colocar código más complicado.

A eso yo le llamo código redundante necesario.  :mrgreen:

¿Pero cómo evitas que el compilador lo optimice?

Porque si haces eso, un buen compilador determina la redundancia y lo simplifica a un sólo if.

Al menos que trabajes sin optimizaciones de código y/o sea un pésimo compilador.

Y eso que indicas de una transición rápida, hay otras maneras de determinar si realmente esta activa presente un mínimo de tiempo.

Bueno, te entiendo; en mí caso que el compilador me cambie el código no es una buena opción.
Yo realizo pequeños y medianos automatismos desde hace mucho pero muchos años, y si no cuento las librerías propias mi código principal no suele ocupar más de varios cientos de líneas. Que el compilador avise de algo redundante esta bien, y lo suprimiré según me interesa o no.

PD: De todas formas si colocas algo entre los dos IF, como una operación de no hagas nada durante un ciclo de reloj, tu compilador debería compilar ese tipo de código.
Título: Re:PIC18F46K22 y problema raro del ADC
Publicado por: DominusDRR en 01 de Mayo de 2022, 10:19:13
PD: De todas formas si colocas algo entre los dos IF, como una operación de no hagas nada durante un ciclo de reloj, tu compilador debería compilar ese tipo de código.



Obviamente, si pones algo entre los dos if como una instrucción NOP o un delay, el compilador mantendrá los dos if por separado, pero como indicó el OP, ni con la optimización en el nivel más bajo, pienso que se mantendrá por redundancia.  Sería de analizar el ensamblador para determinar si ocurre eso o no.