triac
DESCRIPTION
triacTRANSCRIPT
![Page 1: triac](https://reader035.vdocument.in/reader035/viewer/2022080315/577c78721a28abe0549011c5/html5/thumbnails/1.jpg)
#include"16f628a.h"
#use delay(clock=4000000)
#FUSES NOWDT, INTRC_IO, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD
#DEFINE ZERO_CROSS PIN_B0
#DEFINE OPTO_TRIAC PIN_B1
unsigned int k=0, i;
// La detección de cruce por cero, se hace con el pin de interrupción PIN B0 (INT0)
// se genera una interrupcion cada medio ciclo de la onda senoidal para 60Hz, será cada
1/(2*60Hz)=8.33ms
// Cuando se produzca la interrupcion, desde la rutina EXT_ISR
// se inicia el conteo TON ‐ TOFF para el pin de salida al OPTOTRIAC
// 8333/255=32,67uS
#int_EXT
void EXT_ISR(void){
unsigned int TON;
TON=k*32;
output_high(OPTO_TRIAC);
delay_us(TON);
output_low(OPTO_TRIAC);
}
void main(void){
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
![Page 2: triac](https://reader035.vdocument.in/reader035/viewer/2022080315/577c78721a28abe0549011c5/html5/thumbnails/2.jpg)
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_EXT);
ext_int_edge(l_to_h);// interrupcion externa por flanco de subida
enable_interrupts(GLOBAL);
set_tris_b(0B00000001);
while(true){
for (i=10; i <= 255; i++){
k=i;
delay_ms(20);
}
}
}
![Page 3: triac](https://reader035.vdocument.in/reader035/viewer/2022080315/577c78721a28abe0549011c5/html5/thumbnails/3.jpg)
/*
Control de angulo de disparo AC dimmer con detección de cruce por cero (Zero cross detection)
Pin | Interrrupcción: | Arduino Board
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
2 | 0 | All
3 | 1 | All
18 | 5 | Arduino Mega Only
19 | 4 | Arduino Mega Only
20 | 3 | Arduino Mega Only
21 | 2 | Arduino Mega Only
INT 0 corresponde al pin 2
*/
int OPTO_TRIAC = 3; // Salida al Opto Triac
int k = 128; // Nivel k de Dimming (angulo de disparo)
void setup()
{
pinMode(OPTO_TRIAC, OUTPUT);// Set AC Load
attachInterrupt(0, zero_crosss_int, RISING);
// Selecciona interrupción '0' pin 2 como interrupcción para el cruce por cero
}
void zero_crosss_int()
{
// 8.33ms=8333us
// 8333us/255 = 32 (Aprox.)
![Page 4: triac](https://reader035.vdocument.in/reader035/viewer/2022080315/577c78721a28abe0549011c5/html5/thumbnails/4.jpg)
int TON = (32*k); // 60Hz =>32
digitalWrite(OPTO_TRIAC, HIGH); // activacion triac
delayMicroseconds(TON); // triac ciclo On delay
digitalWrite(OPTO_TRIAC, LOW); // triac ciclo Off delay
}
void loop() {
for (int i=10; i <= 255; i++)
{
k=i;
delay(20);
}
}