Функцій управління мотором в програмі MicroC, звичайно, немає Ні, оскільки немає мікроконтролерів з вбудованим модулем управління мотором Але в керівництві є текст файлу заголовка, який можна скопіювати і, як це рекомендується, розмістити в директорії Include встановленої програми MicroC

Перша неприємність – немає такої директорії Її можна, напевно, створити, але простіше зберегти цей файл (motorh) у папці проекту

Друга неприємність – при спробі оттранслировать текст програми компілятор залишається незадоволений файлом motorh

Рис 40 4 Перша трансляція програми перевірки руху

Заглянувши в бібліотеку MicroC, доводиться погодитися – немає такої бібліотечної функції

Pwm1_Change_Duty(speed)

Рис 405 Бібліотечні функції модуля PWM

Помінявши функцію на Pwm1_Set_Duty (speed), можна транслювати програму:

#include “motorh” void main()

{

Sound_Init (& PORTC, 0) / / Ініціалізувати звуковий порт while (1)

{

Forward (255) / / Команда ВПЕРЕД Delay_ms (2000)

Sound_play (100,500) / / Звуковий сигнал 1 кГц на виведенні RC0 S_Left (255) / / Команда повороті вліво

Delay_ms(800)

Sound_play (100,500) / / Звуковий сигнал 1 кГц на виведенні RC0 Forward (255) / / Команда ВПЕРЕД

Delay_ms(2000)

Sound_play (100,500) / / Звуковий сигнал 1 кГц на виведенні RC0 S_Right (255) / / Команда ПОВОРОТ ВПРАВО

Delay_ms(800)

Sound_play (100,500) / / Звуковий сигнал 1 кГц на виведенні RC0 Forward (255) / / Команда ВПЕРЕД

Delay_ms(2000)

Sound_play (100,500) / / Звуковий сигнал 1 кГц на виведенні RC0 Backward (255) / / Команда НАЗАД

Delay_ms(1000)

Sound_play (100,500) / / Звуковий сигнал 1 кГц на виведенні RC0 Motor_Stop / / Зупинити обидва двигуни

}

}

Файл motorh виглядає тепер так:

char motor_duty_ = 127 / / Ширина імпульсу ШІМ за замовчуванням 50% char motor_init_ = 0 / / Початковий стан

// *** Motor A *****

// PD0 ====> 1A

// PD1 ====> 1B

// PC2 ====> 1E (PWM1)

// *** Motor B *****

// PB1 ====> 2A

// PB2 ====> 2B

// PC1 ====> 2E (PWM2)

//****************************************************

/ / ********* Функція ініціалізації двигуна ****************

//**************************************************** void Motor_Init()

{

if (motor_init_ == 0) / / Це перший виклик функції

{

motor_init_ = 1 / / Стан

ANSELHF0 = 0 / / RB1 ==> Цифровий Введення / Висновок ANSELHF2 = 0 / / RB2 ==> Цифровий Введення / Висновок TRISBF1 = 0 / / Двигун Б 2A

TRISBF2 = 0 / / Двигун Б 2B TRISDF0 = 0 / / Двигун А 1A TRISDF1 = 0 / / Двигун А 1B

Pwm1_Init (5000) / / Ініціалізація ШІМ1 => 1E Pwm2_Init (5000) / / Ініціалізація ШІМ2 => 2E

}

}

//****************************************************

//****************************************************

/ / ********* Управління шириною імпульсу *******************

//**************************************************** void Change_Duty(char speed)

{

if (speed = motor_duty_) / / Отримали те ж значення швидкості

{

motor_duty_ = speed / / Зберегти поточне значення швидкості Pwm1_Set_Duty (speed) / / Двигун A

Pwm2_Set_Duty (speed) / / Двигун B

}

}

//****************************************************

/ ********** Двигун A команда ВПЕРЕД ******** / void Motor_A_FWD ()

{

Pwm1_Start() PORTDF0 =0

PORTDF1 =1

}

/************************************/

/ ****** Двигун B команда ВПЕРЕД **** / void Motor_B_FWD ()

{

Pwm2_Start()

PORTBF1 =0

PORTBF2 =1

}

/************************************/

/ ******** Двигун A команда НАЗАД ***** / void Motor_A_BWD ()

{

Pwm1_Start() PORTDF0 =1

PORTDF1 =0

}

/************************************/

/ ******** Двигун B команда НАЗАД ***** / void Motor_B_BWD ()

{

Pwm2_Start() PORTBF1 =1

PORTBF2 =0

}

/************************************/

/ ******* Двигун A вимкнений ********** / void Motor_A_Off ()

{

Pwm1_Stop() PORTDF0 =0

PORTDF1 =0

}

/************************************/

/ ********** Двигун B вимкнений ******* / void Motor_B_Off ()

{

Pwm2_Stop() PORTBF1 =0

PORTBF2 =0

}

/************************************/

/ ******* Команда РУХ ВПЕРЕД ****** / void Forward (char speed)

{

Motor_Init() Change_Duty(speed) Motor_A_FWD() Motor_B_FWD()

}

/************************************/

