Este consiste en contar pulsos de un encoder en un cierto deltat y meterlo a una formula de Ts, y luego disparar unos IGBTs, es bien rebuscado, pues necesito llevar una maquina asincronica de 2 pares de polos, con rotor devanado , a velocidades superior a la sincronica(sobre 1500 rpm), solo necesito como adquirir los pulsos para completar el programa..el convertidor con Igbts esta en el lado del rotor, el estator esta conectado ala linea.
ademas debo poder adelantar,atrasar las secuencias de disparo, con el objetivo de "mover" la Fmm del rotor respecto a la del estator, para obtener torke maximo
solo necesito una ayuda con la adquisicion de pulsos(Px), no lo tengo muy claro eso..
#include <16f877.h>
#pragma use delay (clock=20000000) /*Reloj del microprocesador*/
#fuses XT,NOPROTECT,NOWDT
tris_a(11111)/// ver entradas
#use fixed_io(b_outputs=PIN_B1,PIN_B2,PIN_B3,PIN_B4,PIN_B5,PIN_B6)
// inputs
#define encoder PIN_C0
#define adelantar PIN_A2
#define atrasar PIN_A3
// OUTPUTs
#define IGBT1 PIN_B1
#define IGBT2 PIN_B2
#define IGBT3 PIN_B3
#define IGBT4 PIN_B4
#define IGBT5 PIN_B5
#define IGBT6 PIN_B6
// constantes
#define deltat 0.015
#define Pe 3755.86
char contador;
void seleccion(float ts)
{
switch (contador) {
case 1: output_high(IGBT1); // encender IGBT 1,3,5
output_low(IGBT2);
output_high(IGBT3);
output_low(IGBT4);
output_high(IGBT5);
output_low(IGBT6);
delay_ms(ts);
output_low(IGBT1); // apagar IGBT 1,3,5
output_low(IGBT3);
output_low(IGBT5);
break;
case 2: output_high(IGBT1); // encender IGBT 1,5,6
output_low(IGBT2);
output_low(IGBT3);
output_low(IGBT4);
output_high(IGBT5);
output_high(IGBT6);
delay_ms(ts);
output_low(IGBT1); // apagar IGBT 1,5,6
output_low(IGBT5);
output_low(IGBT6);
break;
case 3: output_high(IGBT1); // encender IGBT 1,2,6
output_high(IGBT2);
output_low(IGBT3);
output_low(IGBT4);
output_low(IGBT5);
output_high(IGBT6);
delay_ms(ts);
output_low(IGBT1); // apagar IGBT 1,2,6
output_low(IGBT2);
output_low(IGBT6);
break;
case 4: output_low(IGBT1); // encender IGBT 2,4,6
output_high(IGBT2);
output_low(IGBT3);
output_high(IGBT4);
output_low(IGBT5);
output_high(IGBT6);
delay_ms(ts);
output_low(IGBT2); // apagar IGBT 2,4,6
output_low(IGBT4);
output_low(IGBT6);
break;
case 5: output_low(IGBT1); // encender IGBT 2,3,4
output_high(IGBT2);
output_high(IGBT3);
output_high(IGBT4);
output_low(IGBT5);
output_low(IGBT6);
delay_ms(ts);
output_low(IGBT2); // apagar IGBT 2,3,4
output_low(IGBT3);
output_low(IGBT4);
break;
case 6: output_low(IGBT1); // encender IGBT 3,4,5
output_low(IGBT2);
output_high(IGBT3);
output_high(IGBT4);
output_high(IGBT5);
output_low(IGBT6);
delay_ms(ts);
output_low(IGBT3); // apagar IGBT 3,4,5
output_low(IGBT4);
output_low(IGBT5);
};
}
//#int_timer1 // esto no lo tengo claro
// Px=get_timer1()
main()
{
contador=0;
int Px;
float a;
float b;
float ts;
// setup_timer1( T1_internal); // esta parte no me esta clara
// periodotimer0=4*preescaler*(8-valor inicial)/20*10e6
a = 0.04*Pe*deltat;
b = 6*(Pe*deltat - 0.04*Px);
if (b > 0)
{
ts =1000* a/b;
if (contador == 6) contador = 0;
contador++;
};
if (b < 0)
{
ts = -1000*a/b;
if (contador == 1) contador = 7;
contador--;
};
seleccion(ts);
if (!input(pin_A2))
{
if (contador == 6) contador = 0;
contador++;
};
if (!input(pin_A3))
{
if (contador == 1) contador = 7;
contador--;
};
}