Corte por baja frecuencia para AVR de 380 volts

hice la simulacion en proteus pero no funciona como yo creo , como vos decis que ya lo probaste

:unsure:¿ al generador del pusiste una señal cuadrada de 5V de amplitud?

yo tengo el proteus 8.1 SP1¿que version tienes?

aca pongo la modificacion que le hice de ultima hora:
Código:
#include <12F675.h>
#device adc=10
#FUSES NOWDT, INTRC_IO, NOCPD, NOPROTECT, NOMCLR, NOPUT, NOBROWNOUT, BANDGAP_HIGH, RESERVED
#use delay(clock=4000000) 
#bit t1_overflow=0x0C.0

int rpm=false;
const int FMax=50; //frecuencia de operacion en Hz
const int FMin=47; //frecuencia de corte  enHz
const int T_Retry=10; //tiempo de espera para reintentar activar campo en Seg 
const long Vmax=535; //Voltaje maximo de operacion en escala de 0 a 1024
const long VMin=489; //Voltaje minimo de operacion en escala de 0 a 1024

int32 Freqcount(void){
 int cycles8, cycles;
 long freqc_high;
 long freqc_low;
 int32 freq;
   
 cycles8=0x00;
 cycles=0x00;
 freqc_high=0x00;
 t1_overflow=0;
 set_timer1(0);
 setup_timer_1(T1_External|T1_Div_By_1);
 while (cycles!=0xFF)
 {cycles8=0x00; 
  while (cycles8!=0xFF)
  {if (t1_overflow)             
   {t1_overflow=0;freqc_high++;} 
   else                                     
   {delay_cycles(0x05);}                       
   delay_cycles(0x1); 
   cycles8++;}
   delay_cycles(0x55);      
   cycles++;}
  delay_cycles(0x8D);   
  setup_timer_1(T1_Disabled);  
  if (t1_overflow) freqc_high++;
  freqc_low=get_timer1();     
  freq=make32(freqc_high,freqc_low);  
  return(freq);
}

void Turn_on(void)
{output_low(pin_a1);
 output_low(pin_a2);
 output_high(pin_a4);
 if (freqcount()>=FMax) RPM=true;
 else output_high(pin_a2);  
 output_low(pin_a4);
 output_float(pin_a1);}

void Turn_off(void)
{output_float(pin_a1);
 output_high(pin_a2);
 RPM=false;}

void main()
  {long VD;  
   long msec,sec;
   setup_adc_ports(sAN0|VSS_VDD);
   setup_adc(ADC_Clock_Div_2);
   setup_timer_0(RTCC_Internal|RTCC_Div_1);
   setup_comparator(NC_NC);
   setup_vref(false);
   set_tris_a(0b101001);
   set_adc_channel(0);
   output_low(pin_a4);
   output_high(pin_a2);
   output_float(pin_a1);
   while (true) 
   {if (RPM==true)
    {if (freqcount()<=FMin) {turn_off();sec=0; RPM=false;}
     VD=read_Adc();
     if (VD>=VMin&&VD<=VMax) output_low(pin_a1);
     else output_high(pin_a1);} 
    else if (sec!=0xFFFF)
    {delay_ms(1);
     msec++;
     if (msec>=0x03E7) {msec=0x00;sec++;} 
     if (sec>=T_Retry) {turn_on();sec=0x00;} 
     output_high(pin_a1);}   
    if (!input(pin_a3))
    {while(!input(pin_a3)) true;
     output_float(pin_a1);
     if (sec==0xFFFF&&RPM==false) sec=T_Retry; else sec=0xFFFF;
     if (RPM=true) turn_off();
     else if (sec!=0xFFFF) turn_on();}	
   }
  }


Dibujo.JPG
 

Adjuntos

  • AVR.rar
    97.3 KB · Visitas: 31
Última edición:
Ariel37

El 2N7000 lo tenes conectado al revés !!!!


La conexión #1 (Source) va siempre a - (negativo) y la conexión #3 (Drenaje) debe ir hacia el lado + (positivo) con la resistencia más el led que has colocado.




Saludos, JuanKa.-
 
Hola papirrin ,si le puse una cuadrada de 5v y lo arme en el proteus 7.6 ,pero tambien tengo el 8.0 despues lo armo en este tambien y lo pruebo ,tenia razon juanka tenia el mosfet alreves, y talvez no tenia bien calibrado RV4 que por lo que veo esta calibrado en 2.4v . Lo que me hace ahora la simulacion es que despues de detectar la frecuencia correcta manda el pulso al mosfet y el led que yo le puse para probar me queda encendido y como aqui esta el peligro, si el mosfet conduce por mucho tiempo la tension se dispara por eso me asuste, pero si es solo error de mi simulacion no pasa nada .Me gusto como resolviste que mande un pulso para comprobar la frecuencia y si es correcta que quede funcionando ,sos un genio papirrin:alabanza: nada mas que te topaste con uno que tiene la cabeza muy dura para aprender :oops: pero ya voy a aprender ,que decirte.......... mil gracias por todo ,espero mañana poder comprar el pic y echarle mano
El tema de los tiempos me gustaria probarlo en la practica y despues ver si hay que ajustarlos y tengo que rever el ultimo programa por que solo lo compile para probarlo y hay que cambiar la frecuancia de corte no? Y me voy a ver una pelicula con mi mujer por que sino se me pudre todo ja ja !!! saludos y GRACIAS ...........................TOTALES !!!!!!!!!!
 
El tema de los tiempos me gustaria probarlo en la practica y despues ver si hay que ajustarlos y tengo que rever el ultimo programa por que solo lo compile para probarlo y hay que cambiar la frecuancia de corte no?

si, seria bueno que lo armes primero y veas los tiempos antes de conectarlo al generador, mas o menos como cuanto aguanta el pulso del diodo ese? para ir viendo si hay que corregir algo...

el codigo que sirve es el del ultimo del mensaje. el que esta en el comprimido es mas "viejito"
 
El diodo ese debe estar como mucho 1segundo conectado lo hace muy rápido el inicio , lo mismo que en un pico de tensión por un consumo grande no alcanza a entrar nunca
 
Última edición:
aaahhh.... no entonces es mucho menos lo que estaria conectado sin en el regulador, cerca de 2uS...

osea el programa lo que hace es que primero activa el regulador, ya activado despues entra el diodo 1uS mas tarde, al desactivarse si no esta en frecuencia desactiva el regulador y 1uS mas tarde desactiva el diodo.

creo que esta bien entonces de cualquier manera le doy una revisada a eso...

bueno a ver pelis... XD
 
Lo primero esta bien ,activa al regulador y despues al diodo pero yo creo que con 100ms por ejemplo y desactiva al diodo ,si esta en frecuencia listo ,el diodo ya esta desactivado y el osc de relajacion funcionando.
Y sino esta en frecuencia, lo mismo ,el diodo ya esta desactivado ,y ahora desactiva al regulador poniendo al osc de relajacion a masa .Osea el diodo solo es un pulso para que el regulador inicie y una vez que inicio no tiene que entrar mas ,nisiquiera en una caida de tension por algun consumo, por que ya solo el regulador estabiliza la tension si necesidad del diodo y lo hace con mucha velocidad . Uy espero no confundirte, Cualquier cosa decime, por favor .
 
Ok... tienes razon....

bueno para no estar poniendo el codigo por cada cambio te paso nada mas el Hex y ya que funcione pongo el codigo....

EDITO: resubi el archivo porque estaba mal las frecuencias y no me fije. (tenia 100HZ):oops:
 

Adjuntos

  • PIC12F675.rar
    1,002 bytes · Visitas: 20
Última edición:
Hola papirrin ,te hago unas preguntas ,vos sabes que estube simulando este ultimo hex que me mandaste y lo que hace, es siempre lo mismo no importa en que frecuencia este ,se activa GP1 y GP2 por 10 segundos luego se apagan y enciende GP4 un instante y se apaga ,y vuelve a repetir , pero cuando esta en frecuencia correcta deberia apagarse todo y solo quedar encendido el led verde , es como si quedara en un loop y no esta tomando en cuenta el valor de la frecuencia que se lee.Te subo el esquema con el que estoy probando ,que lo cambie de acuerdo a tu ultimo esquema en el que el mosfet tiene solo una resistencia de base que no distingo de que valor es ? y el preset para la tension de referencia ya no tiene la resist de 100k en serie con el cursor ,que supongo que si el preset es de 100ohms como antes le tendre que agregar esta resistencia de 100k , no?
PD : ya consegui el PIC
Si vos consideras que el .hex que me mandaste es el correcto lo grabo y lo pruebo , talvez tenga yo un error en la simulacion .
 

