Есть задача создать программу, которая будет управлять шаговым двигателем.. Двигатель должен тягать
ть воздушную заслонку карбюратора на генераторе.
За основу взял алгоритм Калинникова Николая. Но программа работает не нормально.. Пропуски шагов и самопроизвольно меняет направление вращения.
На осциллографе. Это в протеусе, но на живом тоже самое.. А вот по такому алгоритму все пучком..
Код: Выделить всё
#define A 4
#define B 5
#define C 6
#define D 7
int delStep = 3;
void setup()
{
pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
pinMode(C, OUTPUT);
pinMode(D, OUTPUT);
}
void loop()
{
for (int i = 0; i < 20; i++) rotateRH(); // вниз на 20мм (полушаг)
for (int i = 0; i < 20; i++) rotateLH(); // вверх на 20мм
stopStep(); // вырубаем обмотки
while (1); // закончили
}
// +++++ ОСНОВНЫЕ ФУНКЦИИ +++++
void stopStep() { // выключение двигателя
StepH(0, 0, 0, 0);
}
void rotateRH() // 48 шагов с полушагами по часовой стрелке = 1 оборота оси = 1 мм движения штока вверх
{
for (byte i = 0; i < 6; i++) {
StepH(1, 0, 1, 0);
StepH(0, 0, 1, 0);
StepH(0, 1, 1, 0);
StepH(0, 1, 0, 0);
StepH(0, 1, 0, 1);
StepH(0, 0, 0, 1);
StepH(1, 0, 0, 1);
StepH(1, 0, 0, 0);
}
}
void rotateLH() // 48 шагов с полушагами по часовой стрелке = 1 оборота оси = 1 мм движения штока вверх
{
for (byte i = 0; i < 6; i++) {
StepH(1, 0, 0, 1);
StepH(0, 0, 0, 1);
StepH(0, 1, 0, 1);
StepH(0, 1, 0, 0);
StepH(0, 1, 1, 0);
StepH(0, 0, 1, 0);
StepH(1, 0, 1, 0);
StepH(1, 0, 0, 0);
}
}
void StepH(boolean a, boolean b, boolean c, boolean d) // один шаг
{
digitalWrite(A, a);
digitalWrite(B, b);
digitalWrite(C, c);
digitalWrite(D, d);
delay(delStep / 2);
}