Autor Tema: control de potencia trifasico  (Leído 10321 veces)

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

Desconectado john_freddy

  • PIC10
  • *
  • Mensajes: 13
Re: control de potencia trifasico
« Respuesta #15 en: 20 de Abril de 2012, 18:11:28 »
este fue el codigo que monte para la instruccion que me indico pero no funciono, si es posible mírelo a ver si esta bien o esta mal en algún lugar. Gracias


#include <18f4550.h>
#fuses  HS, NOWDT, NOBROWNOUT, NOMCLR, NOPROTECT, NOWRT
#use fast_io(B)
#use delay(clock=20000000)

char keyb1;
float ret;

void main(void)
{
port_b_pullups(true);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_adc_ports(no_analogs);
set_tris_B(0b11111111);
set_tris_D(0b00000000);
while(1) {
      if (input(pin_B6)==0  &&  keyb1==1)  {
         keyb1 == 0;
         delay_ms(500);
         ret += 0.231;
         delay_ms(ret);
         output_D (0b0000000001);
         delay_ms(0.1);
         output_D (0b0000000000);
      }
      if (input(pin_B6)==1  && keyb1==0)  {
         keyb1 = 1;
      }
}
}

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: control de potencia trifasico
« Respuesta #16 en: 20 de Abril de 2012, 20:38:51 »
#int_EXT                                                  //esta interrupción es la del cruce por cero, cuando cambia de bajo a alto ejecuta el proceso
void EXT_isr(){                                        // no estoy muy seguro a los 8.33ms que seria el equivalente a 180°, creo que deberia ser 5.55ms que seria
delay_ms(ret);                                        //desface a 120° que es el desface de las otras dos ondas.
output_D (0b0000000001);                       
delay_ms(0.1);
output_D (0b0000000000);
delay_ms(5.45);
output_D (0b0000000010);
delay_ms(0.1);
output_D (0b0000000000);
delay_ms(5.45);
output_D (0b0000000100);
delay_ms(0.1);
output_D (0b0000000000);
}

#int_RB                                                                   //esta interrupcion es por cambio de estado en el puerto B4 a B7 en este caso el pulsador de incremento
void RB_isr(void){                                                    //esta conectado al pin B6, cuando ocurre el cambio de estado de alto a bajo y el contador de retardo (ret)
   if (input(pin_B6)==0 && ret <= 5.55) {                   //es menor de 8.33, incrementa ret en 0.231 que seria el equivalente a 5°
      ret += 0.231;
      RBIF = 0;
   }
}


He copiado tu código con algún cambio.
Si RB_isr se llama por flanco, no hace falta añadir el código que te copié.
Tienes razón en el desfase de 5.55ms

No entiendo por qué al pulsar B6 deja de dar pulsos. ¿Y si desactivas el bit de interrupción RBIF?
¿Puedes comprobar si funciona ahora?

Saludos
« Última modificación: 20 de Abril de 2012, 20:45:29 por Picuino »

Desconectado john_freddy

  • PIC10
  • *
  • Mensajes: 13
Re: control de potencia trifasico
« Respuesta #17 en: 21 de Abril de 2012, 12:45:56 »
Lo he estado analizando y no encuentro como desactivar el bit del RBIF, me podría ilustrar la instrucción de como deshabilitarla.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: control de potencia trifasico
« Respuesta #18 en: 21 de Abril de 2012, 13:27:37 »
No conozco el compilador CSS. En el compilador C18 es:

INTCONbits.RBIF = 0;


Saludos.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: control de potencia trifasico
« Respuesta #19 en: 21 de Abril de 2012, 13:50:07 »
Código: [Seleccionar]
disable_interrupt(INT_RB)  ;-)
El papel lo aguanta todo

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: control de potencia trifasico
« Respuesta #20 en: 21 de Abril de 2012, 16:25:27 »
Hola MLO, el problema creo que está en que hay que borrar el bit de interrupción (RBIF) para que no vuelva a saltar la rutina de interrupción otra vez al retornar.

Creo que tu código desactiva la interrupción (RBIE) de manera que no saltaría nunca más. ¿Cómo se borra RBIE en CSS?


Saludos.

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: control de potencia trifasico
« Respuesta #21 en: 22 de Abril de 2012, 11:44:56 »
No se debe poner valores float en los delay_xx, pues no tienen el efecto deseado. Miren el Help, solo admite variables o constantes de 16 bits, es decir, de 0 a 65535.

Para 5.5ms deberia ser: delay_us(5500);
« Última modificación: 22 de Abril de 2012, 11:47:07 por jeremylf »

Desconectado john_freddy

  • PIC10
  • *
  • Mensajes: 13
Re: control de potencia trifasico
« Respuesta #22 en: 22 de Abril de 2012, 20:36:38 »
compañeros muchas gracias, con los cambios realizados el programa ha evolucionado satisfactoriamente, pero aun tengo un pequeño problema:

