A
alirezan
Guest
Здравейте всички,
Опитвам се да се използва колело енкодери на моя робот.Аз съм с PIC18F1320 и програмиране на C.
Използвах PIC за генериране на PWM и да зададете пристанища да определи посоката на движение.Аз приложен хардуера колело енкодер (което работи добре) и нека СПМ получите прекъсват като сензори виж различен цвят кръпка, когато колелото се върти (използва щифт PORTB промяна прекъсват).
Имам много проста програма, но много странен проблем.Когато се симулира в MPLAB СИМ-то работилница глоба.
Тук е проблемът.В моя енкодер, бяло петно генерира 0 и черна 1.Всеки път, когато стартирате робот, колелото движи само малко и спира.Разбрах, че след като възхвала удари черна кръпка, тя спира напълно.Когато включите ръчно колело на сензора, за да видите бяло петно тогава колелото започва да се движи и отново, когато удари черна кръпка, тя спира!
Някой знае ли защо това се случва?
Тук е моят код:
Благодарности
Код:/********/# PIC18F1320 Pragma чип / / CC8E съставител директива за използване 18F1320.H
нищожен Start_PWM (Void);
нищожен Stop_PWM (Void);/************************************************* ********************************************/
/ / 1 макро дефиниции и константи /
//***********************************`/ / Логически Определения:
//====================/ / PIC18F1320 Определения:
//=======================
# определят F_OSC 8000000 / / Frequency (Hz) на осцилатори (Fosc) за момента се използва часовник
/ / ROBOT_PIC Определения:
//======================Int distance_to_move;
Int rotation_constant / / трябва да бъде 1,754
Int time_to_turn;
грозен Int брояч;
# ргадта произход 0x8 / / Посочете къде в програмата памет, за да поставите следния код
/ / (0x8 съответства на висока степен на приоритет Прекъсване вектор)
прекъсват int_server (Void) / / прекъсване на рутинна услуга е специална функция.
Вижте CC8E Ръководство на потребителя за подробности
(
int_save_registers / / CC8E Макро да спаси W, статута и БДЖ регистриIF (RBIF) / / Най-малко един от RB4: RB7 се променя
(
ако (! PORTB.5) / / PB5 е получил прекъсват
(
PORTB.2 = 1;
брояч ;
)RBIF = 0IF (TMR2IF)
(
TMR2IF = 0;
)int_restore_registers / / CC8E Макро да се възстанови W, статута и БДЖ регистри
)
/************************************************* ********************************************/
/ / Основна функция /
//*****************`недействителни главната (недействителни)
(/ / Осцилатор Инициализация:
//==========================
SWDTEN = 0;
OSCCON = 0b01110000 / / Конфигуриране за:! IDLEN, 8MHz INTOSC честота, PRI_RUN режим на захранване
OSCTUNE = 0x10; / / Този регистър се използва за компенсиране на oscilator грешка честота плаващите/ / Порт А, Б Инициализация:
//========================
ADON = 0;
ADCON1 = 0b01111111;
TRISA = 0b10000010;
TRISB = 0b00100000;PORTA = 0x00; / / Initialize Пристанища А, Б до 0
PORTB = 0x00;
PORTA.6 = 0;
PORTB.6 = 0;
RBIE = 1;
RBIF = 0;GIE = 1;
PEIE = 1;
Start_PWM ();докато (1);
)нищожен Start_PWM (Void)
(
CCP1CON = 0;
PR2 = 199; / / 249 / / 199 за DC = 25%, 249 за DC = 75%
CCPR1L = 49; / / 186 / / 49 за DC = 25%, 186 за DC = 75%
TRISB.3 = 0;
T2CON = 0x01;
CCP1CON = 0x3C;
TMR2 = 0;
TMR2ON = 1;
TMR2IE = 1;
)нищожен Stop_PWM (Void)
(
TMR2ON = 0;
)/ / КРАЙ НА ФАЙЛА
Опитвам се да се използва колело енкодери на моя робот.Аз съм с PIC18F1320 и програмиране на C.
Използвах PIC за генериране на PWM и да зададете пристанища да определи посоката на движение.Аз приложен хардуера колело енкодер (което работи добре) и нека СПМ получите прекъсват като сензори виж различен цвят кръпка, когато колелото се върти (използва щифт PORTB промяна прекъсват).
Имам много проста програма, но много странен проблем.Когато се симулира в MPLAB СИМ-то работилница глоба.
Тук е проблемът.В моя енкодер, бяло петно генерира 0 и черна 1.Всеки път, когато стартирате робот, колелото движи само малко и спира.Разбрах, че след като възхвала удари черна кръпка, тя спира напълно.Когато включите ръчно колело на сензора, за да видите бяло петно тогава колелото започва да се движи и отново, когато удари черна кръпка, тя спира!
Някой знае ли защо това се случва?
Тук е моят код:
Благодарности
Код:/********/# PIC18F1320 Pragma чип / / CC8E съставител директива за използване 18F1320.H
нищожен Start_PWM (Void);
нищожен Stop_PWM (Void);/************************************************* ********************************************/
/ / 1 макро дефиниции и константи /
//***********************************`/ / Логически Определения:
//====================/ / PIC18F1320 Определения:
//=======================
# определят F_OSC 8000000 / / Frequency (Hz) на осцилатори (Fosc) за момента се използва часовник
/ / ROBOT_PIC Определения:
//======================Int distance_to_move;
Int rotation_constant / / трябва да бъде 1,754
Int time_to_turn;
грозен Int брояч;
# ргадта произход 0x8 / / Посочете къде в програмата памет, за да поставите следния код
/ / (0x8 съответства на висока степен на приоритет Прекъсване вектор)
прекъсват int_server (Void) / / прекъсване на рутинна услуга е специална функция.
Вижте CC8E Ръководство на потребителя за подробности
(
int_save_registers / / CC8E Макро да спаси W, статута и БДЖ регистриIF (RBIF) / / Най-малко един от RB4: RB7 се променя
(
ако (! PORTB.5) / / PB5 е получил прекъсват
(
PORTB.2 = 1;
брояч ;
)RBIF = 0IF (TMR2IF)
(
TMR2IF = 0;
)int_restore_registers / / CC8E Макро да се възстанови W, статута и БДЖ регистри
)
/************************************************* ********************************************/
/ / Основна функция /
//*****************`недействителни главната (недействителни)
(/ / Осцилатор Инициализация:
//==========================
SWDTEN = 0;
OSCCON = 0b01110000 / / Конфигуриране за:! IDLEN, 8MHz INTOSC честота, PRI_RUN режим на захранване
OSCTUNE = 0x10; / / Този регистър се използва за компенсиране на oscilator грешка честота плаващите/ / Порт А, Б Инициализация:
//========================
ADON = 0;
ADCON1 = 0b01111111;
TRISA = 0b10000010;
TRISB = 0b00100000;PORTA = 0x00; / / Initialize Пристанища А, Б до 0
PORTB = 0x00;
PORTA.6 = 0;
PORTB.6 = 0;
RBIE = 1;
RBIF = 0;GIE = 1;
PEIE = 1;
Start_PWM ();докато (1);
)нищожен Start_PWM (Void)
(
CCP1CON = 0;
PR2 = 199; / / 249 / / 199 за DC = 25%, 249 за DC = 75%
CCPR1L = 49; / / 186 / / 49 за DC = 25%, 186 за DC = 75%
TRISB.3 = 0;
T2CON = 0x01;
CCP1CON = 0x3C;
TMR2 = 0;
TMR2ON = 1;
TMR2IE = 1;
)нищожен Stop_PWM (Void)
(
TMR2ON = 0;
)/ / КРАЙ НА ФАЙЛА