TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: santivillalba1979 en 23 de Abril de 2020, 13:44:14

Título: Duda interrupción varios canales ADC
Publicado por: santivillalba1979 en 23 de Abril de 2020, 13:44:14
Buenas, soy nuevo en el foro!
Soy nuevo en este mundo del PIC, siempre programé sobre una placa embebida con un micro de NXP (LPC4337).
Busqué por todo internet, y no encontré una solución a mi problema.
Les comento, estoy tratando de hacer un regulador para cargar baterías por medio de paneles solares, usando un algoritmo de seguimiento de máximo punto de potencia. Básicamente lo que hago es sensar magnitudes (tension y corriente), y en base a los valores de estas, varío el ciclo de actividad del PWM, para el convertidor BOOST.
Estoy usando el CCS Compiler y el Proteus para debuggear los códigos. En un principio la idea era hacerlo con RTOS, pero después me incliné por hacerlo con máquinas de estados, para empezar con algo más sencillo. Básicamente, lo que hago es habilitar las interrupciones, las cuales definen las transiciones entre estados. El pic que voy a utilizar, va a ser uno sencillo, para empezar (para bajar al máximo el costo). Empecé las pruebas con el PIC 16f628a y con el 16f877a.
Logré entender la parte de PWM gracias a varias páginas. Y ahora estoy tratando de entender cómo funciona el ADC. Me surgen dos dudas en este punto:
1) Las sentencias que uso para configurar el ADC son
     - setup_adc_ports(ANO_AN1_AN3). Así configuro los canales que voy a utilizar, siendo 0, 1 y 3, entradas analógicas, no?
     - setup_adc(ADC_CLOCK_INTERNAL). Tiempo de conversión del ADC.
     ¿Es posible setear la frecuencia de muestreo? Bajarla al mínimo, no necesito una alta latencia, únicamente con tener
     valores cada cierto período espaciado de tiempo, me sobra.
2) El handler de interrupción del ADC.
    #int_AD
     AD_isr() {
       /*HABILITAR CANAL Y LEER*/
       set_adc_channel (EL QUE VAYA);
        VALOR= adc_read();
}

La duda GRAVE acá es, ¿cómo hago con los 3 canales? ¿Existe alguna manera de que la interrupción se produzca cuando tengo los 3 valores disponibles? Por lo que leí de la hoja de datos, los ADC de estos PICs tiene un solo circuito de conversión, por lo que hace un canal por vez. Por lo que vi, en estos PICs tampoco existen los mecanismos del tipo DMA, lo cual ayudaría bastante.
Lo que yo quiero es que la interrupción salte cuando se complete la conversión de los 3 canales. No me sirve usar un sub índice global, que se modifique por cada interrupción del ADC. O sea, si yo interrumpo una vez, aumento el índice y después leo otro canal haciendo uso del mismo, sería una solución. Pero a mi no me sirve, porque estaría comparando dos valores de corriente y tensión (valores que muestreo) de dos instantes de tiempo "distintos", debido a que en el medio entre interrupción e interrupción del ADC, hay otras interrupciones de otros dispositivos.
Capaz que tengo un mal concepto, y la interrupción salta cuando están los 3 canales listos, y sólo tengo que setear el canal y leer cada uno, todo en el mismo handler. En fin, me gustaría que me ayuden un poco con estos dos puntos en los que flaqueo.
Muchas gracias.
Título: Re:Duda interrupción varios canales ADC
Publicado por: KILLERJC en 23 de Abril de 2020, 14:29:32
Si queres saber como funcionan realmente los microcontroladores te sugiero que siempre busques el datasheet o el reference manual (segun fabricante)

Citar
El pic que voy a utilizar, va a ser uno sencillo, para empezar (para bajar al máximo el costo). Empecé las pruebas con el PIC 16f628a y con el 16f877a.

Ahi es donde te equivocas, esos micros ya son bastante viejitos, y hay muchos mas nuevos que salen mucho menos y con mas prestaciones.

Citar
setup_adc_ports(AN0_AN1_AN3)

Los pines pueden ser setear como digitales y analogicos, algunos micros poseen la libertad de elegir de forma independiente cual entrada es analogica o digital, otros no.Por ejemplo el PIC16F877A:

https://ww1.microchip.com/downloads/en/devicedoc/39582b.pdf  (Pag. 128 del documento o 130 del PDF)
Tenes una tabla, donde podes ver todas las opciones de poner a digital o analogico, como ves no todas las combinaciones son posibles.