Inicialmente cuando corro el programa aparecen los pulsos desfasados, aunque no he verificado los tiempos de desface pero el problema es que cuando presiono el pulsador de incremento no me realiza ningún desface, si entra en esa parte del código pero no hace nada, luego si presiono varias veces el pulsador me desaparecen todos los pulsos, igualmente si presiono el de decremento no pasa nada ni los desfasa ni aparecen.

El código es:

#include <18f4550.h>
#fuses  HS, NOWDT, NOBROWNOUT, NOMCLR, NOPROTECT, NOWRT
#use fast_io(B)
#use delay(clock=20000000)
#priority RB,EXT

float ret;
//float ret1 = 5.55;
//float disp = 0.231;

#int_EXT
void EXT_isr(){
delay_ms(ret);
output_D (0b0000000001);
delay_us(100);
output_D (0b0000000000);
delay_us(5450);
output_D (0b0000000010);
delay_us(100);
output_D (0b0000000000);
delay_us(5450);
output_D (0b0000000100);
delay_us(100);
output_D (0b0000000000);
}

#int_RB
void RB_isr(void){
delay_ms(125);
if (input(PIN_B6)==0 && ret <= 5550){
delay_ms(125);
output_high(PIN_C0);
ret += 231/10;
output_low(PIN_C0);
disable_interrupts(INT_RB);

}
else
if(input(PIN_B7)==0 && ret > 0){
delay_ms(125);
output_high(PIN_C1);
ret -= 0.231;
output_low(PIN_C1);
disable_interrupts(INT_RB);

}
}

void main(void)
{
port_b_pullups(true);
setup_adc_ports(no_analogs);
set_tris_B(0b11111111);
set_tris_C(0b00000000);
set_tris_D(0b00000000);
enable_interrupts(global);
enable_interrupts(INT_EXT);
ext_int_edge(L_to_H);
enable_interrupts(INT_RB);
ext_int_edge(H_to_L);
output_low(PIN_D0);
output_low(PIN_D1);
output_low(PIN_D2);
while(TRUE);
output_low(PIN_D0);
output_low(PIN_D1);
output_low(PIN_D2);
}

Hice las correcciones que sugirió  jeremylf para valores enteros en los delay y la sugerencia de Picuino de desactivar el RBIF con la instrucción que sugirio MLO, pero la variable ret como esta si cambia y necesito que sea así en valores de 0.231ms la coloque como una fracción porque no se como colocarle algún modificador para que me la tome en milisegundos o microsegundos.

Adjunto el archivo de la simulación.

Muchas gracias por ayudarme en esto.

Desconectado john_freddy

  • PIC10
  • *
  • Mensajes: 13
Re: control de potencia trifasico
« Respuesta #23 en: 22 de Abril de 2012, 21:12:25 »
estoy haciendo el código por RTOs porque quiero aprovechar la oportunidad para aprender el manejo de las mismas, adjunto el código pero en este el problema es que no se generan los pulsos.


#include <18f4550.h>
#fuses  HS, NOWDT, NOBROWNOUT, NOMCLR, NOPROTECT, NOWRT
#use fast_io(B)
#use delay(clock=20000000)
#use rtos(timer=0,minor_cycle=1us)//8330us)                  //8330us

float ret = 0;



#task(rate=16666us,max=1us)
void pulsadores(){
//for (; ;){
delay_ms(125);
if(input(pin_B6)==0 && ret <=8.33){
output_high(PIN_C0);
ret += 0.231;
}
if(input(pin_B7)==0 && ret > 0){
output_low(PIN_C0);
ret -= 0.231;
}
//rtos_yield();
}
//}


#task(rate=16666us,max=1us)
void fase0(){                //maneja la fase a 0
delay_us(100);
if(input(pin_B0)==0){        //cruce por cero
   if(input(pin_B0)==1){
output_high(PIN_C1);
delay_ms(ret);
output_high(PIN_D0);
delay_us(100);
output_low(PIN_D0);
   }
}
}

void main(void)
{
port_b_pullups(true);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_adc_ports(no_analogs);
set_tris_B(0b11111111);
set_tris_C(0b00000000);
set_tris_D(0b00000000);
output_low(PIN_D0);
output_low(PIN_D1);
output_low(PIN_D2);
output_low(PIN_C0);
output_low(PIN_C1);
rtos_run();
;
}











Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: control de potencia trifasico
« Respuesta #24 en: 22 de Abril de 2012, 21:26:00 »
 :shock: :shock:

que despiste!!! es:

Código: [Seleccionar]
clear_interrupt(INT_RB)
Saludos
El papel lo aguanta todo

Desconectado john_freddy

  • PIC10
  • *
  • Mensajes: 13
Re: control de potencia trifasico
« Respuesta #25 en: 22 de Abril de 2012, 22:16:03 »
Muchisimas gracias a todos los que participaron: Picuino, Jeremylf, MLO. sin su ayuda no habría podido lograrlo. Aun falta ajustar los ángulos de disparo ya que la prueba la hice con un angulo de casi 30° y pues así no habría suficiente control, así que hay que reducirlo a 5° mas o menos pero se genera el problema de la coma flotante pero eso ya es carpintería para el final. De nuevo compañeros muchisimas gracias por el apoyo en este proyecto.