|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 1:33 pm
|
Страница 1 от 1
|
[ 5 мнения ] |
|
| Автор |
Съобщение |
|
mEtaka_dts
Ранг: Минаващ
Регистриран на: Пон Май 26, 2014 4:47 pm Мнения: 27
|
 Програма за енкодер
Здравейте на всички!!
Искам да напиша програма за енкодер с PIC18F2620. Трябва да следя по 2 входа, за да мога да определя посоката и да броя инкрементите. Бихте ли ми помогнали с някаква идея как мога да го напиша със С код. По принцип използвам компилатора на Mikroelektronika mikroC PRO.
БЛАГОДАРЯ ПРЕДВАРИТЕЛНО!!!
|
| Сря Юни 11, 2014 11:58 am |
|
 |
|
Edesign
Ранг: Форумен бог
Регистриран на: Сря Авг 31, 2005 1:57 pm Мнения: 1103
|
 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
|
| Сря Юни 11, 2014 12:05 pm |
|
 |
|
timt
Ранг: Форумен бог
Регистриран на: Вто Ное 27, 2012 9:27 pm Мнения: 2011
|
 Re: Програма за енкодер
Енкодера работи с код на Грей в единият случай изваждаш -1 в другият добавяш +1, така се определя и посоката. Потърси го като код на Грей за Mikroelektronika mikroC PRO Може да се реализира с външна схема.
|
| Сря Юни 11, 2014 12:07 pm |
|
 |
|
michev
Ранг: Форумен бог
Регистриран на: Сря Юли 11, 2007 10:16 am Мнения: 1730
|
 Re: Програма за енкодер
viewtopic.php?f=2&t=8142 и вероятно поне още 10 еднакви теми 
|
| Сря Юни 11, 2014 1:38 pm |
|
 |
|
mEtaka_dts
Ранг: Минаващ
Регистриран на: Пон Май 26, 2014 4:47 pm Мнения: 27
|
 Re: Програма за енкодер
Благодаря ви много за бързият отговор!
|
| Чет Юни 12, 2014 9:55 am |
|
|
|
Страница 1 от 1
|
[ 5 мнения ] |
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 4 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|