Otros micros permiten su seleccion individual.

Citar
setup_adc(ADC_CLOCK_INTERNAL). Tiempo de conversión del ADC.

No, eso gobierna el reloj del ADC. El ADC no convierte en un solo ciclo, sino que se toma unos cuantos.. 12 exactamente. En el datasheet que te pase. Pagina 132 del documento podes ver un diagrama de los tiempos del ADC.

Correctamente seria asi:
- Seleccionas el canal, y el capacitor empieza a cargarse, si tenes una carga grande en la entrada del ADC entonces tenes que esperar antes de iniciar la conversion, debido a que necesitas espera que el capacitor llegue al voltaje correcto, si no es demasiada la carga entonces no hay problema. Este tiempo se conoce como Tiempo de Adquisicion, este PIC solo tiene un solo ciclo
- Envias a convertir, se desconecta la entrada y se usa la tension del capacitor para la medida, 1 bit a la vez.

Algunos PICs mas avanzados poseen Tiempo de Adquisicion configurables, asi que cuando le das a convertir, solo se toman ciertos ciclos antes de desconectar y comenzar a convertir.

Citar
¿Es posible setear la frecuencia de muestreo? Bajarla al mínimo, no necesito una alta latencia, únicamente con tener

Si... en realidad la frecuencia de muestreo las das vos... si lo haces apenas termina el ADC de convertir el otro entonces es la velocidad del ADC quien rige el muestreo.. Pero podrias tranquilamente usar un Timer que cada tanto active el ADC, luego en la interrupcion del ADC guardaras el dato..

Citar
La duda GRAVE acá es, ¿cómo hago con los 3 canales? ¿Existe alguna manera de que la interrupción se produzca cuando tengo los 3 valores disponibles? Por lo que leí de la hoja de datos, los ADC de estos PICs tiene un solo circuito de conversión, por lo que hace un canal por vez. Por lo que vi, en estos PICs tampoco existen los mecanismos del tipo DMA, lo cual ayudaría bastante.

Varias preguntas, lo voy a responder en orden:

Varias formas de solucionar lo de los 3 canales, pero principalmente: contarlos.... Si usas el Timer arriba como te comente, entonces que la primer entrada convierta el canal 0, luego el 1, luego el 2 y ahi entregue los datos o ejecute lo que vos quieras... Y vuelva a comenzar.
Si lo haces con la interrupcion del ADC entonces es lo mismo.

No, no tienen FIFO estos PICs en el ADC.

No, los PIC16 no tienen DMA, CREO que la gama de PIC24 y dsPIC ya comienzan a tener DMA. Y algunos PIC18 tambien... como:
http://ww1.microchip.com/downloads/en/DeviceDoc/PIC18LF24-25K42-Data-Sheet-40001869D.pdf

Citar
Lo que yo quiero es que la interrupción salte cuando se complete la conversión de los 3 canales. No me sirve usar un sub índice global, que se modifique por cada interrupción del ADC. O sea, si yo interrumpo una vez, aumento el índice y después leo otro canal haciendo uso del mismo, sería una solución. Pero a mi no me sirve, porque estaría comparando dos valores de corriente y tensión (valores que muestreo) de dos instantes de tiempo "distintos", debido a que en el medio entre interrupción e interrupción del ADC, hay otras interrupciones de otros dispositivos.
Capaz que tengo un mal concepto, y la interrupción salta cuando están los 3 canales listos, y sólo tengo que setear el canal y leer cada uno, todo en el mismo handler. En fin, me gustaría que me ayuden un poco con estos dos puntos en los que flaqueo.
Muchas gracias.

Entonces cometiste un error. El comenzar con esos microcontroladores antes de definir los requerimientos del proyecto.

Los unicos que conozco de los Microchip que pueden realizar lo que comentas son dsPIC y no se si algun PIC24 (ya que son muy parecido)
Los dsPIC tienen la posibilidad no solo de realizar un scan de canales, sino que ademas pueden realizar un sampling de varios canales y luego convertirlos uno por uno.

http://ww1.microchip.com/downloads/en/devicedoc/70183d.pdf  (Pag. 69 tenes una version un poco mas grafica)
Ojo que el documento del ADC de los dsPIC es general!

Estos PICs solo tiene 1 ADC, hay algunos que poseen 2 ADC, tambien tienen DMA.

Podes usar esta herramienta para encontrar lo que te parezca razonable:
https://www.microchip.com/maps/Microcontroller.aspx

PD: Es media lenta..