| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Програма за енкодер http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=12989 |
Страница 1 от 1 |
| Автор: | mEtaka_dts [ Сря Юни 11, 2014 11:58 am ] |
| Заглавие: | Програма за енкодер |
Здравейте на всички!! Искам да напиша програма за енкодер с PIC18F2620. Трябва да следя по 2 входа, за да мога да определя посоката и да броя инкрементите. Бихте ли ми помогнали с някаква идея как мога да го напиша със С код. По принцип използвам компилатора на Mikroelektronika mikroC PRO. БЛАГОДАРЯ ПРЕДВАРИТЕЛНО!!! |
|
| Автор: | Edesign [ Сря Юни 11, 2014 12:05 pm ] |
| Заглавие: | Re: Програма за енкодер |
Ето програмка за 2 енкодера. Трябва да я викаш в прекъсване през интервал <=1mS за да чете като хората Брои от 0 до 1000. Резултатът е в my_enc_val[0,1] enc1_a и enc1_b - са пиновете входове за първия енкодер enc2_a и enc2_b - са пиновете входове за втория енкодер /////////////////////////////Encoder Vars////////////////////////////////////// signed int enc_states[] = {0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0}; unsigned int enc_position[2]; signed int enc_value[2] ; unsigned int old_enc_value[2] ; /////////////////////////////Working Vars////////////////////////////////////// unsigned int my_enc_val[2]; /////////////////////////////Encoder Function - Repeat as required///////////// unsigned char encoder_Loop(void) { unsigned char dummy; unsigned char i; i=0; do { dummy=0; if (i==0) { dummy=enc2_b; dummy=dummy<<1; dummy=dummy|enc2_a; }else { dummy=enc1_b; dummy=dummy<<1; dummy=dummy|enc1_a; } enc_position[i] = enc_position[i]<<2; //remember previous state by // shifting the lower bits up 2 enc_position[i] = enc_position[i]| dummy ; // AND the lower 2 bits of //port b, then OR them with var //old_AB to set new value enc_value[i] =enc_value[i]+ enc_states[( enc_position[i] & 0x0f )]; // the lower 4 bits of old_AB & 16 are then // the index for enc_states if ( enc_value[i] != old_enc_value[i] ) { if( enc_value[i] <= 0 ) { enc_value[i] = 0; } if( enc_value [i]> 2000 ) { // Arbitrary max value for testing purposes enc_value[i] = 2000; } my_enc_val[i] = enc_value[i]/2; // This is the value you will pass to old_enc_value[i] = enc_value[i]; } i++; }while(i<2); return(0); } // End of encoder0Loop |
|
| Автор: | timt [ Сря Юни 11, 2014 12:07 pm ] |
| Заглавие: | Re: Програма за енкодер |
Енкодера работи с код на Грей в единият случай изваждаш -1 в другият добавяш +1, така се определя и посоката. Потърси го като код на Грей за Mikroelektronika mikroC PRO Може да се реализира с външна схема. |
|
| Автор: | michev [ Сря Юни 11, 2014 1:38 pm ] |
| Заглавие: | Re: Програма за енкодер |
| Автор: | mEtaka_dts [ Чет Юни 12, 2014 9:55 am ] |
| Заглавие: | Re: Програма за енкодер |
Благодаря ви много за бързият отговор! |
|
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|