Buenas a todos!!
Veréis estoy trabajando en el control de velocidad de un motor trifásico mediante la técnica SPWM (sine pulse width modulation), ello consiste en comparar una señal triangular con una senoidal para así obtener la tensión de disparo de los transistores. A grosso modo lo que tenemos son 2 señales tipo boolean, entre las cuáles debe haber un tiempo muerto de unos 4 microsegundos, para así evitar cortocircuitos. Lo que queríamos saber es cuánto tiempo puede tardar en hacer la conmutación de los pines digitales, ya que(como se aprecia en la captura adjuntada más abajo), tarda unos 10 microsegundos en realizar dicha conmutación. Actualmente estamos empleando una placa Arduino Mega 2560 R3. Os dejo el código para que podáis ver mas o menos cómo estamos intentando hacerlo. Saludos y gracias de antemano.
//Funcion SPWM con 2 señales
float Atri=5; //Amplitud triangular
float Ttri=0.001; //Periodo triangular
float t2=0; //Variable de apoyo funcion triangular
unsigned long int t1=0; //Variable de apoyo funcion triangular
float Tiempo=0; //Variable tiempo
boolean S1 =false; //Variable tipo boolean
boolean S2 =false; //Variable tipo boolean
boolean flag1=false;
boolean Aflag1=false;
double ysin=0; // Funcion seno 1
double ytri=0; // Funcion triangular
const float pi=3.1416; //Constante pi
float fnom=50; //Frecuencia nominal
float Vnom=5; //Tension nominal
float fsin=0; // Frecuencia senoidal
float Vsin=0; //Tension senoidal
////////////////////////////////*INICIAMOS EL SETUP*/////////////////////////
void setup()
{
Serial.begin(9600); // Inicialización del modulo Serial.
}
//////////////////////////*INICIAMOS EL PROGRAMA PRINCIPAL*///////////////////////////////
void loop()
{
Tiempo= (double (micros()))/(1000000);
Vsin=Vnom;
t1=Tiempo/Ttri; //Iniciamos la funcion triangular
t2=Tiempo-t1*Ttri;
if (t2 <= (Ttri/2))
{
ytri=2*Atri*t2/Ttri-Atri/2;
}
else
{
ytri=-2*Atri*t2/Ttri + 3*Atri/2;
}
ysin=Vsin*sin(2*pi*fsin*Tiempo); // Iniciamos la funcion senoidal 1
if (ysin > ytri) // Comparamos la funcion senoidal y la triangular
{
flag1=true;
if (flag1 != Aflag1)
{ S2=!S2;
digitalWrite(29,S2);
delayMicroseconds(2);
S1=!S1;
digitalWrite(28,S1);
}
}
else
{
flag1=false;
if (flag1 != Aflag1)
{
S1=!S1;
digitalWrite(28,S1);
delayMicroseconds(2);
S2=!S1;
digitalWrite(29,S2);
}
}
Aflag1=flag1;
}