Adjuntos

  • simulacion 12f675.jpg
    simulacion 12f675.jpg
    119 KB · Visitas: 19
Última edición:
Hola papirrin ,te hago unas preguntas ,vos sabes que estube simulando este ultimo hex que me mandaste y lo que hace, es siempre lo mismo no importa en que frecuencia este ,se activa GP1 y GP2 por 10 segundos luego se apagan y enciende GP4 un instante y se apaga ,y vuelve a repetir , pero cuando esta en frecuencia correcta deberia apagarse todo y solo quedar encendido el led verde , es como si quedara en un loop y no esta tomando en cuenta el valor de la frecuencia que se lee.Te subo el esquema con el que estoy probando ,que lo cambie de acuerdo a tu ultimo esquema en el que el mosfet tiene solo una resistencia de base que no distingo de que valor es ? y el preset para la tension de referencia ya no tiene la resist de 100k en serie con el cursor ,que supongo que si el preset es de 100ohms como antes le tendre que agregar esta resistencia de 100k , no?
PD : ya consegui el PIC
Si vos consideras que el .hex que me mandaste es el correcto lo grabo y lo pruebo , talvez tenga yo un error en la simulacion .



Otra cosa puse el pic en el programador y me sale que osscal esta en 34b0 te subo una foto con la pantalla del programador ,si entro a set manually creo que me deja cambiarlo pero no hice nada por las dudas
 

Adjuntos

  • pickit2.jpg
    pickit2.jpg
    73 KB · Visitas: 13
  • pickit.jpg
    pickit.jpg
    72 KB · Visitas: 10
El programa del post 201 me esta funcionando!!!! no se que paso antes pero ahora funciona.
Y el .hex ultimo tambien .solo me falta saber que hago con el osccal y lo grabo
 
Última edición:
Perdon por no contestar antes, pero tuve que salir fuera de la ciudad...

con respecto al pic, ya grabalo normal, a veces al grabarlo se pierde el OSCCAL y te pide que lo vuelvas a introducir, y lo pones en la ventana esa de SET OSCCAL..

ese OSCCAL es para que el Oscilador se ejecute a los 4MHZ exactos.

bueno le seguimos recien lo armes en protoboard.
 
Creo que asi quedo bastante bien:

Código:
#include <12F675.h>
#device adc=10
#FUSES NOWDT, INTRC_IO, NOCPD, NOPROTECT, NOMCLR, NOPUT, NOBROWNOUT, BANDGAP_HIGH, RESERVED
#use delay(clock=4000000) 
#bit t1_overflow=0x0C.0

int rpm=false;
short Sleep_Mode;

const int FMax=50; //frecuencia de operacion en Hz
const int FMin=47; //frecuencia de corte  en Hz
const int T_Retry=10; //tiempo de espera para reintentar activar campo en Segundos
const long Vmax=535; //Voltaje maximo de operacion en escala de 0 a 1024
const long VMin=489; //Voltaje minimo de operacion en escala de 0 a 1024
const long T_Diode=300;   //Tiempo de activacion del Diodo antes de regulador en Milisegundos

int32 Freqcount(void){
 int cycles8, cycles;
 long freqc_high;
 long freqc_low;
 int32 freq;
   
 cycles8=0x00;
 cycles=0x00;
 freqc_high=0x00;
 t1_overflow=0;
 set_timer1(0);
 setup_timer_1(T1_External|T1_Div_By_1);
 while (cycles!=0xFF)
 {cycles8=0x00; 
  while (cycles8!=0xFF)
  {if (t1_overflow)             
   {t1_overflow=0;freqc_high++;} 
   else                                     
   {delay_cycles(0x05);}                       
   delay_cycles(0x1); 
   cycles8++;}
   delay_cycles(0x55);      
   cycles++;}
  delay_cycles(0x8D);   
  setup_timer_1(T1_Disabled);  
  if (t1_overflow) freqc_high++;
  freqc_low=get_timer1();     
  freq=make32(freqc_high,freqc_low);  
  return(freq);
}

