viernes, 22 de enero de 2016

Variador de velocidad AC con Triac y PIC - Parte II : Programacion, simulacion y pruebas reales


 Programacion, simulacion y pruebas reales


Programación en el  PIC 16f876a


  •   El microcontrolador PIC se  encargara de recibir las señales del circuito de cruce por cero, para esto se hara uso del módulo  de “interrupción por el pin  RB0”  ya que  cada vez que reciba la señal del fototransistor, automáticamente saltara de todo lo que esté haciendo el PIC en ese momento para atender a esa señal y sincronizar el disparo hacia el triac.
  •   Para controlar la velocidad, se hará uso de la “lectura analógica por el pin A0” de un potenciómetro. Ya que la lectura analógica toma algún tiempo para la conversión a digital, no sería viable usarlo en el bucle del programa principal, pues esto retrasaría las demás funciones que realizara el pic . Se optó por hacer una lectura del potenciómetro  usando un temporizado de cada  200 ms, configurando el “Timer 1” del Pic a ese periodo.
  •  El pin que dispara al moc 3020 sera el “Pin Rb7” cuya duración del ancho de pulso será de 200 uS.
  •   Existen 2 leds indicadores: señal del cruce por 0 “Pin Rb1”, Señal de de cruce por 0 dividida entre 60 (0.5 seg) “Pin RB2” 
e
Entradas al pic :
#define   potenciometro        pin_a0  //entrada analogica para control 
#define   cruze_x_cero         pin_b0  //entrada digital para el sincronismo del disparo

Salidas del Pic:
#define   disparo                  pin_b7    //disparo hacia la etapa de potencia
#define   frec_1                    pin_b1    //indicador de cruce por cero 60 hz
#define   frec_2                    pin_b2    //indicador cruce por cero 1 hz

Variables del Pic:
long  delay=7000;
short  bandera1=0;
int      contador=0;

long    adc=0;
Programa en Pic C (CCS C compiler):

#include <16f876a.h>
#device adc = 10
#fuses hs,nowdt,put,nobrownout,nolvp,
#use delay(clock=20M)
#use standard_io(a)
#use standard_io(b)
#use standard_io(c)
#priority  INT_RB   //prioridad interrupcion por rb0

#define potenciometro pin_a0
#define cruze_x_cero  pin_b0
#define frec_1        pin_b1
#define frec_2        pin_b2
#define disparo       pin_b7

long delay=7000;
short bandera1=0;
int contador=0;
long adc=0;

#INT_timer1
void timer1()
{
      adc=read_adc(); //lectura de potenciometro externo para temporizar disparo
      delay_us(20);   //tiempo de conversion adc
      delay=adc*7.7;        //escalamiento hasta maximo periodo  adc 0 a 1024
      //                  //120Hz -> T:8mS = 8333uS max
     set_timer1 (65526);
}
#int_ext
void ext_isr()
{
   bandera1=1;     //si entro pulso, poner en 1 bandera de sincronizacion
   output_toggle(frec_1); //indicador de interrupcion
   //si todo esta correcto frec de interrupcion = 60Hz
   //=>120hz/60=1hz ==>T=0.5seg
   contador++;
   if(contador==60)
   {
       output_toggle(frec_2);
       contador=0;
   }
}

void main()
{
   delay_ms(100);
   output_high(frec_1);
   output_high(frec_2);
   delay_ms(500);
   output_low(frec_1);
   output_low(frec_2);
   delay_ms(500);
 
   enable_interrupts(int_ext);
   ext_int_edge(L_TO_H);

   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);//Setup timer: Reloj interno, preescaler= 8
   enable_interrupts(INT_TIMER1);//Habilito interrupción particular del TIMER1
   set_timer1(65526);//Carga del TMR1 para 20 mhz q 200 ms

   setup_adc_ports(an0);
   setup_adc(adc_clock_internal);
   set_adc_channel(0);
 
   enable_interrupts(GLOBAL);//Habilito interrupciones globales


   while (true)
   {
      if(bandera1==1) //espera bandera de sincronizacion
      {
         delay_us(delay+440);
         output_high(disparo);
         delay_us(200);
         output_low(disparo);
         bandera1=0;
      }
   }  
}


Simulación


Pruebas en físico:


Link de descarga: https://mega.nz/#F!CxVHlLbZ!7-ff8bQFLlMAXJCPWJ0adA
clave de cifrado: !7-ff8bQFLlMAXJCPWJ0adA



Mejoras:
-Es Ovbio que  este proyecto realiza el mismo trabajo que un simple  Dimer analogico. Pero la gran potencialidad que este proyecto presenta no esta en solo controlar velocidad por medio de un potenciometro, si no que al ser diseñado para ser controlado por medio de un   microcontrolador, este es mucho mas inteligente y se pueden programar mas cosas. Puede añadirse sensores  de velocidad, temperatura, etc. Para hacer un control con un algoritmo PID de velocidad, temperatura pero en AC. Este es solo la parte básica,lo demás dependerá de  la imaginacion e ingenio para aplicarlo en algo util.

<< Primera parte del proyecto


13 comentarios:

Muy buen proyecto, gracias por compartirlo

amigo, buenazo tu proyecto, pero dime que tal es la hestresis, regula bien la velocidad del motor? gracias

Este comentario ha sido eliminado por el autor.

Qué tal, amigo. Estoy trabajando con tu proyecto, sólo que estoy usando un pic diferente: 16F886. Mi pregunta es si ya estás trabajando con el módulo PWM, y cómo ws que lo configuraste para salir por RB7

Hola, que simulador usaste ?

Anónimo, es obvio que usa Proteus.

Alguien me podría explicar porque pone ese *7.7 en la #Int_timer1?


#INT_timer1
void timer1()
{
adc=read_adc(); //lectura de potenciometro externo para temporizar disparo
delay_us(20); //tiempo de conversion adc
delay=adc*7.7; //escalamiento hasta maximo periodo adc 0 a 1024
// //120Hz -> T:8mS = 8333uS max
set_timer1 (65526);
}

GRACIAS!!

hola buenas noches me gustaría saber si con este circuito puedo manejar un motor de fase partida con arranque por capacitor?

Desearia saber si es posible controlar la frecuencia desde cero (0 Hz) y cual consideras es la máxima frecuencia de control. Gracias

y la app donde la podemos adquirir?

Buenas amigo gracias, tengo un problema al simularlo me dice [SPICE] DELMIN increased to 2.22045e-016 due to lack of time precision
[SPICE] transient GMIN stepping at time=1.10284
[SPICE] TRAN: Timestep too small; timestep = 2.77556e-017: trouble with node #U1_F1#branch.
como configuro el proteus para que no me de ese error.

Hola todos. Uno de los problemas en proteus al trabajar con corriente oh voltaje alterno es este que tu comentas carlos, y se debe a los tiempos.
Si no tienes mucha experiencia en proteus ya sea versión 7 y 8, no lo podrás Corregir estas correcciones se logran en en la ventana (Debug) en proteus Pinchas en configuración de diagnostico y te da las opciones para configurar el micro y las demás funciones que realiza el sistema pero si no sabes no lo hagas. A veces se trata de la colocación de componentes oh a sus modelos o algunas lines de unión de componentes saludos

Publicar un comentario