Problema Uso de interrupciones y funcion millis();

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);
  }
}

Prueba metiendo tus retardos dentro de la interrupcion

La variable sinc debe declararse volatile porque se modifica dentro de la interrupción.

volatile boolean sinc;

Olvidaste resetearla (ponerla en false) luego de "detectar" que se puso en true

  if(sinc==true)
  { 
    actual = micros();
    sinc = false;
  } // actual = micros(); esto está de más

sino se "dispara" una sola vez en lugar de hacerlo en cada cruce por cero.

Como haces esto? Esquema.

Seria asi, solo que sustituyendo el subsistema 4 por un nano y optos para el disparo y asi aislar el circuito de potencia del micro.
PD: ya logré hacer que se sincronizara con la fase ahora solo tengo que poder ajustar el desfase en los disparos

Eso es Simulink.
Estas usando el arduino via Simulink?

no, pero es el que tenía hecho porque simulink es para mi reporte, lo tengo armado en fisico pero me tambien lo estoy haciendo en proteus para simular el fisico pero todavia no termino de hacer la simulacion

Y que debes hacer ? Rectificador controlado para alimentar qué?

un motor de directa de 50kw que emulara el viento que inside en un aerogenerador, dado a que este motor va conectado a un generador

Dirás porque te hice la pregunta? Pues por que en lugar de tiristores puedes usar Mosfet y lograr un sistema mas eficiente.
https://hal.archives-ouvertes.fr/hal-00257713/document

image
Solo para tentarte.
Experimental results show that all of the tested cases have a 0.99 power factor and that highest efficiency of 96.7%.

Si lo llegue a pensar puesto que es algo que viene en el libro de electrónica de potencia de rashid pero, supuse que usar lo IGBT'S llevaría un nivel de complejidad mayor para hacer el circuito de disparo que el de un SCR, también vi la opción de usar GTO (también se vio la opción del semiconvertidor) pero también supuse que su precio seria mayor que usar SCR'S puesto que el objetivo final de esto (aparte de graduarme) es llegar hasta la parte practica donde se analizará a baja potencia y después se desarrollara un PCB para tener el circuito funcionando para llevar acabo la practica ya en alta potencia con el equipo antes dicho y puesto a que este es un proyecto dentro de otro proyecto mas grande tampoco se que tanto uso se le vaya a dar o que tan eficiente se necesita que sea porque el mismo investigador desconoce el futuro del mismo en partes mas avanzadas de su proyecto

y tentarme.... yo desde el principo habia fijado como meta personal llegar al dual o al PWM pero en vista de que se me acaba el tiempo creo que me quedara en este.
Ahora solo tengo que ajustar los desfases de los disparos y ya estaria listo para hacer las pruebas a baja potencia y buscar la prueba de alta potencia

Cuando requires de un timming preciso hay que usar TIMERs y olvidarse de porqué las cosas no salen como las pensé.
No salen porque olvidé cosas o porque no he visto todo lo que consume tiempos no útiles.
Claro que es útil saber que esta pasando pero siempre que no me genere otros problemas.

Usa micros y dime cuanto tiempo te quita la presentación en lcd de los datos actuales? Lo mismo si usaras Serial.

pot=analogRead(A0);       //leemos el valor del potenciometro
  valorPot = map(pot,0,1023,0,(5556));//Opcion 1
  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);

Hay tienes un gran responsable.
Si usar un TIMER eso no sería problema.
Esa es la solución a implementar según mi mirada.

con la LCD tarda aprox. 37500us y con Serial son 46800us

Okay, decime entonces como podes sincronizar 24 useg

Ahi tenes tu respuesta al post#1

SI no usas TIMERs simplemente no se puede lograr tu objetivo.

Entonces lo que me dices es que usando TimerOne.h haga que la interrupcion de cruce por cero me active los contadores para que estos hagan el disparo. Mas o menos asi:

void setup() 
{
  pinMode(triac, OUTPUT);
  attachInterrupt(digitalPinToInterrupt(3),pos, RISING);
  Timer1.attachInterrupt(1400);
}
void pos()
{
  Timer1.initialize(T_int);
}
void T_int()
{
  digitalWrite(T1, HIGH);
}

y asi sucesivamente para cada SCR. Pero esa librería tiene más de un timer?

masomenos como lo que hacen en este post How to "Multithread" an Arduino (Protothreading Tutorial) - Arduino Project Hub

No creo que sea lo mismo.
Necesitas sincronizar el TImer on la acción de cruce por cero y luego que este (Timer) accione en sus momentos los tiristores.
La acción de cruce por cero dispara el timer y luego este se encarga.

y eso como se haría? se hace igual con el timerone?

busca nick gammon interrupts