wheel/encoder原理

wheel/encoder示波器实测波形

wheel/encoder单片机检测固件
struct wheel_STR
{
unsigned char same_status_HL; //two state: all high (=1) or low (=2)
unsigned char diff_status; //two state: z1-high,z2-low (=1);z1_low,z2-high (=2);
signed char value;
};
struct wheel_STR wheel;
/*
scan in main loop
*/
void scan_wheel(void)
{
unsigned char z1,z2;
z1 =HAL_GPIO_ReadPin(WHEEL_Z1_PORT, WHEEL_Z1_PIN);//read_wheel_IO1();
z2 =HAL_GPIO_ReadPin(WHEEL_Z2_PORT, WHEEL_Z2_PIN);//read_wheel_IO2();
if(z1 != z2){ //diff
wheel.diff_status =(z1)?2:1;
}
else{ //same
if(z1){
if(wheel.same_status_HL==2){
if(wheel.diff_status==1) wheel.value++;
else if(wheel.diff_status==2) wheel.value--;
}
wheel.same_status_HL =1; //all high
}
else{
if(wheel.same_status_HL==1){
if(wheel.diff_status==1) wheel.value--;
else if(wheel.diff_status==2) wheel.value++;
}
wheel.same_status_HL =2; //all low
}
wheel.diff_status =0; //clear change flag!
}
}
/*
get the wheel vaule
*/
signed char get_wheel_value(void)
{
signed char tmp;
tmp = wheel.value;
wheel.value=0; //clear the value!
return tmp;
}