Skip to content

Instantly share code, notes, and snippets.

@kawashirov
Last active September 29, 2015 02:10
Show Gist options
  • Save kawashirov/0d7b3026e161ef1e88fa to your computer and use it in GitHub Desktop.
Save kawashirov/0d7b3026e161ef1e88fa to your computer and use it in GitHub Desktop.
const int pin_a = 2;
const int pin_b = 3;
const int pin_c = 4;
const int pause_init = 16380;
double pause = pause_init;
int pause_lim = 99;
void setup() {
pinMode(pin_a, OUTPUT);
pinMode(pin_b, OUTPUT);
pinMode(pin_c, OUTPUT);
digitalWrite(pin_a, 0);
digitalWrite(pin_b, 0);
digitalWrite(pin_c, 0);
}
__attribute__((always_inline))
// https://gcc.gnu.org/wiki/FloatingPointMath
__attribute__((optimize("no-math-errno")))
__attribute__((optimize("unsafe-math-optimizations")))
__attribute__((optimize("finite-math-only")))
__attribute__((optimize("no-signed-zeros")))
static inline void wait() {
// 1111 мкс это 3000 RPM
pause *= pause > 1111 ? 0.99 : 0.99994;
if (pause < pause_lim) pause = pause_lim;
delayMicroseconds(int(pause));
}
void loop() {
// Избавляет от траты времени на вызов loop()
// Один цикл - 1/3 оборота: в двигателе 9 катушек, по 3 на кадую фазу,
// полное переключение одной фазы поворачивает ротор на 40 градусов
// (с промежуточными режимами - на 20 градусов).
while(true) {
digitalWrite(pin_a, 1);
digitalWrite(pin_b, 0);
digitalWrite(pin_c, 0);
wait();
digitalWrite(pin_a, 1);
digitalWrite(pin_b, 1);
digitalWrite(pin_c, 0);
wait();
digitalWrite(pin_a, 0);
digitalWrite(pin_b, 1);
digitalWrite(pin_c, 0);
wait();
digitalWrite(pin_a, 0);
digitalWrite(pin_b, 1);
digitalWrite(pin_c, 1);
wait();
digitalWrite(pin_a, 0);
digitalWrite(pin_b, 0);
digitalWrite(pin_c, 1);
wait();
digitalWrite(pin_a, 1);
digitalWrite(pin_b, 0);
digitalWrite(pin_c, 1);
wait();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment