Medir tensiones aisladas entre si y con la de referencia. (Aislar señales)

yo soy un BRUTO,casi estoy en la era GLACIAR de la electronica,pero quisiera saber por donde tomas las tensiones para que el pic accione el lcd???? yo no lo veo en tu diagrama hecho con paint.
vuelvo a decir ESTOY EN LA ERA GLACIAR DE LA ELECTRONICA
 
yo soy un BRUTO,casi estoy en la era GLACIAR de la electronica,pero quisiera saber por donde tomas las tensiones para que el pic accione el lcd???? yo no lo veo en tu diagrama hecho con paint.
vuelvo a decir ESTOY EN LA ERA GLACIAR DE LA ELECTRONICA

Como he comentado en el texto que predecia a el esquema, la alimentacion hasta el momento es la del conector icsp, y posteriormente la tomare de cualquiera de las fuentes de tension de que dispone mi fuente de alimentacion o si simplifica el proceso, pondria otra mas
 
Los multiplexores tambien tendrian que tener voltajes referenciados a masa en sus entradas (no hablamos de conmutadores analogicos, y los digitales si tienen que estar referenciados a masa si no recuerdo mal).
Asi que no me sirve...
 

Adjuntos

  • SCAN0003.JPG
    SCAN0003.JPG
    140.1 KB · Visitas: 21
hola, yo algunas veces me encontre con ese dilema.

que armas tu esquema con un pic y su fuente y luego necesitas medir cosas que no puedes poner a masa comun :

como ser 220v incluso de otra fase y no quieres que quede con tension.
o un shunt de corriente que esta intercalado en algo que ..... mejor ni locuras que hacer una masa comun .

lo mas economico:
1 -- como YA te dijeron pequeños trafos, hay de corriente y tambien de tension.

2 -- mas caro y complejo :
que cada modulo de medicion sea independiente , con su fuente y logica y como YA te dijeron mande la medicion limpita y como mejor te plazca.
obvio que es mucho mas caro, cada modulo de lectura y Tx .

3 --- otra es si hacerle alguna masa comun, yo no se , pero he visto algunso ingenieros que se la saben todas y como unifican las cosas mas locas a la masa comun , ya sea con R o con impedancias y obvio que tienen eso en cuenta...... yo no se hacerlo o busco cosas mas simples .

y bueno, lo de la fuente flotante esa ya le estoy forzando a fogonazo a que me llene un tema :D.


fijate que tanto 1 y 2 respetan el que no queres /podes mandar uno de los cables de "lo que vas a medir" a la masa de la fuente de tu circuito, y como lo respeta ?? de la forma mas simple:
trafo aisla
 
hola, yo algunas veces me encontre con ese dilema.

que armas tu esquema con un pic y su fuente y luego necesitas medir cosas que no puedes poner a masa comun :

como ser 220v incluso de otra fase y no quieres que quede con tension.
o un shunt de corriente que esta intercalado en algo que ..... mejor ni locuras que hacer una masa comun .

lo mas economico:
1 -- como YA te dijeron pequeños trafos, hay de corriente y tambien de tension.

2 -- mas caro y complejo :
que cada modulo de medicion sea independiente , con su fuente y logica y como YA te dijeron mande la medicion limpita y como mejor te plazca.
obvio que es mucho mas caro, cada modulo de lectura y Tx .

3 --- otra es si hacerle alguna masa comun, yo no se , pero he visto algunso ingenieros que se la saben todas y como unifican las cosas mas locas a la masa comun , ya sea con R o con impedancias y obvio que tienen eso en cuenta...... yo no se hacerlo o busco cosas mas simples .

y bueno, lo de la fuente flotante esa ya le estoy forzando a fogonazo a que me llene un tema :D.


fijate que tanto 1 y 2 respetan el que no queres /podes mandar uno de los cables de "lo que vas a medir" a la masa de la fuente de tu circuito, y como lo respeta ?? de la forma mas simple:
trafo aisla
Lo de los transformadores parece una buena idea pero es continua.
Aislar un modulo independiente es lo que estoy intentando ahora: unir dos pics por uart (16f88 y 16f873) pero no consigo que me funcione...
Añado lo siguiente,en el receptor[/SIZE]:
""
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#int_rda
int16=dato;
void rd_isr(void)//función de interrupción por recepción de datos USART
{
dato= getc();
}
""
y luego pongo "con_voltagea =dato;" cuando lo uso (con_voltagea es la variable que sale en el printf)

Y en el transmisor""
#use rs232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B2,bits=8)
void main()
{
int16 voltagea;
while(1) {
set_adc_channel(0);
delay_us(80); //delay'=20us
voltagea=read_adc();
delay_ms(20);
putc(voltagea);
}
}
 
