TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: mansoconductor en 11 de Enero de 2005, 10:25:00
-
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--;
};
}
-
Asi que haciendo una especie de variador de frecuencia con el metodo de los seis pasos. Aqui hay un pequeño codigo que te puede servir para hacer la captura del la frecuencia, con interrupcion del timer0 a los 65ms y cuenta de pulsos externos en el timer1. Pudes ver la frecuencia con el hiperteminal.
Salud2
#include <16F873A.h>
#device adc=10
#use delay(clock=4000000)
#fuses NOWDT,HS, NOPUT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, NOCPD, NOWRT
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
int16 pulsos=0;
#INT_TIMER0
captura_pulsos()
{
pulsos=get_timer1();
printf("cuenta: %lu",pulsos);
disable_interrupts(INT_TIMER0);
disable_interrupts(GLOBAL);
while(input(pin_b7));
}
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
setup_timer_1(T1_EXTERNAL);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
disable_interrupts(INT_TIMER0);
disable_interrupts(GLOBAL);
set_tris_a(0x00);
set_tris_b(0xff);
while(!input(PIN_B7));
puts("prueba"
;
delay_ms(1000);
while(1)
{
if (input(PIN_B7))
{
set_timer0(0);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
set_timer0(2); // cuenta 4/4000000*256*(256-2) aprox 65ms
set_timer1(0);
delay_ms(500);
}
}
}