Det är inte säkert att det är särskilt korrekt.
Jag vet inte riktigt hur du vill ha det, så jag försökte utgå ifrån vad som var.
Ett snyggare sätt är att räkna på det. Jag är osäker på om man vill ha mitten av on-tiden i fas eller början.
Om man utgår ifrån mitten så borde det bli något i stil med:
- Kod: Markera allt
// här sätts namnen på utgångar och ingång.
int fas1p = 8; // fas 1 plus till ben 8
int fas1m = 7; // fas 1 minus till ben 7
int fas2p = 6; // fas 2 plus till ben 6
int fas2m = 5; // fas 2 minus till ben 5
int fas3p = 4; // fas 3 plus till ben 4
int fas3m = 3; // fas 3 minus till ben 3
void setup() {
// put your setup code here, to run once:
pinMode(fas1p, OUTPUT); // här fastställs benen att bli utgångar
digitalWrite(fas1p, LOW); // här ställs utgången aktivt låg.
pinMode(fas2p, OUTPUT); // osv
digitalWrite(fas2p, LOW);
pinMode(fas3p, OUTPUT);
digitalWrite(fas3p, LOW);
pinMode(fas1m, OUTPUT);
digitalWrite(fas1m, LOW);
pinMode(fas2m, OUTPUT);
digitalWrite(fas2m, LOW);
pinMode(fas3m, OUTPUT);
digitalWrite(fas3m, LOW); // nu är alla utgångar satta till aktivt låg (offläge)
}
unsigned long start;
unsigned long actTime;
//Räknar ut alla tider för att slippa lägga CPU-tid på det i loopen
int ontime=5000;
int trettigrad=1667; //30 grader vid 50 Hz, hjälper till att räkna tider.
int fas1pPeakTime=trettigrad*3; //Mitten av tiden som fas 1 ska vara positiv (5000us)
int fas1mPeakTime=trettigrad*9;//Mitten av tiden från start som fas 1 ska vara negativ (15000us)
int fas2pPeakTime=trettigrad*7;
int fas2mPeakTime=trettigrad*1;
int fas3pPeakTime=trettigrad*11;
int fas3mPeakTime=trettigrad*5;
int fas1pStart = fas1pPeakTime-ontime/2;
int fas1pStop = fas1pPeakTime+ontime/2;
int fas1mStart = fas1mPeakTime-ontime/2;
int fas1mStop = fas1mPeakTime+ontime/2;
int fas2pStart = fas2pPeakTime-ontime/2;
int fas2pStop = fas2pPeakTime+ontime/2;
//int fas2mStart = fas2mPeakTime-ontime/2;
int fas2mStart = 20000+fas2mPeakTime-ontime/2;
int fas2mStop = fas2mPeakTime+ontime/2;
int fas3pStart = fas3pPeakTime-ontime/2;
//int fas3pStop = fas3pPeakTime+ontime/2;
int fas3pStop = fas3pPeakTime+(ontime/2)-20000;
int fas3mStart = fas3mPeakTime-ontime/2;
int fas3mStop = fas3mPeakTime+ontime/2;
void loop() {
// put your main code here, to run repeatedly:
//start=millis();
int i;
for(i=0;i<5;i++){
actTime=0;
start=micros();
while(actTime <= 20000){ //Kollar att tiden sedan start inte passerat en period (20ms)
actTime=micros()-start;
//actTime=millis()-start;
if(actTime >= fas1pStart && actTime <= fas1pStop)
digitalWrite(fas1p,HIGH); // sätter först Tr 1 minussida i offläge Lågsida 1 OFF
else
digitalWrite(fas1p,LOW);
if(actTime >= fas1mStart && actTime <= fas1mStop)
digitalWrite(fas1m, HIGH);
else
digitalWrite(fas1m, LOW);
// if(actTime >= fas3pStart && actTime <= fas3pStop)
// digitalWrite(fas3p, HIGH);
// else
// digitalWrite(fas3p, LOW);
//Special när ontid är större än 60 grader, starttid blir negativ
if(actTime <= fas3pStart && actTime >= fas3pStop)
digitalWrite(fas3p, LOW);
else
digitalWrite(fas3p, HIGH);
if(actTime >= fas3mStart && actTime <= fas3mStop)
digitalWrite(fas3m, HIGH);
else
digitalWrite(fas3m, LOW);
// if(actTime >= fas2mStart && actTime <= fas2mStop)
// digitalWrite(fas2m, HIGH);
// else
// digitalWrite(fas2m, LOW);
if(actTime <= fas2mStart && actTime >= fas2mStop)
digitalWrite(fas2m, LOW);
else
digitalWrite(fas2m, HIGH);
if(actTime >= fas2pStart && actTime <= fas2pStop)
digitalWrite(fas2p, HIGH);
else
digitalWrite(fas2p, LOW);
}
}
while(true){}
}
Det ligger i en for-loop som kör 5 gånger för att det ska fungera i simulatorn.
Den är bara att ta bort, eller ändra i++ till i så borde den snurra i evighet.
Eller ta bara bort while(true){} i slutet.
Det är ganska enkelt om du vill labba med olika on-tider.
Dock blir det speciellt när on-tiden passerar 60 grader (3333 us).
Koden är skriven för att det ska vara längre ontider, jag kommenterade bort koden för kortare.