Implementación de tarjeta para adquisición de datos con PIC

#1
Buenos Dias amigos espero esten todos muy Bien y de antemano muchas gracias por el apoyo que me puedan dar.
El siguiente tema habla de mi proyecto de grado y se trata del diseño e implementacion de una tarjeta electronica para la adquisicion de datos con pic 16f877a al cual pienso programar con lenguaje ensamblador y la vez establecer comunicacion con la pc a traves del bus serial rs232 ya que supongo que seria el adecuado y esta pc tendra instalado el programa labview para asi poder controlar una planta de procesos en donde interactuan las variables basicas de instrumentacion industrial como son: presion, nivel, temperatura y caudal o flujo .
por ahora estoy solo en las especificaciones tecnicas de los componentes a utilizar .. actualmente cuento con el pic 16f877a, este pic tiene la capacidad de manejar solo dos salidas analogicas y es alli donde tengo el inconveniente, ya que nesesito 4 salidas analogicas para controlar el proceso " tengo 4 valvulas automaticas" , he leido que se pueden acoplar modulos pwm a cualquier tipo de pic y al parecer es la unica manera de obtener mis 4 salidas analogicas. no estoy muy claro de como implementar esto en mi pic pero estoy investigandolo, si alguien tiene informacion de ello por favor. y la pregunta del millon alguno de ustedes ha podido intercomunicar dos microcontroladores con finalidad de ampliar las salidas o entradas.. porque esa seria otra opcion para obtener mis cuatro salidas analogicas, es decir unificar dos microcontroladores 16f877a en una misma tarjeta electronica y asi sumar sus salidas analogicas . 2 de uno y 2 de otro dando un total de 4 salidas analogicas. espero puedan ayudarme y muchas gracias saludos.
 
#4
Fogonazo
muchas gracias por su atención .. la multiplexacion para la unificacion de los pic suena logico.. voy a analizar esa parte para ver que puedo encontrar ... es decir ver si no me afecta el programa , debido a que no quiero que al haber ese cambio me inhabilite uno de los micro. si sucede esto ultimo me afectara el proceso que este manejando determinado pic .. buenoo es lo que a mi parecer sucederia .. pero bueno por eso estoy aqui para que ayuden aclarando dudas y decirme si estoy equivocado en ciertas cosas
------- Mensaje actualizado: -------

JoaquinFerrero
asi es .. pero resulta que en primer lugar ya compre el pic 16f877a .. el cual cuenta con 40 pines y tambien adquiri el quedador de pic el cual tiene una capacidad maxima de 40 pines .. el otro pic que me puede manejar mayor cantidad de salidas analogicas es de 56 pines y ademas es de tipo smd .. esta fuera de mi alcance.

ahoraa.pregunto.. el puerto A del pic solo puede ser usado como entrada analogica o tambien puedo usarlo como salida analogica ? estuve leyendo en una pagina y segun dice que pueden ser usado como salidas pero no estoy muy seguro de ello .. lo que si estoy seguro es que puedo usar los pines 16 y 17 (CCP1 Y CCP2) respectivamente como salidas pmw .. alli tengo 2 salidas analogicas seguras pero me harian falta otras 2 y aun noc si puedo agarrarlas del puerto A. DEJO ADJUNTO EL DATASHEET DEL PIC PARA QUE lo visualizen.
 

Adjuntos

#5
La hoja de datos tiene 218 páginas, no es un gif ;)

Los pines 16 y 17 no son salidas analógicas. Son salidas PWM (modulación por ancho de pulsos). Según tu aplicación, te servirá o no.
 
#6
JoaquinFerrero
podrias aclararme algo por favor.. lo primero es: si con las salidas PWM puedo regular un voltaje de 0 a 5 v, porque no podria ser salidas analogicas, en pocas palabras que diferencia hay entre salidas analogicas y salidas PWM ? y la otra pregunta es : el puerto A del pic a estudiar podria ser utilizado como salidas analogicas ? es decir los pines que conforman el puerto A... Y gracias por tu atencion.

