Микроконтролери и електроника
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: Програма за енкодер

:arrow: viewtopic.php?f=2&t=8142 и вероятно поне още 10 еднакви теми :)

Автор:  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/