hola, en este tema quisiera exponer un tema que estoy haciendo, un propulsor monofasico, esto consiste en un variador de velocidad detectando el cruce por cero de de la fase de AC y se controla por un rectificador y dos scr, aqui a continuacion pongo el diagrama(sacado de "electronica de potencia" de Rashid)
aqui dejo el programa, la salida del cruce por cero es la entrada al pic, en la interrupcion externa, asi, cada vez que hay un pulso positivo me da el periodo de la onda, y por medio del teclado de la computadora controlo la fase de salida, el periodo es de 8.333ms ya que estoy trabajando con 60 Hz en AC, el programa por ahora tiene solamente 8 velocidades,se trabaja con un pic 16f877a pero eso se puede cambiar agregando un valor int16 ala variable change, cabe destacar que esta en la primera fase el proyecto, ese es un semiconvertidor, asi que para terminar me gustaria con un convertidor completo, cualquier critica es bienvenida, y tambien comentario, ya que es el proposito de que lo exponga, sin mas que decir
aqui esta el programa (otra nota importante a señalar, este es un programa modificado de controlando un servo via rs232 del maestro RedPic):
#FUSES HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=12000000)
#use standard_io(a)
#use standard_io(b)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#define PIN_SERVO1 PIN_A0
#define PIN_SERVO2 PIN_A1
const int ticks_PULSO_MINIMO = 1;
const int ticks_PULSO_MEDIO = 4;
const int ticks_PULSO_MAXIMO = 8;
int1 flag=0;
int tSERVO1 = ticks_PULSO_MEDIO;
int change;
char Keypress =0x00;
int next=0;
void eco_servos(void);
void ajusta_servo(void);
void calculo(void);
#int_ext
void interruption(){
flag=1;
}
#int_rda
void rda_isr() {
Keypress=0x00;
if(kbhit()){
Keypress=getc();
}
}
void main() {
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
setup_counters(RTCC_INTERNAL,RTCC_DIV_256);
enable_interrupts(int_rda);
enable_interrupts(int_ext);
enable_interrupts(global);
printf("\r\n\semiconvertidor by scientist\r\n\r\n" );
eco_servos();
ext_int_edge( L_TO_H );
set_tris_a(0x00);
set_tris_b(0xFF);
do {
if (flag==1){
output_low(PIN_SERVO1);
++next;
flag=0;
}else{
if(next==1){
delay_us(100);
calculo();
output_high(PIN_SERVO1);
delay_us(100);
output_high(PIN_a1);
delay_ms(tSERVO1);
output_low(PIN_a1);
delay_ms(change);
delay_us(133);
}
if(next==2){
delay_us(100);
calculo();
output_high(PIN_SERVO1);
delay_us(100);
output_high(PIN_a2);
delay_ms(tSERVO1);
output_low(PIN_a2);
delay_ms(change);
delay_us(133);
next=0;
}
}
// CONTROL DESDE LA RS-232
if(Keypress!=0x00){
ajusta_servo();
Keypress=0x00;
}
} while (TRUE);
}
void ajusta_servo(void){
switch(Keypress){
// Periodos Prefijados
case '1': tSERVO1=ticks_PULSO_MINIMO;
break;
case '2': tSERVO1=ticks_PULSO_MEDIO;
break;
case '3': tSERVO1=ticks_PULSO_MAXIMO;
break;
// Inc Dec Periodo
case '+': if(++tSERVO1>ticks_PULSO_MAXIMO){
tSERVO1=ticks_PULSO_MAXIMO;
}
break;
case '-': if(--tSERVO1<ticks_PULSO_MINIMO){
tSERVO1=ticks_PULSO_MINIMO;
}
break;
// Dame Periodo actual
case 'r': eco_servos();
break;
}
}
void eco_servos(void){
printf("S=%u\r\n",tSERVO1);
}
void calculo(void){
change=8-tSERVO1;
}
uno de los objetivos principales del proyecto es determinar todos sus parametros matematicamente, esto mas adelante lo presentare
aqui adjunto como hacer el cruce por cero, y tambien el programa simulado en proteus, en el programa de proteus, aun no esta puesto el semiconvertidor, solo las salidas del pic, y la conexion con la pc, bueno, muy pronto pondre mas resultados