Найрозумніше, відмовитися від регулювання швидкості обертання двигуна

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

// PD0 ====> 1A

// PD1 ====> 1B

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

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

// PB1 ====> 2A

// PB2 ====> 2B

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

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

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

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

{

ANSELH & = 0xFA / / RB1 ==> Цифровий Введення / Висновок

/ / RB2 ==> Цифровий Введення / Висновок TRISB & = 0xF9 / / Двигун Б 2A

/ / Двигун Б 2B TRISD & = 0xFC / / Двигун А 1A

/ / Двигун А 1B

TRISC2 = 1

TRISC1 = 1

PR2 = 255 / / Період

CCP1CON = 0x3C / / Двійкове 00111100 CCPR1L = 255 / / Тривалість CCP2CON = 0x3C / / Двійкове 00111100 CCPR2L = 255 / / Тривалість

PIR1 & = 0xFD / / Очищення прапора

T2CON = 1 / / Предделітель таймера TMR2ON = 1 / / Дозвіл роботи таймера while (TMR2IF == 0)

TRISC2 = 0 / / Включення PWM1 TRISC1 = 0 / / Включення PWM2

}

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

void PWM1_Stop()

{

TRISC2 = 1

TMR2ON = 0

}

void PWM2_Stop()

{

TRISC1 = 1

TMR2ON = 0

}

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

{

RD0 =0

RD1 =1

}

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

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

{

RB1 =0

RB2 =1

}

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

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

{

RD0 =1

RD1 =0

}

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

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

{

RB1 =1

RB2 =0

}

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

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

{

PWM1_Stop() RD0 =0

RD1 =0

}

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

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

{

PWM2_Stop() RB1 =0

RB2 =0

}

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

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

{

Motor_A_FWD() Motor_B_FWD()

}

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

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

{

Motor_A_BWD() Motor_B_BWD()

}

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

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

{

Motor_B_FWD() Motor_A_BWD()

}

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

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

{

Motor_B_BWD() Motor_A_FWD()

}

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

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

{

Motor_A_Off() Motor_B_Off()

}

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

І завантажимо в робота програму перевірки роботи двигунів:

#include <pic16f887h>

#include &quotmotorh&quot

#include &quotdelay_20h&quot

typedef unsigned int word

word at 0x2007 CONFIG1 = 0x2FF2

void main()

{

while(1)

{

Motor_Init()

Forward () / / Команда ВПЕРЕД DELAY_S (2)

S_Left () / / Команда повороті вліво DELAY_MS (800)

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

DELAY_S(2)

S_Right () / / Команда ПОВОРОТ ВПРАВО DELAY_MS (800)

Forward () / / Команда ВПЕРЕД DELAY_S (2)

Backward () / / Команда НАЗАД DELAY_S (1)

Motor_Stop () / / Зупинити обидва двигуни DELAY_S (5)

}

}

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

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