Hola, una forma sencilla de aislar la medición podría ser con un conversor de voltaje a frecuencia en el lugar a medir y a su salida un optoacoplador, de esta forma puedes calcular el voltaje en función de la frecuencia o periodo, hace unos meses diseñe algo parecido a lo que necesita y como no era tanta la resolución que necesitaba utilice un 555 para hacer el conversor de voltaje a frecuencia y un pic para leer la salida optoacoplada.
 
Hola, una forma sencilla de aislar la medición podría ser con un conversor de voltaje a frecuencia en el lugar a medir y a su salida un optoacoplador, de esta forma puedes calcular el voltaje en función de la frecuencia o periodo, hace unos meses diseñe algo parecido a lo que necesita y como no era tanta la resolución que necesitaba utilice un 555 para hacer el conversor de voltaje a frecuencia y un pic para leer la salida optoacoplada.
No se me habia ocurrido! gracias! creo que sera lo que hare porque no consigo comunicar con el otro pic (aunque lo intentare aprender para cuando lo necesite...).
¿como paso de frecuencia a voltaje en el pic? ¿introduzco los pulsos en una entrada digital cualquiera y luego utilizo alguna funcion o algoritmo?
Tambien podria convertir otra vez a tension xd pero supongo que el pic no tiene problema en hacerlo.
 
Lo primero es medir el periodo o la frecuencia de la señal de entrada, para esto hay varios ejemplos en Internet, si lo quieres solo para visualizar el voltaje o corriente de las fuentes puedes tener lecturas "lentas" usando un tmr del pic. En cuanto a la convercion de frecuencia a voltaje la formula va a depender principalmente del conversor de voltaje a frecuencia ya que si utilizas un integrado especialmente diseñado para esto (como el lm331) la hoja de datos te dice la frecuencia en función del voltaje por lo que tu simplemente despejas el voltaje y metes la formula al micro, ademas tiene la ventaja de que generalmente la linealidad de la salida es muy alta.
 
Quitate de broncas... como bien dijiste al inicio usa un optoacoplador lineal y listo... la tecnica se usa en los osciloscopios tectronix para aislarlos de la señal a medir

Usa el HCNR201, es muy facil de conseguir y su linearidad es muy elevada, incluso trae 2 fotodiodos para poder hacer retroalimentacion

http://www.avagotech.com/pages/en/o...ic_high_linearity_analog_optocoupler/hcnr201/
http://www.avagotech.com/docs/AV00-0144EN

Tambien existen amplificadores operacionales con aislamiento, pero son mas complicados de conseguir y la tecnica que usan es exactamente la misma (optoacoplador interno)

O tambien puedes usar sensores de efecto hall... existen ICs que te permiten medir corriente por medio de un campo magnetico que se lee con un sensor

http://www.allegromicro.com/en/Products/Categories/Sensors/currentsensor.asp
http://www.allegromicro.com/en/Products/Part_Numbers/0713/0713.pdf
 
No encuentro optoacopladores lineales en las tiendas... comprare algunos por internet...
He probado con el cny17 y cambiando las resistencias de polarizacion (respecto a las que vienen en el datasheet) he conseguido una histeresis de mas de 5V (con el esquema original se consigue menos de 1V) a partir de 1V o 2 de entrada... podria hacer un circuito para adaptar esto a una salida de 0 a 5v, pero no se si la variacion es lineal en este rango, parece que si pero no estoy seguro.

Teniendo que hacer cualquier modificacion a un optoacoplador para un acoplo directo parece mas sencillo establecer una comunicacion optoacoplada entre dos pics y es lo que estoy intentando pero no consigo programar el pic 16f88 o 16f628 (el que utilizare sera el 16f88 que tiene entradas analogicas), ni siquiera encender un led... el programador lo reconoce y lo programa bien, pero luego no hace nada...
A demas estoy contrariado porque algunos esquemas con ese pic que hay por internet no tienen cristal. Tiene oscilador interno pero no pensaba que se sincronizara a si mismo con el...
 
No encuentro optoacopladores lineales en las tiendas... comprare algunos por internet...
He probado con el cny17 y cambiando las resistencias de polarizacion (respecto a las que vienen en el datasheet) he conseguido una histeresis de mas de 5V (con el esquema original se consigue menos de 1V) a partir de 1V o 2 de entrada... podria hacer un circuito para adaptar esto a una salida de 0 a 5v, pero no se si la variacion es lineal en este rango, parece que si pero no estoy seguro.
Ni es lineal ni es estable con la temperatura. (n)

El plan B cuando no se consiguen los optoacopladores lineales es usar dos optos comunes (CNY17 o similar) formando un sistema realimentado.
Se hace algo "parecido" a lo que se hace con los optoacopladores lineales, que en realidad no son lineales sino muy iguales.
 