la unica manera de utilizar una salida analogica con el pic 16f877a es utilizando los 8 bits de un puerto ? esoo reduce su capacidad .. sera que existe algo asi como un multiplicador de voltaje para poder utilizar las salidas PWM como salidas analogicas ? ya que estas trabajan de 0 a 5 volts y si le aplico un multiplicador ya seria de 0 a 10v . obviamente seran con menos resolucion pero puede simular algo parecido supongo. y me serviria asi porque el proyecto iria para el laboratorio de la universidad, es decir no nesesito tanta presicion ..
 
#7
buenos dias muchachos espero esten bien .. y gracias por la ayuda les digo que ya no nesesito 4 salidas analogicas ya que al analizar bien el caso .. me percato de que unicamente nesesitare dos salidas analogicas .. las razones son las siguientes .. para el control de nivel, presion y tempreatura me es suficiente con analizar la señal de los sensores y activar salidas digitales al estar por debajo del set point mientras que con el caudal si requiero de salida analogica como tal y en este caso poseo dos valvulas reguladoras de caudal .. " nesesito 2 salidas analogicas " creen que pueda obtenerlas de este pic 16f877a ?
 
#8
Se puede regular... si el receptor admite una cierta ondulación de la señal. Es decir, si quieres sacar 3.3 V, obtendrás 3.3 ± 0.1 V en una señal con picos u ondulante. Quizás tengas que filtrarlo para evitarlos.

El puerto A del PIC16F877A consta de 6 líneas (página 30 de la hoja de datos). Todas ellas pueden funcionar como entradas y salidas digitales. Las marcadas con AN[0:4] son entradas analógicas (solo entradas).

En teoría, cualquier pin digital se podría convertir en PWM, por medio de programación, pero el PIC poco más podría hacer que sacar una señal cuadrada. Es mucho mejor usar los circuitos PWM del propio chip.

Sí que puedes usar un puerto de 8 bits digitales si pones en medio un conversor A/D (otro circuito o un array de resistencias, todo depende de la resolución que necesites).
 
#9
Te recomiendo que utilices un DAC... 2 MCP4921 o un MCP4922... ahí vas a tener las 2 salidas analógicas que necesitas, y si lo requieres puedes agregar mas, trabajando con una resolución de 12 bits por protocolo SPI... yo los he utilizado y tienen un excelente desempeño, creo que para tu aplicación será mas que suficiente...

Espero te ayude...

saludos
 
#10
Hola...Ese tipo de PIC no tiene ninguna salida Analogica pura, se puede conformar mediante un filtro a la salida de un PWM y tener una salida analógica de 0 a 5Vdc desde el harware del PIC o desde software en cualquier pin.

Como esta mostrada en la imagen que subiste y en ese caso en especial todos los pines de los puertos pueden ser usados como entradas o salidas digitales y solo algunos con los periféricos que ya trae el hardware posicionado en alguno de los pines.

Generalmente se trata de elegir los sensores o interfaces de forma que no sea necesario el uso de de señales analógicas.

Aunque mas simples de usar, estas son mas susceptibles a interferencias y tienes la limitación de la precisión y estabilidad de los conversores ADC del propio PIC que en algunos casos y para algunas aplicaciones no es suficiente.

Saludos.

Ric.
 
#11
Se puede regular... si el receptor admite una cierta ondulación de la señal. Es decir, si quieres sacar 3.3 V, obtendrás 3.3 ± 0.1 V en una señal con picos u ondulante. Quizás tengas que filtrarlo para evitarlos.

El puerto A del PIC16F877A consta de 6 líneas (página 30 de la hoja de datos). Todas ellas pueden funcionar como entradas y salidas digitales. Las marcadas con AN[0:4] son entradas analógicas (solo entradas).

En teoría, cualquier pin digital se podría convertir en PWM, por medio de programación, pero el PIC poco más podría hacer que sacar una señal cuadrada. Es mucho mejor usar los circuitos PWM del propio chip.

