Autor Tema: Control de Fase con Interupciones  (Leído 18696 veces)

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

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Control de Fase con Interupciones
« Respuesta #30 en: 01 de Noviembre de 2011, 11:10:45 »
los pics no tienen diodos de proteccion en las entradas, unicamente lo que llevan son Schmitt Trigger buffer y TTL buffer. En caso de que superes el voltaje recomendado en el pin estaras deteriorando el buffer, a la larga probablemente deje de funcionar. Por casualidad has visto que voltaje le llega con la resistencia de 1M? O has hecho el calculo "a vista?"

Desconectado gulafranco

  • PIC10
  • *
  • Mensajes: 7
Re: Control de Fase con Interupciones
« Respuesta #31 en: 01 de Noviembre de 2011, 13:13:52 »
El calculo lo realice para que la resistencia me limite la corriente, y al ser una de 1 M, la Intensidad me da 12 uA. Espero que no se me deteriora nada por ahora.
« Última modificación: 01 de Noviembre de 2011, 13:16:20 por gulafranco »

Desconectado gulafranco

  • PIC10
  • *
  • Mensajes: 7
Re: Control de Fase con Interupciones
« Respuesta #32 en: 03 de Noviembre de 2011, 08:39:05 »
Una pregunta, como puedo realizar un retardo menor a 1 ms, se puede con hacer con NOP?
 asm{
         nop;
         nop;
         nop;
         nop;
         nop;
         nop;
         .
         .
         }
si se puede, cuanto se demora cada nop?
muchas gracias, saludos

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re: Control de Fase con Interupciones
« Respuesta #33 en: 03 de Noviembre de 2011, 10:51:46 »
¿No demora un ciclo maquina? = tic de reloj
Todos los días se aprende algo nuevo.

Desconectado juancisco

  • PIC10
  • *
  • Mensajes: 1
Re: Control de Fase con Interupciones
« Respuesta #34 en: 10 de Febrero de 2012, 18:48:06 »
Hola a todos les tengo una pequeña contribución, acabo d eterminar un control de fase preliminar con pic 16f688 pero en realidad puede ser cualquiera con ADC. Funciona muy bien el codigo, presento los mismo problema de falta de sincronia pero logre hacer las correcciones quitando todos los delay_us() de la interrupción. Espero que os ayude, realmente no explio mucho porque el codigo es muy simple. la idea es tener un trimer que me permita variar el angulo de disparo del triac que uso como elemento de suicheo.

Codigo fuente en CCS

#include <16F688.h>
#device adc=10
#use delay(clock=8000000)
#fuses INTRC_IO,PROTECT,NOBROWNOUT,NOMCLR,NOCPD,NOWDT,NOPUT,NOIESO,NOFCMEN,BROWNOUT_NOSL

//********** Definiciones de la Memoria RAM ************************************
int8  Arranque;
int16 Trimer;
int32 Angulo_Disparo;

//********** Registros Especiales del CPU **************************************
#byte PORTA=0x05
#byte PORTC=0x07

//*********** Definiciones de los Pines del PIC16f684 **************************
#define LED    PIN_C0 // Led de Encendido/ Apagado
#define FASE   PIN_C4 // Salida de PWM

//******************** Funciones de Utilidades Especiales **********************
//******************** Sistema Global de Interrupciones ************************
#INT_EXT
VOID STAR(){
           if (Arranque==0){// Cambio para el 2do semi ciclo de Onda
              ext_int_edge(H_TO_L);
              Arranque=1;
           }
           else{           // Cambio para el 1er semi ciclo de Onda
              ext_int_edge(L_TO_H);
              Arranque=0;
           }

}
//******************** Funciones de Uso General ********************************
void main(void){

   setup_oscillator(OSC_8MHZ);

   set_tris_a(0x05); // ´00 0101´ Ceros=Salidas, Unos=Entradas
   set_tris_c(0x00); // ´00 0000´ Ceros=Salidas, Unos=Entradas


   setup_timer_1(T1_DISABLED);
   setup_comparator(NC_NC_NC_NC);
   
   setup_adc_ports(sAN0);             //Canal 0 analógico
   setup_adc(ADC_CLOCK_INTERNAL);    //Fuente de reloj RC
   
   output_low(FASE);// Salida Control de Fase Apagada
   output_low(LED);
   
   Arranque=0;
   
   while(true){//bucle infinito
        set_adc_channel(0);             //Habilitación canal0
        delay_us(100);                   //Retardo para preparar Conversor
        Trimer = read_adc();            //Lectura del Potenciometro externo
                                          //Numero que va desde 0 -> 1023
        if (Trimer>=30){                // Valor de Offset en 3%
           if (Trimer<=850){// Maximo 4Vdc
              Angulo_Disparo= (8 * Trimer);//X=1/m * Y, 0->180 Grados
              output_high(LED);

              ext_int_edge(L_TO_H); // Arranco con el 1er semi ciclo de Onda
              enable_interrupts(INT_EXT);             
              enable_interrupts(GLOBAL);
             
              do{
              }while(Arranque==0);
             
              delay_us(Angulo_Disparo);// Angulo 1er semicilo de Onda
              output_high(FASE); // Ancho de pulso
              delay_us(200);
              output_low(FASE);
             
              do{
              }while(Arranque==1);

              delay_us(Angulo_Disparo+800);// Angulo 2do semiciclo de Onda
              output_high(FASE);// Ancho de pulso
              delay_us(200);
              output_low(FASE);
             
              Arranque=0;
             
           }
           else{
              disable_interrupts(GLOBAL);
              output_low(LED);
           }
        }
        else{
              Angulo_Disparo=(8 * 30);
              output_high(LED);

              ext_int_edge(L_TO_H); // Arranco con el 1er semi ciclo de Onda
              enable_interrupts(INT_EXT);             
              enable_interrupts(GLOBAL);
             
              do{
              }while(Arranque==0);
             
              delay_us(Angulo_Disparo);// Angulo 1er semicilo de Onda
              output_high(FASE); // Ancho de pulso
              delay_us(200);
              output_low(FASE);
             
              do{
              }while(Arranque==1);

              delay_us(Angulo_Disparo);// Angulo 2do semiciclo de Onda
              output_high(FASE);// Ancho de pulso
              delay_us(200);
              output_low(FASE);
             
              Arranque=0;           
        }
   }// While Principal
   
}//Main