long previousMillis = 0; //Предыдущее срабатывания счетчика интервала
long interval = 1; //Интервал в милисекундах (влияет на скорость)
long increment = 1; //шаг увеличения угла
int Phase1,Phase2,Phase3; //Текущее значение уровня фаз
double pi = 3.1415926535; //Можно только гадать что это
//****************************************************************************************************************************
void setup() //Типа инициализация
{
//Открываем аналоговые порты на запись
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
}
//****************************************************************************************************************************
void Takt() //Тут обработка логичесткового калибровоного такта каждый interval
{
//Гоняем интервал фаз от 0 до 360 (если гонять обратно двигатель будет крутиться обратно)
CurInt=CurInt+increment;
if (CurInt >= 360) CurInt = 0;
//Математика расчета фаз
Phase1 = sin(CurInt*pi/180)*127+128; //Фаза 1 должна описывать траекторию синусойды для достижения максимальной мощьности двигателя
Phase2 = sin((CurInt+120)*pi/180)*127+128; //Фаза 2 находится также как и первая со смещением в 120 градусов
Phase3 = sin((CurInt+240)*pi/180)*127+128; //Фаза 3 находится также как и первая со смещением в 240 градусов или со смещением в 120 градусов от второй
//Записываем
analogWrite(9, Phase1);
analogWrite(10, Phase2);
analogWrite(11, Phase3);
}
//****************************************************************************************************************************
void loop() // тут Физический такт
{
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
previousMillis = previousMillis + interval;
Takt();
}
}