Autor Tema: 4-20mA Current Loop (SOLUCIÓN AD420)  (Leído 10982 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
4-20mA Current Loop (SOLUCIÓN AD420)
« en: 01 de Febrero de 2008, 08:48:29 »
Hola amigos,

Tengo que diseñar un transmisor de 4-20mA con dos canales. Mi idea es utilizar un PIC16F para capturar las medidas de los sensores y luego un conversor a 4-20mA para enviar la inforamción.

He visto algunos conversores como el AD420 que funcionan con SPI y con una resolución de 16bits para el rango de 4 a 20mA. El problema es que necesitaría 2 SPI, uno por canal, o un multiplexor que pueda trabajar a la velocidad del SPI y que no sea muy armatoste.

Por otro lado también he visto algunos conversores analógicos que funcionan bien con un PWM a su entrada. El problema con éstos es que el rango de entrada es de 0 a 2V típicamente y el PWM me va de 0 a 5V y no quiero añadir más componentes externos para reducirlo. Por otro lado he visto el XTR115 (http://focus.ti.com/lit/ds/symlink/xtr115.pdf) que me funcionaría muy bien ya que la entarda es escalable con una simple resistencia pero de nuevo aparece el PWM que con 256 valores no me da mucha resolución para lo que quiero medir ya que necesito mínimo 360 puntos.

Se os ocurre alguna otra forma de hacerlo o alguna pista?

Gracias!!
« Última modificación: 19 de Febrero de 2008, 15:39:33 por DarkVect »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18271
    • MicroPIC
Re: 4-20mA Current Loop
« Respuesta #1 en: 01 de Febrero de 2008, 09:04:52 »
¿Y no te sirve el que has visto si implementas el SPI por software?, realmente consume muy poquitos ciclos.

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7907
Re: 4-20mA Current Loop
« Respuesta #2 en: 01 de Febrero de 2008, 09:13:08 »
Igual que dice Manolo, yo me inclinaria por hacer el SPI por software y usar el AD420.
Si usas C es mas facil aun... :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: 4-20mA Current Loop
« Respuesta #3 en: 01 de Febrero de 2008, 09:30:01 »
Por lo que veo al AD420 se le puede igresar una entrada "tipo serie" siguiendo las especificaciones del datasheet por lo que con un par de AD420 ya lo tendría resuelto con buena precisión.

Cómo hago el protocolo por software? Sería algo del estilo crear una función: enviar_dato()  a la que le paso el valor a enviar con 16bits y dentro de la función ir activando el pin de datos y el del reloj hasta enviar el dato completo?

Tenéis algún ejemplo de cómo se implementa una comunciación sin utlizar las funciones predefinidas? Es que siempre he utilizado RS-232 con todo predefinido.

Muchas gracias!!

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18271
    • MicroPIC
Re: 4-20mA Current Loop
« Respuesta #4 en: 01 de Febrero de 2008, 09:32:46 »
Recientemente he utilizado SPI por software. Te pongo el equivalente a la función spi_write() del CCS pero hecho a mano:
void EscribeSPI(int8 Dato) {
   int8 j=8;
   while (j--) {
      SPI_SOUT = (Dato >> j) & 1;
      SPI_CLK=0;
      SPI_CLK=1;
   }
}

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: 4-20mA Current Loop
« Respuesta #5 en: 01 de Febrero de 2008, 09:37:49 »
Gracias Nocturno.

La función que me has dejado no lleva ningún delay, no habrá problemas con los tiempo de hold y setup de los datos?
Para enviar los 16 bits puedo encadenar dos veces la función o podría tener un problema de temporización?  El AD420 tiene también una entrada Latch que es la que carga el valor del registro de entrada al CDA. Con activarla justo después de enviar dato ya es suficiente, no?

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18271
    • MicroPIC
Re: 4-20mA Current Loop
« Respuesta #6 en: 01 de Febrero de 2008, 09:42:39 »
Es que no he usado nunca ese ADC que indicas; yo la he usado con un expansor de puertos MPC23S17 y va de lujo a esta velocidad y sin retardos.
Es verdad que antes y después de la comunicación hay que activar y desactivar el ChipSelect de tu AD420, pero no lo integré en el envío del dato, porque esto me permite encadenar varios datos seguidos.
Digamos que hay una rutina superior que hace lo siguiente:
Código: [Seleccionar]
Activa ChipSelect;
EscribeSPI(Dato1);
EscribeSPI(Dato2);
...
EscribeSPI(DatoN);
Desactiva ChipSelect;
También tienes que ver si tu AD420 recibe el dato en Clock positivo o en clock negativo. Esta rutina está preparada para el segundo caso, por eso pongo SPI_CLK=0 cuando el dato está cargado.
Si tu cacharro lo espera al contrario, sólo tendrás que poner primero el 1 y luego el 0.

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: 4-20mA Current Loop
« Respuesta #7 en: 01 de Febrero de 2008, 09:48:32 »
OK! En principio creo que lo tengo claro. La semana que viene me llega todo y probaré a ver qué tal sale.

Muchas gracias!!

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7907
Re: 4-20mA Current Loop
« Respuesta #8 en: 01 de Febrero de 2008, 09:49:40 »
Para establecer el protocolo SPI por software, necesitas cumplir los timings que dice la hoja de datos, con la ayuda de Manolo, podras hacer tu rutina.

Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: 4-20mA Current Loop
« Respuesta #9 en: 01 de Febrero de 2008, 12:11:18 »
Eso mismo preguntaba. Supongo que tengo que calcular la velocidad a la que el PIC me va a ir escribiendo cada dato según el reloj que le ponga y de ahí mirar si cumplo el timing.

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7907
Re: 4-20mA Current Loop
« Respuesta #10 en: 01 de Febrero de 2008, 13:10:29 »
Es muy importante saber en que lenguaje programas, para ayudarte a hacer el driver... :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7907
Re: 4-20mA Current Loop
« Respuesta #11 en: 01 de Febrero de 2008, 13:17:43 »
Aqui un ejemplo puesto por un forista de CCS C.

Código: C
  1. #include <18F452.h>
  2. #use delay(clock=16000000)
  3. #fuses HS,NOWDT,NOLVP,PUT,NOPROTECT,BROWNOUT
  4.  
  5. #define AD420_LATCH  PIN_D1
  6. int16 val = 0x7fff;           // Half scale
  7.  
  8. void main(void)
  9. {
  10.    setup_spi(spi_master | spi_l_to_h |spi_clk_div_16);
  11.  
  12.    output_low(AD420_LATCH);
  13.    
  14.    spi_write(val >> 8);    // Send msb
  15.    spi_write(val & 0xff);  // Send lsb
  16.    
  17.    output_high(AD420_LATCH);
  18.    
  19.    while(1);               // Dac output should be half full scale    
  20. }

Por supuesto que falta, pero es una punta... :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado DarkVect

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 302
Re: 4-20mA Current Loop
« Respuesta #12 en: 01 de Febrero de 2008, 13:27:17 »
Utilizo CCS. Gracias!!

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18271
    • MicroPIC
Re: 4-20mA Current Loop
« Respuesta #13 en: 01 de Febrero de 2008, 14:37:01 »
¡Ojo!, ese ejemplo sirve pero usando el hardware del PIC. Si tienes los pines ocupados por otra cosa, no podrás usarlo tal y cual está ahí.

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7907
Re: 4-20mA Current Loop
« Respuesta #14 en: 01 de Febrero de 2008, 15:56:03 »
Tiene razon Manolo.
Pero si tienes un PIC con SPI en hardware, los dos AD420 los conectas en cascada y puedes tirarles el datos con un solo bus SPI... :mrgreen:

En caso de hacerlo por software, deberias hacer que tu funcion maneje 16 bits, quedaria algo asi (con permiso de Manolo):

Código: C
  1. void EscribeSPI(int16 Dato) {
  2.    int8 j=16;
  3.    while (j--) {
  4.       SPI_SOUT = (Dato >> j) & 1;
  5.       SPI_CLK=0;
  6.       SPI_CLK=1;
  7.    }
  8. }

Espero te sirva, ahora tienes las dos opciones, avisa si anda, porque mas adelante debo escribir un AD420 y ya me queda, je..je.. :mrgreen: :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.


 

anything