Плавний пуск двигуна постійного струму з використанням таймерів

Серія-статей: Ардуїно, використання двигунів постійного струму #2

При керуванні двигунами постійного струму іноді виникає необхідність різкої зміни швидкості (наприклад пуск з 0% на 100% потужності або зміна швидкості на протилежну). Але такий режим роботи двигуна вимагає дуже високих струмів – у кілька разів більше, ніж простий рух. Якщо, наприклад, при обертанні з постійною швидкістю двигун споживає струм порядку 500мА, то в момент пуску це значення може досягати 2-3 А. Через це доводиться застосовувати потужнішу підсистему живлення та контролер.

Вирішити проблему пускових струмів можна плавним підвищенням швидкості. Тобто. замість миттєвого розгону двигун розганятиметься поступово, при цьому згладжуючи пік споживання струму в момент пуску.

Підключимо двигун до motor-shield на безе L298P, як і в попередньому прикладі: Підключення двигуна постійного струму до Arduino через драйвер 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() не дає використовувати паралельно

ніяких інших дій, тому реалізуємо плавний пуск за допомогою таймерів, як при {{a|https://techi-news.com/%D0%90%D1%80%D0%B4%D1%83%D1%97%D0%BD%D0%BE/%D0%9D%D0%B5%D0%B7%D0%B0%D0%BB%D0%B5%D0%B6%D0%BD%D0%B5_%D0%BA%D0%B5%D1%80%D1%83%D0%B2%D0%B0%D0%BD%D0%BD%D1%8F_%D0%BA%D1%96%D0%BB%D1%8C%D0%BA%D0%BE%D0%BC%D0%B0_%D1%81%D0%B5%D1%80%D0%B2%D0%BE%D0%BF%D1%80%D0%B8%D0%B2%D0%BE%D0%B4%D0%B0%D0%BC%D0%B8_%D0%A2%D0%B0%D0%B9%D0%BC%D0%B5%D1%80%D0%B8|плавним рухом сервоприводів} }.

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(); // Початок нового кроку

}

}

Тепер двигун розганяється плавно, причому паралельно з розгоном можна виконувати будь-які інші дії

Еще:

Подключаем двигатель постоянного тока. Микросхема L298P (Arduino, использование двигателей постоянного тока #1)
Плавный пуск двигателя постоянного тока с использованием таймеров (Arduino, использование двигателей постоянного тока #2)
Создание класса для работы с двигателем постоянного тока (Arduino, использование двигателей постоянного тока #3)
Создание собственной библиотеки управления двигателем постоянного тока (Arduino, использование двигателей постоянного тока #4)