/ ****** Команда РУХ НАЗАД ******** / void Backward (char speed)

{

Motor_Init() Change_Duty(speed) Motor_A_BWD() Motor_B_BWD()

}

/************************************/

/ ***** Команда ПОВОРОТ НАПРАВО ******** / void S_Right (char speed)

{

Motor_Init() Change_Duty(speed) Motor_B_FWD() Motor_A_BWD()

}

/************************************/

/ ******** Команда ПОВОРОТ ЛІВОРУЧ ****** / void S_Left (char speed)

{

Motor_Init() Change_Duty(speed) Motor_B_BWD() Motor_A_FWD()

}

/************************************/

/ ********** Команда СТОП ************ / void Motor_Stop ()

{

Motor_Init() Change_Duty(0) Motor_A_Off() Motor_B_Off()

}

/************************************/

Після трансляції програми її можна завантажити в мікроконтролер Залишається перевірити правильність підключення двигунів У керівництві говориться про правому та лівому двигуні, але при складанні не дуже ясно, де право, а де ліво

Програма вказує на те, що перший поворот повинен бути наліво Але робот вперто повертає праворуч І перемикання розємів мені не дуже допомагає Що ж, не миттям, так катанням Я виправляю у файлі motorh ті два розділи, що відносяться до повороту (міняю В на А і навпаки):

/ ***** Команда ПОВОРОТ НАПРАВО ******** / void S_Right (char speed)

{

Motor_Init() Change_Duty(speed) Motor_B_FWD() Motor_A_BWD()

}

/ ******** Команда ПОВОРОТ ЛІВОРУЧ ****** / void S_Left (char speed)

{

Motor_Init() Change_Duty(speed) Motor_B_BWD() Motor_A_FWD()

}

Тепер перший поворот робот робить наліво Попутно в основній програмі я виправляю функцію звукового сигналу: Sound_play (100,500)

Першу букву роблю заголовної (може бути, це не має ніякого значення), А тривалість сигналу збільшую до половини секунди Пятдесят мілісекунд .. не впевнений, що звук зявиться

Може бути, я і зануда, але тепер робот їздить, бібікает, а з поворотами, якщо надалі виявиться, що я неправий, то переробити файл, повернувши його до первісного вигляду, не складе труднощів Втім, і керівництво конструктора IE-ROBOPICA радить в даний момент виконати ті ж операції, що я проробив, щоб привести команди і їх виконання у повну відповідність

Повороти робот може виконувати двома способами: перший спосіб – вимкнути один двигун і включити інший другий спосіб – включити двигуни різноспрямовано Різниця в тому, де буде точка, навколо якої поворот виконується, вісь обертання У першому випадку в центрі гусениці вимкненого двигуна, в другому випадку в центрі платформи робота

Другий спосіб і описаний у файлі motorh Якщо вам знадобиться змінити спосіб повороту, то ні що не заважає вам створити в програмі нову функцію з новим імям, яка працюватиме, використовуючи файл motorh, але так, як вам більше подобається

Є деяка незручність при програмуванні: для програмування потрібно включити живлення плати, що включає і двигуни Можна витягувати розєми двигунів при програмуванні, а й розєми витягувати не надто зручно Розумно зробити якийсь пєдестал для робота, на який його відправляти при програмуванні Досить того, щоб гусениці були в повітрі і не чіплялися за підставку Можна використовувати, скажімо, підходить за розмірами коробочку від старої взуттєвої губки

Щоб ще раз розібратися в управлінні двигунами, проробимо кілька експериментів за компютером

У програмі Flowcode я зберу просту програму: при натисканні на першу кнопку мотор буде обертатися в одну сторону, при натисненні на іншу кнопку він змінить напрямок обертання на протилежне

Рис 406 Програма управління обертанням двигуна

Моделюючи програму в ISIS (Proteus), можна переконатися, що двигун обертається в обраному напрямку

Рис 407 Моделювання програми в Proteus

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

Рис 408 Діалог властивостей двигуна

Можна додати транзисторні ключі Скажімо, так:

Рис 409 Використання транзисторних ключів

При такому включенні потрібен двигун, що має досить великий опір обмотки (малий струм споживання), оскільки в будь-якому випадку послідовно з ним включений резистор опором 100 Ом

Цю проблему можна вирішити, якщо використовувати двотактний підсилювач

Рис 4010 Використання підсилювачів потужності

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

вході малопотужні транзистори Але, якщо струм, споживаний двигуном, залишається в межах допустимого вихідного струму для мікросхеми L293D, то краще все-таки використовувати мікросхему

У цьому розділі ми познайомилися з тим, як влаштований привід двигунів робота ROBOPICA Ми внесли виправлення в текст програми, пристосувавши її до нової версії програми MicroC PRO Ми отримали вихідний текст на мові Сі, який можна використовувати в інших середовищах розробки програми для мікроконтролера

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

Ми здійснили перші нескладні руху робота І ми готові продовжити експерименти з роботом

Джерело: Гололобов ВН, – Самовчитель гри на паяльнику (Про електроніці для школярів і не тільки), – Москва 2012