Hola,estoytratandodehaceruncircuitodeatenuaciónquesepuedacontrolaratravésdelnúmerodecrucesporcero.Sevealgocomoesto(fig1)dimmingckt.Estoytratandodeactivarlapuertadeltriacparadarlepotenciavariablealacarga.Miprogramageneraleselsiguiente:
volatilebytecount=0;intAC_LOAD=3;intdimming=128;voidsetup(){Serial.begin(9600);Serial.println("Zero Cross count");
pinMode(AC_LOAD, OUTPUT);
attachInterrupt(0, zero_crosss_int, RISING);
}
void zero_crosss_int()
{
count++;
firing();
}
void firing()
{
int dimtime = (75*dimming);
delayMicroseconds(dimtime);
digitalWrite(AC_LOAD, HIGH);
delayMicroseconds(10);
digitalWrite(AC_LOAD, LOW);
}
void loop() {
delay(1000);
noInterrupts();
byte zc = count;
count = 0;
interrupts();
Serial.print("n=");
Serial.print(zc);
Serial.println(" ZC per second");
if(zc>100)
{
dimming=0.50*128;
}
else{
dimming=0.90*128;
}
}
Pero el problema es: cuando cuento el cruce por segundo por segundo, funciona bien, cuando disparo el triac solo, también funciona bien, pero cuando intento controlar el disparo según el número de cruces por segundo como se muestra a continuación, Aparece un problema.
if(zc>100)
dimming=0.5*128;
else
dimming=0.9*128;
El problema es que si llamo a la función firing () dentro de void zero_crosss_int () (como se muestra a continuación), el número de cruces por segundo (lo que quiero) aumenta más de lo debido. Creo que esto se debe a la demora de microsegundos () dentro de la activación () que está causando algún retraso y hace que el tiempo sea más de 1 segundo.
void zero_crosss_int()
{
count++;
firing();
}
¿Puede por favor sugerir cómo puedo hacer ambas cosas (calcular el cruce por cero por segundo, así como disparar el traic) a la vez? Gracias.