Sí que puedes usar un puerto de 8 bits digitales si pones en medio un conversor A/D (otro circuito o un array de resistencias, todo depende de la resolución que necesites).
cuando dices " se puede regular " a que se refiere exactamente .. me perdi por ahi.. y buenoo la tarjeta de adquisicion de datos que estoy tratando de diseñar es para el laboratorio de la universidad. por lo tanto no requiero de tanta presicion, es mas que todo para que los estudiantes se familiarizen un poco con el control de procesos a traves del sistema scada ( programa de labview).

gracias por aclararame lo de los pines del puerto A. pasa que a veces alteran la informacion tecnica por internet y me habia topado con una que decia que podrian utilizarse como salidas analogicas y no parecia seguro.

crees que pueda aplicar un multiplicador de voltaje a las salidas PWN ? porque ellas manejan de 0 a 5 volts y nesesito es de 0 a 10v ..
------- Mensaje actualizado: -------

Te recomiendo que utilices un DAC... 2 MCP4921 o un MCP4922... ahí vas a tener las 2 salidas analógicas que necesitas, y si lo requieres puedes agregar mas, trabajando con una resolución de 12 bits por protocolo SPI... yo los he utilizado y tienen un excelente desempeño, creo que para tu aplicación será mas que suficiente...

Espero te ayude...

saludos
y crees que al implementar estos ic no me afecta la programacion ? porque todo esto lo debo reflejar en la interface de labview ...
------- Mensaje actualizado: -------

Hola...Ese tipo de PIC no tiene ninguna salida Analogica pura, se puede conformar mediante un filtro a la salida de un PWM y tener una salida analógica de 0 a 5Vdc desde el harware del PIC o desde software en cualquier pin.

Como esta mostrada en la imagen que subiste y en ese caso en especial todos los pines de los puertos pueden ser usados como entradas o salidas digitales y solo algunos con los periféricos que ya trae el hardware posicionado en alguno de los pines.

Generalmente se trata de elegir los sensores o interfaces de forma que no sea necesario el uso de de señales analógicas.

Aunque mas simples de usar, estas son mas susceptibles a interferencias y tienes la limitación de la precisión y estabilidad de los conversores ADC del propio PIC que en algunos casos y para algunas aplicaciones no es suficiente.

Saludos.

Ric.
asii es gracias por eso .. lo ideal es no usar mucho las señales analogicas y manejar esas variables traves de una interfaz grafica ... es una muy buena justificacion .. mas sin embargo debo implementarlo asi para la demostracion.
y buenoo si voy a utilizar la salida PWM debo buscar la manera de llevarlo al rango de 0 a 10 .. porque las señales analogicas trabajan en ese rango ( 4 a 20mA o 0 a 10volts) .. creen que pueda llevarse a ese rango sin afectar al pic, es decir sin forzar su salida ?
 
Última edición:
#12
..
[/automerge].....

