#define FREQUENCY 2
//#define FEEDBACK_TARGET 512
short period = 1000 / FREQUENCY;
#ifdef FEEDBACK_TARGET
byte power = 0;
#else
byte power = 255;
#endif
// x must be in degrees between 0 and 180
float fastSin(float x) {
x *= 180 - x;
float sine = 4 * x;
sine /= 40500 - x;
return sine;
}
void setup() {
digitalWrite(9, LOW);
digitalWrite(10, LOW);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
}
void loop() {
byte a = 0, b = 0; // PWM outputs
short angle = (millis() % period) * 360 / period;
#ifdef FEEDBACK_TARGET
short feedback = analogRead(A0);
if (feedback < FEEDBACK_TARGET && power < 255) {
power++;
} else if (feedback > FEEDBACK_TARGET && power > 0) {
power--;
}
#endif
if (angle < 180) {
a = fastSin(angle) * power;
} else {
angle -= 180;
b = fastSin(angle) * power;
}
analogWrite(9, a);
analogWrite(10, b);
}