No encuentro optoacopladores lineales en las tiendas... comprare algunos por internet...
He probado con el cny17 y cambiando las resistencias de polarizacion (respecto a las que vienen en el datasheet) he conseguido una histeresis de mas de 5V (con el esquema original se consigue menos de 1V) a partir de 1V o 2 de entrada... podria hacer un circuito para adaptar esto a una salida de 0 a 5v, pero no se si la variacion es lineal en este rango, parece que si pero no estoy seguro.

Teniendo que hacer cualquier modificacion a un optoacoplador para un acoplo directo parece mas sencillo establecer una comunicacion optoacoplada entre dos pics y es lo que estoy intentando pero no consigo programar el pic 16f88 o 16f628 (el que utilizare sera el 16f88 que tiene entradas analogicas), ni siquiera encender un led... el programador lo reconoce y lo programa bien, pero luego no hace nada...
A demas estoy contrariado porque algunos esquemas con ese pic que hay por internet no tienen cristal. Tiene oscilador interno pero no pensaba que se sincronizara a si mismo con el...
Amigo, si necesitas precision en las lecturas, pues el uso de optoacopladores en disposicion lineal(siendo que es complejo obtener una escala mas o menos lineal), puede que altere el valor capturado o la misma linealidad, con la temperatura ambiente...
Mientras mas agregues dispositivos analogos a una cadena, mayor sera el error.-
La solucion es comunicacion serial!.-
 
Hola, una forma sencilla de aislar la medición podría ser con un conversor de voltaje a frecuencia en el lugar a medir y a su salida un optoacoplador, de esta forma puedes calcular el voltaje en función de la frecuencia o periodo, hace unos meses diseñe algo parecido a lo que necesita y como no era tanta la resolución que necesitaba utilice un 555 para hacer el conversor de voltaje a frecuencia y un pic para leer la salida optoacoplada.

Había planteado una idea similar en otro hilo: Con la tensión variar el PWM del 555, de ahí al opto y finalmente el PIC que se encargue de descifrar que tensión era.

No me gusta la idea de tener una frecuencia variable o 2 o 3 dando vueltas en el circuito, prefiero elegir una sola frecuencia que no moleste.
Otra ventaja es que el opto no tiene que ser lineal ya que trabaja solo en corte y saturación.

Descifrar una frecuencia es fácil, solo hace falta un contador que cuente los pulsos en un intervalo constante de tiempo.

Descifrar la duración de un pulso ON, luego la duración del OFF y dividirlos no ha de ser tan complicado como parece para un PIC ¿No?
 
Había planteado una idea similar en otro hilo: Con la tensión variar el PWM del 555, de ahí al opto y finalmente el PIC que se encargue de descifrar que tensión era.

No me gusta la idea de tener una frecuencia variable o 2 o 3 dando vueltas en el circuito, prefiero elegir una sola frecuencia que no moleste.
Otra ventaja es que el opto no tiene que ser lineal ya que trabaja solo en corte y saturación.

Descifrar una frecuencia es fácil, solo hace falta un contador que cuente los pulsos en un intervalo constante de tiempo.

Descifrar la duración de un pulso ON, luego la duración del OFF y dividirlos no ha de ser tan complicado como parece para un PIC ¿No?

Hola Amigo, Nilfred, bueno respecto a tu comentario, es facil desarrollar un sistema asi, pero ya que cabe la posibilidad de usar un PIC al final de la cadena, es preferible una comunicacion serial DIGITAL en el cual denominas arbitrariamente un protocolo tipo UART, por ejem. 1 bit de "inicio" luego envias 10 bits de datos y al final del codigo un bit de "parada".
De esta manera eliminas, errores de linealidad, desplazamiento de lectura por temp., etc.
 
Tengo conectados un pic16f88 que es el i2c master (ya que solo envia), y un pic16f873, i2c slave y el que controla el lcd y demas.
He conectado sus puertos SCL y SDA (SCL a SCL y SDA a SDA) cada linea con resistencias de pull up de 10k (he probado diferentes valores desde 1k hasta 10k). Y no funciona...
el codigo de prueba es muy simple: El pic16f88 tiene un pulsador y un led, cuando no pulso el pulsador el led parpadea con una frecuencia y cuando pulso el pulsador la frecuencia cambia y envia un dato por i2c.
El pic 16f873 muestra "dani" en la pantalla parpadeando cuando no recive ningun dato, y cuando lo hace muestra el dato en la pantalla seguido de "recivido".
Este es el funcionamiento esperado. Lo unico que ocurre ahora es que cuando pulso el pulsador el led cambia de frecuencia, pero en la pantalla solo aparece "dani" parpadeando, asi que no recive nada...
Codigo slave:
#include <16F873A.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES RESERVED //Used to set the reserved FUSE bits
#use delay(clock=20000000)
#define RS PIN_B0
#define RW PIN_B1
#define E PIN_B2
#define I2C_SCL PIN_C3
#define I2C_SDA PIN_C4
#use i2c(Slave,Slow,sda=I2C_SDA,scl=I2C_SCL,address= 0xa0 )