asii es gracias por eso .. lo ideal es no usar mucho las señales analogicas y manejar esas variables traves de una interfaz grafica ... es una muy buena justificacion .. mas sin embargo debo implementarlo asi para la demostracion.
y buenoo si voy a utilizar la salida PWM debo buscar la manera de llevarlo al rango de 0 a 10 .. porque las señales analogicas trabajan en ese rango ( 4 a 20mA o 0 a 10volts) .. creen que pueda llevarse a ese rango sin afectar al pic, es decir sin forzar su salida ?
Con al interfaz adecuada se puede hacer/adaptar niveles sin problemas.
No ando en el tema de control industrial pero creo que haber visto placas adaptadoras para PIC/Arduino de 4-20mA, etc de origen asiatico.
De todas formas el programador de PIC PicKit2 de Microchip usa una de las salidas PWM del PIC 18F2550 y mediante una inductancia, un transistor fet y un diodo rapido eleva los 5Vdc del puerto USB a los 13Vdc necesarios para programar los PIC en su pin de VPP. Controla el mismo mediante un converso de nivel resistivo y una de las entrada ADC del mismo.
El mismo esta amplia mente difundido y su codigo es abierto.
Te adjunto una imagen del esquemático para que veas de lo que hablo(aunque ya hay todo un hilo en el foro que lo trata en profundidad una versión Clon.
 

Adjuntos

#13
De todas formas el programador de PIC PicKit2 de Microchip usa una de las salidas PWM del PIC 18F2550 y mediante una inductancia, un transistor fet y un diodo rápido eleva los 5Vdc del puerto USB a los 13Vdc necesarios para programar los PIC en su pin de VPP. Controla el mismo mediante un converso de nivel resistivo y una de las entrada ADC del mismo.
Ese tipo de fuente de poder se llama Boost Converter (Elevador) y es ampliamente usado actualmente en varios dispositivos.
En el anexo AN1138 de Microchip se explica el funcionamiento de una fuente Buck (Reductor) que, invirtiendo los componentes y modificando el código, se puede pasar a Boost. (El sistema usa el algoritmo PI - Proporcional, Integral, no el PID - Proporcional, Integral, Derivativo)

También se puede implementar la forma clásica: PWM, ADC, Rectificador y filtro con su respectiva etapa de potencia, y tomar un voltaje más alto para ser regulado.
 
#14
Con al interfaz adecuada se puede hacer/adaptar niveles sin problemas.
No ando en el tema de control industrial pero creo que haber visto placas adaptadoras para PIC/Arduino de 4-20mA, etc de origen asiatico.
De todas formas el programador de PIC PicKit2 de Microchip usa una de las salidas PWM del PIC 18F2550 y mediante una inductancia, un transistor fet y un diodo rapido eleva los 5Vdc del puerto USB a los 13Vdc necesarios para programar los PIC en su pin de VPP. Controla el mismo mediante un converso de nivel resistivo y una de las entrada ADC del mismo.
El mismo esta amplia mente difundido y su codigo es abierto.
Te adjunto una imagen del esquemático para que veas de lo que hablo(aunque ya hay todo un hilo en el foro que lo trata en profundidad una versión Clon.
OKK AMIGOSS MUCHAS GRACIAS estoy trabajando en ello los mantendre informados.. interesante aplicación cualquier inquietud no dudare en preguntar ..
 
#15
BUENOS dias señores..como les va .. por aqui me encuentro de vuelta para continuar con el diseño de la tarjeta de adq de datos ..
para refrescar y actualizar la informacion les cuento que estoy trabajando con un pic 16f877a, estoy utilizando lenguaje c porque el ensamblador se me hacia algoo complicado. lo que nesesito es desarrollar una tarjeta de adquisicion de datos, la cual estara interconectada a la pc a traves de puerto serial RS232 y esto a su vez trabajara por medio de la inerfaz del programa labview, para controlar las diferentes variables fisicas como lo son (presion, nivel, temperatura y caudal) , nesesito habilitar al menos 4 entradas analogicas del pic y desarrollar una salida analogica que con una resolucion de 8 bits me es suficiente, esta salida analogica la utilizara para controlar una valvula automatica reguladora de caudal . por otra parte las variables de presion, nivel y temperatura las controlare a travez de salidas digitales por ser acciones on-off.
he desarrollado parte del codigo para la lectura de 3 señales analogicas con sus selectores de variables y el programa corre muy bien pero a la hora de simularlo solo la variable de presion es la que me indica los valores correctos gradualmente, mientras que los de nivel y temperatura no o hacen ,
he notado que el problema esta en el circuito pues los voltajes que salen de los potenciometros simuladores de nivel y temperatura no llegan a 5 volts y no entiendoo porque dejare adjunto el codigo en lenguaje c y el circuito en proteus para ver si lo pueden chequear y sacarme de esta duda .. espero sus respuestas saludos colegas.
------- Mensaje actualizado: -------

aqui dejo el codigoo porque no puedo subirlo en su respectivo formato .. les digo que tanto la entrada AN0 Y AN1 me envian sus valores de 0 a 100 pero la entrada AN2 no lo esta haciendo ya que siempre su valor se mantiene en 0 por mas que lo varie

alguien sabe como puedo adjuntar el archivo de proteus ?


#include <16f877a.h>
#device adc=8
#fuses xt,nowdt,noprotect
#use delay (clock=4M)
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,parity=n,bits=8)

void main()
{
set_tris_b(0b11111111);
int comando;
int nivel;
int presion;
int temperatura;
long valor= 0;
setup_adc_ports(ALL_ANALOG);
setup_adc(adc_clock_internal);
set_tris_a(1);


while (true)
{
comando=input_b();

if (comando==0x06)
{
set_adc_channel(0);
valor=read_adc();
presion= (valor*100)/255;
printf(" Su presion es psi : ");
printf("%u\r\n",presion);
delay_ms(1000);
}
if (comando==0x05)
{
set_adc_channel(1);
valor=read_adc();
nivel= (valor*100)/255;
printf(" Su nivel es litros : ");
printf("%u\r\n",nivel);
delay_ms(1000);
}
if (comando==0x03)
{
set_adc_channel(2);
valor=read_adc();
nivel= (valor*100)/255;
printf(" Su temperatura es C : ");
printf("%u\r\n",temperatura);
delay_ms(1000);
}

}
}
------- Mensaje actualizado: -------

Se puede regular... si el receptor admite una cierta ondulación de la señal. Es decir, si quieres sacar 3.3 V, obtendrás 3.3 ± 0.1 V en una señal con picos u ondulante. Quizás tengas que filtrarlo para evitarlos.

El puerto A del PIC16F877A consta de 6 líneas (página 30 de la hoja de datos). Todas ellas pueden funcionar como entradas y salidas digitales. Las marcadas con AN[0:4] son entradas analógicas (solo entradas).

En teoría, cualquier pin digital se podría convertir en PWM, por medio de programación, pero el PIC poco más podría hacer que sacar una señal cuadrada. Es mucho mejor usar los circuitos PWM del propio chip.

Sí que puedes usar un puerto de 8 bits digitales si pones en medio un conversor A/D (otro circuito o un array de resistencias, todo depende de la resolución que necesites).
buen dia joaquin como le va ... bueno la salida analogica la hare para el final por ahora quiero sacar lecturas de diversas señales analogicas que lleguen a este mismo pic.. y hacer control por medio de sus salidas digitales estableciendo un set point a cada variable .
------- Mensaje actualizado: -------

BUENOS dias señores..como les va .. por aqui me encuentro de vuelta para continuar con el diseño de la tarjeta de adq de datos ..
para refrescar y actualizar la informacion les cuento que estoy trabajando con un pic 16f877a, estoy utilizando lenguaje c porque el ensamblador se me hacia algoo complicado. lo que nesesito es desarrollar una tarjeta de adquisicion de datos, la cual estara interconectada a la pc a traves de puerto serial RS232 y esto a su vez trabajara por medio de la inerfaz del programa labview, para controlar las diferentes variables fisicas como lo son (presion, nivel, temperatura y caudal) , nesesito habilitar al menos 4 entradas analogicas del pic y desarrollar una salida analogica que con una resolucion de 8 bits me es suficiente, esta salida analogica la utilizara para controlar una valvula automatica reguladora de caudal . por otra parte las variables de presion, nivel y temperatura las controlare a travez de salidas digitales por ser acciones on-off.
he desarrollado parte del codigo para la lectura de 3 señales analogicas con sus selectores de variables y el programa corre muy bien pero a la hora de simularlo solo la variable de presion es la que me indica los valores correctos gradualmente, mientras que los de nivel y temperatura no o hacen ,
he notado que el problema esta en el circuito pues los voltajes que salen de los potenciometros simuladores de nivel y temperatura no llegan a 5 volts y no entiendoo porque dejare adjunto el codigo en lenguaje c y el circuito en proteus para ver si lo pueden chequear y sacarme de esta duda .. espero sus respuestas saludos colegas.
------- Mensaje actualizado: -------

aqui dejo el codigoo porque no puedo subirlo en su respectivo formato .. les digo que tanto la entrada AN0 Y AN1 me envian sus valores de 0 a 100 pero la entrada AN2 no lo esta haciendo ya que siempre su valor se mantiene en 0 por mas que lo varie

alguien sabe como puedo adjuntar el archivo de proteus ?


#include <16f877a.h>
#device adc=8
#fuses xt,nowdt,noprotect
#use delay (clock=4M)
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,parity=n,bits=8)