void Turn_on(void)
{output_low(pin_a1);
 output_high(pin_a4);
 delay_ms(T_diode);  
 output_low(pin_a4);
 output_low(pin_a2);
 if (freqcount()>=FMax) RPM=true;
 else {RPM=false;output_high(pin_a2);output_high(pin_a1);}}

void Turn_off(void)
{output_high(pin_a1);
 output_high(pin_a2);
 RPM=false;}

 #int_RA
void RA_isr(void) 
{if (input(pin_a3)&&sleep_mode==true) sleep_mode=true;}
   

void main()
  {delay_ms(1000);
   long VD;  
   long msec,sec;
   setup_adc_ports(sAN0|VSS_VDD);
   setup_adc(ADC_Clock_Div_2);
   setup_timer_0(RTCC_Internal|RTCC_Div_1);
   setup_comparator(NC_NC);
   setup_vref(false);
   set_tris_a(0b101001);
   set_adc_channel(0);
   enable_interrupts(INT_RA3);     
   enable_interrupts(GLOBAL);     
   output_low(pin_a4);
   output_high(pin_a2);
   output_high(pin_a1);
   sleep_mode=false;  

     while (true) 
   {if (sleep_mode==true) sleep(); 
    if (RPM==true)
    {VD=read_Adc();
     if (VD>=VMin&&VD<=VMax) output_low(pin_a1); else output_high(pin_a1);
     if (freqcount()<=FMin) {turn_off();sec=0;}} 
    else if (sleep_mode==false)
    {delay_ms(1);
     msec++;
     if (msec>=0x03E7) {msec=0x00;sec++;} 
     if (sec>=T_Retry) {turn_on();sec=0x00;}}   
    if (!input(pin_a3))
    {while(!input(pin_a3)) true;
     if (RPM==true) {turn_off();output_float(pin_a1);sleep_mode=true;}
     else
     if (sleep_mode==true) {sleep_mode=false;sec=T_Retry;} else {sleep_mode=true;output_float(pin_a1);}
     
     }	
   }
  }

le agrege que al estar en modo suspendido se "duerma" el pic para pasar de consumir 5mA a 140uA, lo que nos podria dar mas margen a hacer algo en caso de que se necesite poner una bateria...

¿ya siciste alguna prueba en lo real?
 
Última edición:
Justo acabo de armarlo en la protoboard y probarlo con leds y funciona ,lo que veo es que creo que es muy corto el tiempo del pulso que le damos al diodo para que inicie ,pero de todos modos quiero probarlo asi con el generador a ver que hace , hoy a la noche te cuento como me fue
Igual ahora que me pasaste el programa lo puedo modificar de aca :(const long T_Diode=300;) y como siempre GRACIAS!!!!!!!!!!!!!
 
Última edición:
Recien vengo de hacer pruebas ,tube un error durante las pruebas que me di cuenta cuando me estaba yendo :cabezon: y es que en vez de tomar el positivo que viene de los 17,5v del regulador y va al preset de 100r lo tome de los 5 v de la alimentacion del micro .de todos modos como dijimos hay que ajustar los tiempos .El circuito funciona pero no alcanza a iniciar al regulador habria que darle mas tiempo en alto al pin A4 (1000ms)para que alcance a iniciar el regulador y que el pin A2 no encienda tan rapido por ejemplo :lo escribo en criollo ,ja ja
mientras el pin A4 esta en alto ,el pin A2 esta en bajo ,cuando el pin A4 vuelve a bajo el pin A2 sigue bajo por 2 segundos mas ,por que cuando inicia el regulador tarda en llegar al voltaje,despues la respuesta es rapida pero al iniciarse no y como A2 se pone en alto muy rapido(logicamente por que detecta baja frecuencia), lo vuelve a cortar,pero habria que darle un poquito mas de tiempo,ya que el regulador viejito le cuesta llegar un poquito ja ja ja !!!.
La señal la tome del zener del regulador que salen 10v pero arme un divisor resistivo para entrar con 5v. lo mismo sucede con el pin A0 ,no? no pueden entrar mas de 5V ?
La verdad es que entiendo muy poco el programa :cry: y me da miedo cambiar algo mal ,pero si me decis donde muevo estos tiempos, asi no te molesto tanto mejor ,el del diodo lo veo pero lo otro todavia no
 
