Плавный пуск двигателя постоянного тока с использованием таймеров
Серия-статей: Arduino, использование двигателей постоянного тока #2
Решить проблему пусковых токов можно плавным повышением скорости. Т.е. вместо мгновенного разгона двигатель будет разгоняться постепенно, при этом сглаживая пик потребления тока в момент пуска.
Подключим двигатель к motor-shield на безе L298P, как и в предыдущем примере:
Не забываем, что двигатель не имеет обатной связи, поэтому для контроля текущей скорости воспользуемя дополнительной переменной motorPower
byte E1=5; // Управление скоростью двигателя – подключение к 5 выходу
byte I1=4; // Управление направлением вращения – подключение к 4 выходу
unsigned long StartTimer; // Таймер для плавного пуска
int StartTimeStep=2; // Интервал изменения мощности двигателя, в мс
int StartPowerStep=1; // Один шаг изменения мощности двигателя
int motorPower; // Мощность двигателя
void setup()
{
pinMode (E1, OUTPUT); // Задаем работу соответствующих пинов в качестве выходов
pinMode (I1, OUTPUT);
motorPower=0; // Начальная мощность - 0
}
void loop()
{
digitalWrite (I1, HIGH); // На вывод I1 подан высокий логический уровень, мотор вращается в одну сторону
for (motorPower=0;motorPower<255;motorPower+=StartPowerStep) // Увеличиваем скорость до тех пор, пока не достигнем максимума
{
analogWrite (E1, motorPower); // На выводе ENABLE управляющий сигнал с новой скоростью
delay(StartTimeStep);
}
}
Теперь двигатель разгоняется более плавно. Разгон от 0 до 255 займет почти пол секунды, а установить интервал изменения в 1 мс – то вообще за четверть секунды. Невооруженным глазом разница не очень заметна. Но такое разгон намного более щадящий для силовой части. К тому-же скорость разгона мы можем регулировать, добиваясь нужного ускорения.
Вот только использование delay()
не дает использовать параллельно
никаких других действий, поэтому реализуем плавный пуск с помощью таймеров, как при плавном движеним сервоприводов.
byte E1=5; // Управление скоростью двигателя – подключение к 5 выходу
byte I1=4; // Управление направлением вращения – подключение к 4 выходу
unsigned long StartTimer; // счетчик время для плавного пуска
int StartTimeStep=2; // Интервал изменения мощности двигателя, в мс
int StartPowerStep=1; // Один шаг изменения мощности двигателя
int motorPower; // Мощность двигателя
void setup()
{
pinMode (E1, OUTPUT); // Задаем работу соответствующих пинов в качестве выходов
pinMode (I1, OUTPUT);
motorPower=0; // Начальная мощность - 0
}
void loop()
{
digitalWrite (I1, HIGH); // На вывод I1 подан высокий логический уровень, мотор вращается в одну сторону
if (motorPower<255) // Увеличиваем скорость до тех пор, пока не достигнем максимума
if ((millis()-StartTimer)>= StartTimeStep) // Проверяем, сколько прошло с последнего изменения скорости
// если больше, чем заданный интервал – увеличим скорость еще на один шаг
{
motorPower+= StartPowerStep; // увеличение скорости
analogWrite (E1, motorPower); // На выводе ENABLE управляющий сигнал с новой скоростью
StartTimer=millis(); // Начало нового шага
}
}
Теперь двигатель разгоняется плавно, причем параллельно с разгоном можно выполнять любые другие действия