void main()
{
set_tris_b(0b11111111);
int comando;
int nivel;
int presion;
int temperatura;
long valor= 0;
setup_adc_ports(ALL_ANALOG);
setup_adc(adc_clock_internal);
set_tris_a(1);


while (true)
{
comando=input_b();

if (comando==0x06)
{
set_adc_channel(0);
valor=read_adc();
presion= (valor*100)/255;
printf(" Su presion es psi : ");
printf("%u\r\n",presion);
delay_ms(1000);
}
if (comando==0x05)
{
set_adc_channel(1);
valor=read_adc();
nivel= (valor*100)/255;
printf(" Su nivel es litros : ");
printf("%u\r\n",nivel);
delay_ms(1000);
}
if (comando==0x03)
{
set_adc_channel(2);
valor=read_adc();
nivel= (valor*100)/255;
printf(" Su temperatura es C : ");
printf("%u\r\n",temperatura);
delay_ms(1000);
}

}
}
------- Mensaje actualizado: -------


buen dia joaquin como le va ... bueno la salida analogica la hare para el final por ahora quiero sacar lecturas de diversas señales analogicas que lleguen a este mismo pic.. y hacer control por medio de sus salidas digitales estableciendo un set point a cada variable .
es para ir haciendo el proyecto por parte e ir llevando los avances a la universidad.
 
