Salve a tutti, ho scritto un programma che servirebbe come inverter per il controllo di un motore asincrono trifase.
Provando a lanciare il programma, non capisco il perché si blocca su dei cicli for.
Ho provato a fare diverse modifiche e prove, ma nulla da fare.
Inserisco il codice, se qualcuno riesce ad aiutarmi.
Cordiali Saluti,
Fausto
byte sector;
byte index;
byte angle;
byte r=5; byte s=6; byte t=7;
unsigned long t1=0;
unsigned long t2=0;
unsigned long t0=0;
float m = 0.8;
unsigned long ts=3000; // 1/freq Pulse
unsigned long start_=0;
const unsigned long MAX_T= 0-1;
double t1d=0;double t2d=0;
// k1=(2/3) * sqrt(3) * sin(60-fi)
// k2=(2/3) * sqrt(3) * sin fi
double k1[]={ 0.88455, 0.5773, 0.2 };
double k2[]={ 0.2 , 0.5773, 0.88455 };
unsigned long delta_t=0;
//===========================================
void setup() {
Serial.begin (115200);
//Serial.println("start_");
pinMode (8,INPUT_PULLUP); //PORTB 0 direction
pinMode (13,OUTPUT); //PORTB 5 syncro
bitClear(PORTB,5);
pinMode (r,OUTPUT); bitClear(PORTD,r);
pinMode (s,OUTPUT); bitClear(PORTD,s);
pinMode (t,OUTPUT); bitClear(PORTD,t);
}
//-----------------wait-time----------------
void wait(unsigned long tt){
do {t2=micros();
if (t2 > start_) delta_t = t2-start_;
else delta_t = (MAX_T-start_)+t2+1;
} while (delta_t < tt); delta_t=0;
}
//===========================================
void loop() { new_turn:
for (sector=0;sector<6; ++sector){
for (angle=0; angle<3; ++angle) {
t1d=(double)k1[angle]* m * ts; t1=(unsigned long)t1d;
t2d=(double)k2[angle]* m * ts; t2=(unsigned long)t2d;
t0=ts-t1-t2;
Serial.print(sector);Serial.print(" "); Serial.println(angle);
wait(t0);
switch (sector){
case 0: bitSet(PORTB,5);
bitSet(PORTD,r); start_=micros(); wait(t1);
bitSet(PORTD,s); start_=micros(); wait(t2);
bitSet(PORTD,t); start_=micros(); wait(t0);
bitClear(PORTD,t);start_=micros(); wait(t2);
bitClear(PORTD,s);start_=micros(); wait(t1);
bitClear(PORTD,r);start_=micros();
break;
case 1: bitSet(PORTD,s); start_=micros(); wait(t1);
bitSet(PORTD,r); start_=micros(); wait(t2);
bitSet(PORTD,t); start_=micros(); wait(t0);
bitClear(PORTD,t);start_=micros(); wait(t2);
bitClear(PORTD,r);start_=micros(); wait(t1);
bitClear(PORTD,s);start_=micros();
break;
case 2: bitSet(PORTD,s); start_=micros(); wait(t1);
bitSet(PORTD,t); start_=micros(); wait(t2);
bitSet(PORTD,r); start_=micros(); wait(t0);
bitClear(PORTD,r);start_=micros(); wait(t2);
bitClear(PORTD,t);start_=micros(); wait(t1);
bitClear(PORTD,s);start_=micros();
break;
case 3: bitClear(PORTB,5);
bitSet(PORTD,t); start_=micros(); wait(t1);
bitSet(PORTD,s); start_=micros(); wait(t2);
bitSet(PORTD,r); start_=micros(); wait(t0);
bitClear(PORTD,r);start_=micros(); wait(t2);
bitClear(PORTD,s);start_=micros(); wait(t1);
bitClear(PORTD,t);start_=micros();
break;
case 4: bitSet(PORTD,t); start_=micros(); wait(t1);
bitSet(PORTD,r); start_=micros(); wait(t2);
bitSet(PORTD,s); start_=micros(); wait(t0);
bitClear(PORTD,s);start_=micros(); wait(t2);
bitClear(PORTD,r);start_=micros(); wait(t1);
bitClear(PORTD,t);start_=micros();
break;
default: bitSet(PORTD,r); start_=micros(); wait(t1);
bitSet(PORTD,t); start_=micros(); wait(t2);
bitSet(PORTD,s); start_=micros(); wait(t0);
bitClear(PORTD,s);start_=micros(); wait(t2);
bitClear(PORTD,t);start_=micros(); wait(t1);
bitClear(PORTD,r);start_=micros();
Serial.println("end");
}
//======================================================
}
} goto new_turn;
}