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;
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
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
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
Muy bueno, éxitos!
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