Última edición:
con lo del diodo prueba asi:
Código:
#include <12F675.h>
#device adc=10
#FUSES NOWDT, INTRC_IO, NOCPD, NOPROTECT, NOMCLR, NOPUT, NOBROWNOUT, BANDGAP_HIGH, RESERVED
#use delay(clock=4000000) 
#bit t1_overflow=0x0C.0

int rpm=false;
short Sleep_Mode;

const int FMax=50; //frecuencia de operacion en Hz
const int FMin=47; //frecuencia de corte  en Hz
const int T_Retry=10; //tiempo de espera para reintentar activar campo en Segundos
const long Vmax=535; //Voltaje maximo de operacion en escala de 0 a 1024
const long VMin=489; //Voltaje minimo de operacion en escala de 0 a 1024
const long T_Diode=1000;   //Tiempo de activacion del Diodo antes de regulador en Milisegundos

int32 Freqcount(void){
 int cycles8, cycles;
 long freqc_high;
 long freqc_low;
 int32 freq;
   
 cycles8=0x00;
 cycles=0x00;
 freqc_high=0x00;
 t1_overflow=0;
 set_timer1(0);
 setup_timer_1(T1_External|T1_Div_By_1);
 while (cycles!=0xFF)
 {cycles8=0x00; 
  while (cycles8!=0xFF)
  {if (t1_overflow)             
   {t1_overflow=0;freqc_high++;} 
   else                                     
   {delay_cycles(0x05);}                       
   delay_cycles(0x1); 
   cycles8++;}
   delay_cycles(0x55);      
   cycles++;}
  delay_cycles(0x8D);   
  setup_timer_1(T1_Disabled);  
  if (t1_overflow) freqc_high++;
  freqc_low=get_timer1();     
  freq=make32(freqc_high,freqc_low);  
  return(freq);
}

void Turn_on(void)
{output_low(pin_a1);
 output_high(pin_a4);
 output_low(pin_a2);
 delay_ms(T_diode);  
 output_low(pin_a4);
 if (freqcount()>=FMax) RPM=true;
 else {RPM=false;output_high(pin_a2);output_high(pin_a1);}}

void Turn_off(void)
{output_high(pin_a1);
 output_high(pin_a2);
 RPM=false;}

 #int_RA
void RA_isr(void) 
{if (input(pin_a3)&&sleep_mode==true) sleep_mode=true;}
   

void main()
  {delay_ms(1000);
   long VD;  
   long msec,sec;
   setup_adc_ports(sAN0|VSS_VDD);
   setup_adc(ADC_Clock_Div_2);
   setup_timer_0(RTCC_Internal|RTCC_Div_1);
   setup_comparator(NC_NC);
   setup_vref(false);
   set_tris_a(0b101001);
   set_adc_channel(0);
   enable_interrupts(INT_RA3);     
   enable_interrupts(GLOBAL);     
   output_low(pin_a4);
   output_high(pin_a2);
   output_high(pin_a1);
   sleep_mode=false;  

     while (true) 
   {if (sleep_mode==true) sleep(); 
    if (RPM==true)
    {VD=read_Adc();
     if (VD>=VMin&&VD<=VMax) output_low(pin_a1); else output_high(pin_a1);
     if (freqcount()<=FMin) {turn_off();sec=0;}} 
    else if (sleep_mode==false)
    {delay_ms(1);
     msec++;
     if (msec>=0x03E7) {msec=0x00;sec++;} 
     if (sec>=T_Retry) {turn_on();sec=0x00;}}   
    if (!input(pin_a3))
    {while(!input(pin_a3)) true;
     if (RPM==true) {turn_off();output_float(pin_a1);sleep_mode=true;}
     else
     if (sleep_mode==true) {sleep_mode=false;sec=T_Retry;} else {sleep_mode=true;output_float(pin_a1);}
     
     }	
   }
  }

asi activa el campo con el diodo y casi al mismo tiempo entra el regulador, despues de 1000 milisegundos desactiva el campo y toma la muestra de la frecuencia.

