float phi = 0; // degrees
float phir = 0; // radians (for sin func to calculate pwm)
int wave = 0;
float castprac = 0; // duty cycle (from 0 to 10000 parts)
float celcasprac = 0;
float caspraczap = 0; // duty cycle on-time
float frequencypwm = 0;
unsigned long past = 0;
float ampli = 0;
void setup() {
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
Serial.begin(9600);
frequencypwm = 1000;
}
void loop() {
if(micros() - past >= (1000000.0 / (frequencypwm))) {
dowave((analogRead(A0) / 10.0), ((analogRead(A1) * 0.001)));
frequencypwm = 2000;
past = micros();
}
dopwm();
}
void dopwm() {
unsigned long timefull = celcasprac * 10000;
celcasprac = (1000000.0 / (frequencypwm));
float casjedndiel = celcasprac / 10000.0;
//Serial.println(casjedndiel);
caspraczap = casjedndiel * castprac;
if(((micros() * 10000) % timefull) <= (caspraczap * 10000)) {
if(sin(phir) > 0) {
fastdwrtpd(3, LOW);
fastdwrtpd(2, HIGH);
} else if(sin(phir) < 0) {
fastdwrtpd(2, LOW);
fastdwrtpd(3, HIGH);
}
} else if(((micros() * 10000) % timefull) > (caspraczap * 10000)) {
if(sin(phir) > 0) {
fastdwrtpd(2, LOW);
fastdwrtpd(3, LOW);
} else if(sin(phir) < 0) {
fastdwrtpd(2, LOW);
fastdwrtpd(3, LOW);
}
}
}
void dowave(int frekvlny, float velkost) {
unsigned long cas = micros();
float casvlny = 1000000.0 / (float)frekvlny;
float caspolvlny = (float)casvlny / 2.0;
float casvovlne = fmod(cas, casvlny);
float castvlny = ((float)casvovlne / (float)casvlny);
phi = 360 * castvlny;
phir = (phi * 71.0) / 4068.0;
castprac = (10000 * (velkost * (abs(sin(phir)))));
}
void fastdwrtpd(uint8_t vyvod, uint8_t hodnota) { // only used for port D (PD0 - PD7)
if(hodnota == HIGH) {
PORTD = PORTD | 1 << vyvod;
} else if (hodnota == LOW) {
PORTD = PORTD & (~(1 << vyvod));
}
}