Un saludo mis hermanos del foro TodoPic.
Mi intensión es hacer un fasimetro con pic para conocer la secuencia en una red trifásica. Se que cada una de las fases están desplazadas 120° una de la otra. Ahora como lo plasmó en ccs c para saber cuál fase es primero, cual es segunda y cuál es tercera.
Gracias por su ayuda...
int nta=0,eta=0;
{
lecpor=input_a();
R=lecpor&1;S=lecpor>>1&1;T=lecpor>>2&1;
////////////////////////////////////////Detecta sentido de fases////////////////////////////////////////
if(!R&&!S&&eta==3){eta=4,nta=0;}
if(!R&&S&&eta==2)eta=3;
if(R&&S&&eta==1)eta=2;
if(R&&!S&&eta==0)eta=1;
if(!R&&!S&&nta==3){nta=0,eta=0;}
if(R&&!S&&nta==2)nta=3;
if(R&&S&&nta==1)nta=2;
if(!R&&S&&nta==0)nta=1;
////////////////////////////////////////////////////////////////////////////////////////////////////////
if(eta==4){actif=0,eta=0,nta=0;}
else {if(actif<1000)actif++;}
}
Código: [Seleccionar]int nta=0,eta=0;
{
lecpor=input_a();
R=lecpor&1;S=lecpor>>1&1;T=lecpor>>2&1;
////////////////////////////////////////Detecta sentido de fases////////////////////////////////////////
if(!R&&!S&&eta==3){eta=4,nta=0;}
if(!R&&S&&eta==2)eta=3;
if(R&&S&&eta==1)eta=2;
if(R&&!S&&eta==0)eta=1;
if(!R&&!S&&nta==3){nta=0,eta=0;}
if(R&&!S&&nta==2)nta=3;
if(R&&S&&nta==1)nta=2;
if(!R&&S&&nta==0)nta=1;
////////////////////////////////////////////////////////////////////////////////////////////////////////
if(eta==4){actif=0,eta=0,nta=0;}
else {if(actif<1000)actif++;}
}
Aqui un ejem. de detección de fases.
Sólo se requiere que éste código esté en el bucle principal, ya que debe estar permanentemente analizando la secuencia.
Si la secuencia es correcta, la variable "eta" alcanza el valor 4.
Yo añadí la variable "actif", para que genere un retardo, antes de dar el OK!
#define INICIO 0
#define ESPERAR_QUE_A_PASE_A_0 1
#define ESPERAR_QUE_A_PASE_A_1 2
estadoTarea = INICIO;
while(1) // super bucle principal, generalmente esta en main
{
switch (estadoTarea)
{
case INICIO:
{
if (TerminalA == 1) // Si terminal A está en 1 lógico, se debe esperar a que pase a cero lógico
{
estadoTarea = ESPERAR_QUE_A_PASE_A_0;
}
else // Si terminal A está en 0 lógico, se debe esperar a que pase a 1 lógico
{
estadoTarea = ESPERAR_QUE_A_PASE_A_1;
}
break;
}
case ESPERAR_QUE_A_PASE_A_0:
{
if (TerminalA == 0)
{
estadoTarea = ESPERAR_QUE_A_PASE_A_1;
}
break;
}
default:// equivale a ESPERAR_QUE_A_PASE_A_1;
{
if (TerminalA == 1)
{
proceso();
estadoTarea = 0; //para que repita el ciclo
}
}
}
}
void proceso(void)
{
while(1)
{
if (TerminalB == 1)
{
//opcion 1
break; // para que retorne a al lazo principal
}
if (TerminalC == 1)
{
//opcion 2
break; // para que retorne a al lazo principal
}
}
}
Más óptimo resulta comparar los estados de dos fases que comparar cuándo una de ellas cambia de estado.
Saludos a todos.
E visto este código. Aquí lo dejo para ver sus opiniones...
https://www.academia.edu/44267723/3_Phase_secuence_DetectorCódigo: C++
#include <16f88.h> #use delay(clock=4000000) #use fast_io(A) #use fast_io(B) //////// Fuses: LP,XT,HS,EC_IO,NOWDT,WDT,NOPUT,PUT,MCLR,NOMCLR,BROWNOUT //////// Fuses: NOBROWNOUT,LVP,NOLVP,CPD,NOCPD,WRT,NOWRT,DEBUG,NODEBUG,CCPB0 //////// Fuses: CCPB3,PROTECT,NOPROTECT,INTRC,INTRC_IO,RC,RC_IO,FCMEN //////// Fuses: NOFCMEN,IESO,NOIESO #fuses XT,PUT,BROWNOUT,NOPROTECT,NOLVP,CCPB3 #zero_ram #byte PORTA = 0x05 #byte PORTB = 0x06 #bit LED1 = PORTB.1 //Rojo Secuencia Incorrecta #bit LED2 = PORTB.2 //Verde Secuencia correcta #byte ANSEL = 0x9b #byte TMR1L = 0xE /* definitions for Timer1 module */ #byte TMR1H = 0xF #define ALL_OUT 0 #define ALL_IN 0xff /************************************************************************** * Variables Globales **************************************************************************/ int16 t; /************************************************************************ * Interrupcion EXT * Usada para detectar flanco de subida de señal R **************************************************************************/ #INT_EXT void EX_isr() { set_timer1(0); } /********************************************************************************* * Interrupcion CCP1 * Usada para detectar tiempo que ocurre en flanco de subida de señal S * De acuerdo tiempo transcurrida se sabe si la secuencia es correcta o incorecta **********************************************************************************/ #INT_CCP1 void CCP1_isr() { t=CCP_1; if(t>0 && t<6000) { //Secuencia Correcta (t en us) LED2=1; LED1=0; } if(t>6000 && t<12000) { // Secuencia Incorrecta (t en us) LED2=0; LED1=1; } } /************************************************************************** * Programa Principal **************************************************************************/ void main() { setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); // tick= 1useg a 4Mhz setup_ccp1(CCP_CAPTURE_RE); set_tris_b(0x9); LED1=0; LED2=0; enable_interrupts(INT_EXT); ext_int_edge(0,L_TO_H); enable_interrupts(INT_CCP1); enable_interrupts(GLOBAL); while(1); }
Cual es su opinión de esto, se puede mejorar en algo.
Saludos a todos.
E visto este código. Aquí lo dejo para ver sus opiniones...
https://www.academia.edu/44267723/3_Phase_secuence_DetectorCódigo: C++
#include <16f88.h> #use delay(clock=4000000) #use fast_io(A) #use fast_io(B) //////// Fuses: LP,XT,HS,EC_IO,NOWDT,WDT,NOPUT,PUT,MCLR,NOMCLR,BROWNOUT //////// Fuses: NOBROWNOUT,LVP,NOLVP,CPD,NOCPD,WRT,NOWRT,DEBUG,NODEBUG,CCPB0 //////// Fuses: CCPB3,PROTECT,NOPROTECT,INTRC,INTRC_IO,RC,RC_IO,FCMEN //////// Fuses: NOFCMEN,IESO,NOIESO #fuses XT,PUT,BROWNOUT,NOPROTECT,NOLVP,CCPB3 #zero_ram #byte PORTA = 0x05 #byte PORTB = 0x06 #bit LED1 = PORTB.1 //Rojo Secuencia Incorrecta #bit LED2 = PORTB.2 //Verde Secuencia correcta #byte ANSEL = 0x9b #byte TMR1L = 0xE /* definitions for Timer1 module */ #byte TMR1H = 0xF #define ALL_OUT 0 #define ALL_IN 0xff /************************************************************************** * Variables Globales **************************************************************************/ int16 t; /************************************************************************ * Interrupcion EXT * Usada para detectar flanco de subida de señal R **************************************************************************/ #INT_EXT void EX_isr() { set_timer1(0); } /********************************************************************************* * Interrupcion CCP1 * Usada para detectar tiempo que ocurre en flanco de subida de señal S * De acuerdo tiempo transcurrida se sabe si la secuencia es correcta o incorecta **********************************************************************************/ #INT_CCP1 void CCP1_isr() { t=CCP_1; if(t>0 && t<6000) { //Secuencia Correcta (t en us) LED2=1; LED1=0; } if(t>6000 && t<12000) { // Secuencia Incorrecta (t en us) LED2=0; LED1=1; } } /************************************************************************** * Programa Principal **************************************************************************/ void main() { setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); // tick= 1useg a 4Mhz setup_ccp1(CCP_CAPTURE_RE); set_tris_b(0x9); LED1=0; LED2=0; enable_interrupts(INT_EXT); ext_int_edge(0,L_TO_H); enable_interrupts(INT_CCP1); enable_interrupts(GLOBAL); while(1); }
Cual es su opinión de esto, se puede mejorar en algo.
Deberías darle un formato más legible.
DominusDRR
Como hacer el hardware para detectar los cambios de las fases?. Con cruce por cero?.
DominusDRR
Como hacer el hardware para detectar los cambios de las fases?. Con cruce por cero?.
DominusDRR
Como hacer el hardware para detectar los cambios de las fases?. Con cruce por cero?.
DominusDRR
Como hacer el hardware para detectar los cambios de las fases?. Con cruce por cero?.
Un saludo mis hermanos del foro TodoPic.
Mi intensión es hacer un fasimetro con pic para conocer la secuencia en una red trifásica. Se que cada una de las fases están desplazadas 120° una de la otra. Ahora como lo plasmó en ccs c para saber cuál fase es primero, cual es segunda y cuál es tercera.
Gracias por su ayuda...
Amigo DominuDRR, dame un poco de teoría y explícame por qué comentas esto en tu código...
co, se realiza el proceso para determinar cual de los terminales B y C pasan primero a 1 lógico.
Código: C++
default: // Equeivale a case ESPERAR_QUE_B_o_C_PASEN_A_1_LOGICO;