Nếu các bạn dùng AVR hay vi điều khiển không hỗ trợ đọc encoder thì đây là giải pháp hoàn hảo cho các bạn.
ứng dụng đọc 2 pha A B bắt 4 cạnh , 4 trạng thái.
Nếu các bạn không dùng phương pháp này, mình tin chắc 1 điều là encoder của các bạn đứng im mà robot rung thì tự nhiên nhìn kết quả bộ đếm sao tự nhiên nó lại tăng lên hay giảm xuống , và còn tình huống bị sai số tích lũy .
Yêu cầu 2 chân ngắt ngoài , đều có chức bắt any change( bất có sự thay đổi trạng thái đều phải xảy ra ngắt ).
Biến var_encoder tùy theo các bạn là 8bit hay 16bit hay 32 bit , nhưng phải là biến có dấu nhé.
#define pha_a PIND.2
#define pha_b PIND.3
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
if (!pha_a)
{ if (!pha_b) var_encoder++;
else var_encoder--;
}
else
{ if (pha_b) var_encoder++;
else var_encoder--;
}
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
if (pha_b)
{ if (!pha_a) var_encoder++;
else var_encoder--;
}
else
{ if (pha_a) var_encoder++;
else var_encoder--;
}
}