Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature currently requires accessing the site using the built-in Safari browser.
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
Lo de los transformadores parece una buena idea pero es continua.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.
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
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...).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.
Ni es lineal ni es estable con la temperatura.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.
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...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...
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?
Codigo master:#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);
}
}
}
#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);
}
}
}
y luego metiendo todas las ordenes de envio dentro deset_adc_channel(0);
delay_us(20); //delay'=20us
voltagea=read_adc();
delay_us(30);
set_adc_channel(0);
voltageb=read_adc();
, 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).if (voltagea!=voltageb)