Плавний пуск двигуна постійного струму з використанням таймерів
Серія-статей: Ардуїно, використання двигунів постійного струму #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()
не дає використовувати паралельно
ніяких інших дій, тому реалізуємо плавний пуск за допомогою таймерів, як при {{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(); // Початок нового кроку
}
}
Тепер двигун розганяється плавно, причому паралельно з розгоном можна виконувати будь-які інші дії