Lo que pasa es que intento hacer un rectificador trifásico controlado, pero necesito que se sincronice con la señal de la red para que se hagan los disparos en el ángulo indicado, pero no logro hacer que se sincronicen usando interrupciones, asi como tampoco entiendo porque no se crea el desfase que programe entre los disparos.
Alguno sabra como se arregla eso?
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
//programa para controlar un rectificador trifasico controlado de onda completa
const unsigned long Int_t1 = 16666UL;
const unsigned long Int_t2 = 16666UL;
const unsigned long Int_t3 = 16666UL;
const unsigned long Int_t4 = 16666UL;
const unsigned long Int_t5 = 16666UL;
const unsigned long Int_t6 = 16666UL;
unsigned long e_t1 = 1400UL; //Eventos
unsigned long e_t2 = 4200UL;
unsigned long e_t3 = 6900UL;
unsigned long e_t4 = 9700UL;
unsigned long e_t5 = 12500UL;
unsigned long e_t6 = 15300UL;
volatile byte estado = LOW;
volatile int valorPot = 0, valorServo = 0;
int T1=6,T2=7,T3=8, T4=9, T5=10, T6=11, scr,pot=0, d=0;
boolean sinc;
unsigned long t1=0,t2=0,ts=0,tc=0;
LiquidCrystal_I2C lcd(0x27, 16, 2);//REAL
//LiquidCrystal_I2C lcd(0x13, 16, 2);//SIM
void setup()
{
lcd.init();
lcd.backlight();
pinMode(T1, OUTPUT);
pinMode(T2, OUTPUT);
pinMode(T3, OUTPUT);
pinMode(T4, OUTPUT);
pinMode(T5, OUTPUT);
pinMode(T6, OUTPUT);
pinMode(3, INPUT); // pin de la interrupción
pinMode(A0,INPUT);
Serial.begin(9600);
//attachInterrupt(digitalPinToInterrupt(3),pos, RISING);
lcd.print("Rectificador Trifasico Controlado");
delay(1000);
lcd.clear();
}
void pos()
{
sinc=true;
}
void loop()
{/*
ts = millis();
if (ts > (tc + 500UL))//Formateador UL al final del literal
{
tc=millis();
lcd.clear();
}*/
pot=analogRead(A0); //leemos el valor del potenciometro
valorPot = map(pot,0,1023,0,(5556));//Opcion 1
//valorPot = map(pot,0,1023,1389,6944);//Opcion 2
valorServo = map(pot, 0, 1023, 0, 120); //convertimos ese valor a grados
//valorServo = map(pot, 0, 1023, 30, 150); //convertimos ese valor a grados
//Serial.print("Tiempo de retardo= ");Serial.print(valorPot);Serial.print("us Angulo de disparo= ");Serial.println(valorServo);
lcd.setCursor(0,0);
lcd.print("Retardo= ");
lcd.setCursor(9,0);lcd.print(valorPot);lcd.print("us");lcd.setCursor(0,1);
lcd.print("Angulo= ");
lcd.setCursor(8,1);lcd.print(valorServo);
unsigned long actual;
if(sinc==true)
{
actual = micros();
}actual = micros();
if(actual > (e_t1 + valorPot))
{
digitalWrite(T1,HIGH);
retardo();
digitalWrite(T1,LOW);
e_t1 += Int_t1;
}
if(actual > (e_t2 + valorPot))
{
digitalWrite(T2,HIGH);
retardo();
digitalWrite(T2,LOW);
e_t2 += Int_t2;
}
if(actual > (e_t3 + valorPot))
{
digitalWrite(T3,HIGH);
retardo();
digitalWrite(T3,LOW);
e_t3 += Int_t3;
}
if(actual > (e_t4 + valorPot))
{
digitalWrite(T4,HIGH);
retardo();
digitalWrite(T4,LOW);
e_t4 += Int_t4;
}
if(actual > (e_t5 + valorPot))
{
digitalWrite(T5,HIGH);
retardo();
digitalWrite(T5,LOW);
e_t5 += Int_t5;
}
if(actual > (e_t6 + valorPot))
{
digitalWrite(T6,HIGH);
retardo();
digitalWrite(T6,LOW);
e_t6 += Int_t6;
}
}
void retardo()
{
for(int e =0; e < 5; e++)//poner 1 para tener 24us
for(int i = 0; i <= 20; i++)//poner 1 para tener 24us
{
if(digitalRead(4))
digitalWrite(4,LOW);
else
digitalWrite(4,HIGH);
}
}

