// 3Phase Generator benutzt TimerOne Library
// Periodendauer T wird in 6 teile zerteilt T/6
// 120 Grad Phasenverschiebung ist 2/6 T
//
//
#include <TimerOne.h>
bool stateL1 = LOW;
bool stateL2 = LOW;
bool stateL3 = HIGH;
const int pinL1 = 5;
const int pinL2 = 6;
const int pinL3 = 7;
int LED13 = 13;
int counter = 1;
unsigned int poti;
unsigned int poti_oldvalue;
unsigned long f;
char buf[100]; // für die Ausgabe mit sprintf
void setup() {
//Serial.begin(115200);
Serial.begin(9600);
Serial.println("\n\n\n3 Phase Generator A.Burger 2024 v1.00\n");
pinMode(LED13, OUTPUT);
pinMode(pinL1, OUTPUT);
pinMode(pinL2, OUTPUT);
pinMode(pinL3, OUTPUT);
digitalWrite(pinL1,stateL1);
digitalWrite(pinL2,stateL2);
digitalWrite(pinL3,stateL3);
poti = getPoti();
poti_oldvalue = poti;
f=getFrequency(poti);
printValue(poti,f);
Timer1.initialize(f); // Timer starten
Timer1.attachInterrupt(timer_isr_L1);
}
void timer_isr_L1(void) {
switch (counter){
case 1: stateL1 = !stateL1; digitalWrite(pinL1,stateL1); break;
case 3: stateL2 = !stateL2; digitalWrite(pinL2,stateL2); break;
case 2: stateL3 = !stateL3; digitalWrite(pinL3,stateL3); break;
case 4: stateL1 = !stateL1; digitalWrite(pinL1,stateL1); break;
case 6: stateL2 = !stateL2; digitalWrite(pinL2,stateL2); break;
case 5: stateL3 = !stateL3; digitalWrite(pinL3,stateL3); break;
}
if(++counter>6) counter = 1;
}
void loop() {
if(poti != poti_oldvalue) { // Potiwert hat sich geändert
poti_oldvalue = poti;
f = getFrequency(poti);
printValue(poti,f);
Timer1.setPeriod(f);
digitalWrite(LED13,LOW);
delay(1000);
digitalWrite(LED13,HIGH);
}
poti = getPoti();
}
unsigned long getFrequency(unsigned int poti) {
float frequency;
frequency = (float) poti/10.0; // 1/10 von poti davon
frequency = 1/frequency; // Periodendauer berechnen
frequency = frequency*1000000; // In Mikro Sekunden umrechnen
frequency = frequency/6; // Ich sechs Abschnitte teilen
return (unsigned long)frequency;
}
unsigned int getPoti() {
unsigned int p;
p = analogRead(A0);
p = map(p, 0, 1023, 1, 1024);
return p;
}
void printValue(unsigned int poti, unsigned long frequency){
float p;
char buff[10];
p=(float)poti/10.0;
dtostrf(p, 4, 1, buff);
//Serial.println(p);
sprintf(buf, "%lu: New poti value: %s Hz, Frequency value:%lu us (%lu)", micros(), buff, frequency, frequency*6 );
Serial.println(buf);
}