Última edición:
#17
este es el circuito en proteus .. como pueden observar las tres variables varian menos la de temperatura .. noc si se pueda ver la imagen del circuito
------- Mensaje actualizado: -------

Comprimes el archivo de Proteus con WinRAR o WinZip y lo subes al Foro[/QUOTmuchas gracias ahora si aqui lo dejo adjunto tanto el codigo en c como el circuito en proteus..
------- Mensaje actualizado: -------

este es el circuito en proteus .. como pueden observar las tres variables varian menos la de temperatura .. noc si se pueda ver la imagen del circuito
------- Mensaje actualizado: -------
observen que al variar los potenciometros de nivel o de temperatura .. , el cambio de voltaje no es gradual... y esto tambien me genera un error de lectura.. mientras que el de presion si me regula correctamente el voltaje. la verdad no entiendo porque pasa esto si los potenciometros estan conectados a la misma fuente y son del mismo valor
------- Mensaje actualizado: -------

aqui tengo el circuito con fuentes independientes y me hace lo mismo
 

Adjuntos

Última edición:
#18
como pueden observar las tres variables varían menos la de temperatura
Porque la variable "temperatura" nunca está adquiriendo datos.
La variable que está adquiriendo datos es "nivel"

Otro detalle:
Con set_tris_a(1); se está estableciendo RA1 como entrada y el resto como salidas. Elimina esa instrucción.
set_tris_b(0b11111111); establece todo el puerto B como entradas, y por defecto todos los puertos están configurados como entradas, así que esa instrucción está de sobra.
 
#19
Porque la variable "temperatura" nunca está adquiriendo datos.
La variable que está adquiriendo datos es "nivel"

Otro detalle:
Con set_tris_a(1); se está estableciendo RA1 como entrada y el resto como salidas. Elimina esa instrucción.
cierto set_tris_a(1) no me percate de eso lo que pasa es que inicialmente la habia utilizado para una sola señal analogica .

porque dices que la variable temp no esta adquiriendo datos ?

if (comando==0x03)
{
set_adc_channel(2);
valor=read_adc();
nivel= (valor*100)/255;
printf(" Su temperatura es C : ");
printf("%u\r\n",temperatura);
delay_ms(1000);

alli le estoy indicando que tome los valores del puerto AN2 no es asi ?
------- Mensaje actualizado: -------

Porque la variable "temperatura" nunca está adquiriendo datos.
La variable que está adquiriendo datos es "nivel"

Otro detalle:
Con set_tris_a(1); se está estableciendo RA1 como entrada y el resto como salidas. Elimina esa instrucción.
set_tris_b(0b11111111); establece todo el puerto B como entradas, y por defecto todos los puertos están configurados como entradas, así que esa instrucción está de sobra.
listooo ya loo vii en vez temperatura habia colocado nivell ..
 

Arriba