Está en la página 1de 6

Control de fase con triac y pic688

Código

#include <16F688.h>

#device adc=10

#use delay(clock=8000000)

#fuses
INTRC_IO,PROTECT,NOBROWNOUT,NOMCLR,NOCPD,NOWDT,NOPUT,NOIESO,NOFCMEN,BROWN
OUT_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

También podría gustarte