...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)....
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 bitsCódigo: C++
#device adc=10
y los fuses asi:Código: C++
#fuses HSH,NOPLLEN,PRIMARY_ON,NOWDT,PUT,NOBROWNOUT,NOPBADEN,MCLR,PROTECT,NOLVP,NOSTVREN,NODEBUG
a 20 Mhz con un crystal fisicop externo de 20MhzCódigo: C++
#use delay(clock=20000000, crystal=20000000)
dentro del el main:Código: C++
setup_adc_ports (sAN0 | VSS_VDD); // setup_adc_ports (sAN0 | VSS_VDD); para 18f46k22 setup_adc(ADC_CLOCK_INTERNAL | ADC_TAD_MUL_0); 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.
En general esto no tiene importancia porque normalmente esa entrada debe ir conectada
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?.
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.
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)
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:
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.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.
Es un recurso muy utilizado porque evitas colocar código más complicado.
A eso yo le llamo código redundante necesario. :mrgreen:
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:
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.
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.