por lo de la toma del la señal de la frecuencia no es necesario poner un divisor resistivo, ponlo como en el esquema, del zener a una resistencia de 100K y de ahi al pin del pic. el pic tiene un diodo clamp. que hace que baje a los 5V.

por otro lado al pin A0 de los 17.5V pasa lo mismo tiene proteccion, pero usa un potenciometro de 100K no de 100R, y antes de conectarlo mide el comun para que a los 220VAC te de 2.5v.

en un momento te pongo un video para que veas que no pasa nada.

para mover los parametros le mueves aqui:

const int FMax=50; //frecuencia de operacion en Hz
const int FMin=47; //frecuencia de corte en Hz
const int T_Retry=10; //tiempo de espera para reintentar activar campo en Segundos
const long Vmax=535; //Voltaje maximo de operacion en escala de 0 a 1024
const long VMin=489; //Voltaje minimo de operacion en escala de 0 a 1024
const long T_Diode=1000; //Tiempo de activacion del Diodo antes de regulador en Milisegundos

el orden de encendido es aqui:

void Turn_on(void)
{output_low(pin_a1);
output_high(pin_a4); enciende Diodo
output_low(pin_a2); enciende oscilador de relajacion
delay_ms(T_diode); tiempo activado el diodo con el tiempo fijado en la constante T_diode
output_low(pin_a4);apaga el diodo

if (freqcount()>=FMax) RPM=true; checa la frecuencia y si esta en frecuencia deja el oscilador activado
else {RPM=false;output_high(pin_a2);output_high(pin_a1);}} si no esta en frecuencia apaga el oscilador
 
Última edición:
Creo que seria asi ????
void Turn_on(void)
{output_low(pin_a1);
output_high(pin_a4);
delay_ms(T_diode); //aca le aumentamos un poco subiendo
output_low(pin_a4);
output_low(pin_a2);
if (freqcount()>=FMax) RPM=true;
else {RPM=false;delay_ms(2000);output_high(pin_a2);output_high(pin_a1);}}

Aaaa , recien veo el msj ,ok hago esas pruebas entonces ,Gracias !!!!!!!!!!!!!
 
Última edición:
No... dale una rechecada a mi ultimo mensaje.

eso que pusiste no sirve de nada puesto que lo que checa la frecuencia es la funcion freqcount() y como el delay lo pones despues pues no tiene caso, debe ser antes.



mira con respecto al del voltaje del RA0, y RA5...

Aqui esta el sustento teorico http://ww1.microchip.com/downloads/en/AppNotes/00521c.pdf, las entradas con diodos de proteccion pueden soportar un par de cientos de volts mientras se limite la corriente.

Aqui el sustento practico:

si quieres algo mas de proteccion seria mejor poner un zener de 5.1V en lugar de divisores resistivos.

para no estar hablando de dos cosas diferentes yo digo que conectes asi:

Dibujo.JPG

tanto resistencia como potenciometro son de 100K, o pueden se de mas kiloohms mientras no entre en conflicto con la capacitancia de la entrada del puerto, que creo recordar son de 5pF.
 
Última edición:
OK papirrin ,mañana vuelvo a probar con todo lo que me dijiste , muchas gracias por el video , lo del divisor lo hice por que no sabia lo de los diodos de proteccion:facepalm: ja ja !!! mañana te cuento como me fue , Saludos !!!!!!!
 
Bueno cabo de hacer las pruebas y tube un problemita con el mosfet ,una vez que se le da el pulso este quedaba conduciendo y se disparaba la tensión así que hice una prueba lo coloque aparte del circuito y le coloque al gate una resistencia a masa de 5 k aparte de la otra que lleva para dar el pulso a positivo de 5v que era de 100r . Con el mosfet accionaba un relé que tenia el diodo por si no se aguantaba la corriente a la hora de iniciar ,solo para probar y así funciono pero cuando lo conecte al pic y dio el pulso para que inicie catabooom se quemo el pic ja ja .Que pudo haber pasado? Por que el mosfet queda conduciendo una vez que se da el pulso ?use un 2n7000 y también un irf520 .tal vez z la resistencia que puse a masa era muy chica no ?
 
Atrás
Arriba