#include <flex_lcd_c.c>

void main()
{
lcd_init();

setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_CLOCK_DIV_2);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
lcd_init();
// TODO: USER CODE!!

while (1)
{

int dato;
lcd_init();

// Recepción por comunicación I2C
if(i2c_poll())
{
dato=i2c_read();
lcd_putc(dato); //Muestra dato recibido por pantalla
lcd_putc(" recivido");
delay_ms(1505);

}
else
{
lcd_putc("\f");
lcd_gotoxy(7,1);
lcd_putc("Dani"); // Escribes en la lcd
delay_ms(505);
lcd_putc("\f");
delay_ms(205);
}

}


}
Codigo master:
#include <16F88.h>
#device adc=10
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT //No Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOPROTECT //Code not protected from reading
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES RESERVED //Used to set the reserved FUSE bits
#use delay(clock=20000000)
#define ADC0 PIN_A0
#define ADC1 PIN_A1
#define SW1 PIN_B0
#define I2C_SDA PIN_B1
#define LED PIN_B3
#define I2C_SCL PIN_B4
#use i2c(Master,Slow,sda=I2C_SDA,scl=PIN_B4,force_hw)

#int_SSP
void SSP_isr(void)
{
}

void main()
{
setup_adc_ports(sAN0|sAN1|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_2);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_SSP);
enable_interrupts(GLOBAL);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab
// TODO: USER CODE!!
int slaveaddress1;
int slavetestdata1;

while(1)
{
if (!input(sw1))
{
slaveaddress1 = 0xa0;
slavetestdata1 = 5;
delay_ms(1000);
i2c_start();
i2c_write(slaveaddress1);
delay_ms(10);
i2c_write(slavetestdata1);
i2c_stop();

output_high(LED);
delay_ms(105);
output_low(LED);
delay_ms(105);

}
else
{
output_high(LED);
delay_ms(505);
output_low(LED);
delay_ms(1505);
}
}
}
 
Última edición:
El problema era este:
" #use i2c(Master,fast,sda=I2C_SDA,scl=PIN_B4,force_sw) "
El pic16f88 no dispone de master i2c por hardware, asi que hay que forzarle por programacion para que actue como master. Programando en CCS solo es añadir la indicacion "force_sw" pero seguro que hay mucho codigo detras y si el programa tiene que ser ligero sera mejor optar por pics con i2c master, en mi caso no importa.

Cuando tenga el programa terminado o mas dudas lo comento. Un saludo
 
Ahora tengo otro problema (lo mismo lo resuelvo rapido... o lo mismo no xd)...
un pic actua de entradas adc del otro y le envia la informacion por i2c, esto me funciona, pero quiero minimizar la carga del pic principal y enviarle los menos datos posibles, asi que quiero que cuando el voltaje no cambie no envie nada.
Esto lo he hecho asi:
set_adc_channel(0);
delay_us(20); //delay'=20us
voltagea=read_adc();
delay_us(30);
set_adc_channel(0);
voltageb=read_adc();
y luego metiendo todas las ordenes de envio dentro de
if (voltagea!=voltageb)
, el problema es que sigue actualizando la pantalla (sigue enviando datos por i2c) (lo se porque tengo puesto un pequeño retardo para ver cuando escribe letras en la pantalla).
Si en vez de esta comparacion pongo por ejemplo que solo envie datos cuando voltagea, que es la variable que condiene los datos del adc, sea igual a 10 en la pantalla veo 8, 9, 10 y 11 (variando la entrada con un potenciometro).
Mas que imprecision pienso que lo que puede pasar es que la comparacion y el envio no se realicen en el mismo instante, sin embargo la lectura del dato se ha realizado antes asi que no tendria que variar...

-------------------------------------------------------------------------------------
Hay veces que el valor en la pantalla se queda estatico, como deberia pasar siempre que no cambio el valor de entrada... pero solo pasa a veces
-------------------------------------------------------------------------------------
En el receptor tengo puesto que cada dato que reciba lo ponga en la pantalla, pero cuando llega el ultimo lo sigue repitiendo hasta que llena toda la pantalla...
i2c_stop(); no deja vacio el bus?
Lo puedo solucionar seleccionando un caracter exclusivo de final de palabra y que cuando lo encuentre no haga nada, pero supongo que habra alguna orden para parar la recepcion
 
Última edición:
Atrás
Arriba