74HC165读取ec11旋转编码器时正、反出现误触

2019-07-14 13:13发布

求助各位大神  现在读取编码器时正、反出现误触,怎样才能优化好正反转,

uint8_t encode_A[4]={2,0,3,1};//Õýת״̬£¬ÏÂÒ»¸ö״̬
uint8_t encode_B[4]={1,3,0,2};//·´×ª×´Ì¬£¬ÏÂÒ»¸ö״̬

unsigned long encode_left=0;
unsigned long encode_right=0;
void Encode_right(void)
{
  static u8 curstat=0;
  static u8 flag;
  flag=(encode_right<<1)|encode_left;
  if(flag==curstat)
  {

  }
  if(flag==encode_A[curstat])
  {
     encode_right++;
  }
  else
  {

  }        
  curstat=flag;
}

void Encode_left(void)
{
  static u8 curstat=0;
  static u8 flag;
  flag=(encode_right<<1)|encode_left;
  if(flag==curstat)
  {

  }
  if(flag==encode_B[curstat])
  {
     encode_left--;
  }
  else
  {

  }
  curstat=flag;
}

uint8_t Joystick_Buffer[13]={0};
uint8_t Joystick_Buffer_Last[13]={0};
void JoystickSend(void)
{         
int  i;
  long int indata1=0;
long int indata2=0;
uint8_t PROcess[8];


u8 cod1_8=0;
u8 cod2_8=0;
u8 cod3_8=0;
u8 cod4_8=0;
u8 cod5_8=0;
u8 cod6_8=0;
u8 cod7_8=0;
u8 cod8_8=0;

  GPIO_WriteBit(GPIOB,SH_LD165,Bit_RESET);//SH-0;
  delay_ms(5);
  GPIO_WriteBit(GPIOB,SH_LD165,Bit_SET);//SH-1;
  delay_ms(5);
  for(i=0;i<32;i++)
  {
    GPIO_WriteBit(GPIOB,CLK165,Bit_RESET);//CLK-0;
    indata1=indata1<<1;      
    if(GPIO_ReadInputDataBit(GPIOB,DATA165)==1)
    {
   indata1=indata1+1;
//                        LED0=0;
   delay_ms(300);
//                        LED0=1;
    }     
     GPIO_WriteBit(GPIOB,CLK165,Bit_SET);//CLK-1;
  }
   for(i=32;i<64;i++)
  {
    GPIO_WriteBit(GPIOB,CLK165,Bit_RESET);//CLK-0;
    indata2=indata2<<1;  
    if(GPIO_ReadInputDataBit(GPIOB,DATA165)==1)
    {
   indata2=indata2+1;
//                        LED0=0;
   delay_ms(300);
//                        LED0=1;                        
    }      
     GPIO_WriteBit(GPIOB,CLK165,Bit_SET);//CLK-1;
  }
cod1_8=((indata1&0xff000000)>>24);
cod2_8=((indata1&0xff0000)>>16);
cod3_8=((indata1&0xff00)>>8);
cod4_8=indata1&0xff;
cod5_8=((indata2&0xff000000)>>24);
cod6_8=((indata2&0xff0000)>>16);
cod7_8=((indata2&0xff00)>>8);
cod8_8=indata2&0xff;

Joystick_Buffer[5] = cod1_8;
Joystick_Buffer[6] = cod2_8;
Joystick_Buffer[7] = cod3_8;
Joystick_Buffer[8] = cod4_8;
Joystick_Buffer[9] = cod5_8;
Joystick_Buffer[10] = cod6_8;
Joystick_Buffer[11] = cod7_8;
Joystick_Buffer[12] = cod8_8;

PROcess[0]=Joystick_Buffer[5]^Joystick_Buffer_Last[5];
Joystick_Buffer_Last[5]=Joystick_Buffer[5];
switch(PROcess[0])
{
   case 0x01:Encode_right();break;
  case 0x02:Encode_left();break;
   case 0x04:LED0=0;delay_ms(10);break;
   case 0x08:LED0=0;delay_ms(10);break;
   case 0x10:LED0=0;delay_ms(10);break;
  case 0x20:LED0=0;delay_ms(10);break;
   case 0x40:LED0=0;delay_ms(10);break;
   case 0x80:LED0=0;delay_ms(10);        break;
  default :LED0=1;break;
}

USB_SIL_Write(EP1_IN, Joystick_Buffer, 13);  
SetEPTxValid(ENDP1);
delay_ms(20);

}uint8_t encode_A[4]={2,0,3,1};//Õýת״̬£¬ÏÂÒ»¸ö״̬
uint8_t encode_B[4]={1,3,0,2};//·´×ª×´Ì¬£¬ÏÂÒ»¸ö״̬

unsigned long encode_left=0;
unsigned long encode_right=0;
void Encode_right(void)
{
  static u8 curstat=0;
  static u8 flag;
  flag=(encode_right<<1)|encode_left;
  if(flag==curstat)
  {

  }
  if(flag==encode_A[curstat])
  {
     encode_right++;
  }
  else
  {

  }        
  curstat=flag;
}

void Encode_left(void)
{
  static u8 curstat=0;
  static u8 flag;
  flag=(encode_right<<1)|encode_left;
  if(flag==curstat)
  {

  }
  if(flag==encode_B[curstat])
  {
     encode_left--;
  }
  else
  {

  }
  curstat=flag;
}

uint8_t Joystick_Buffer[13]={0};
uint8_t Joystick_Buffer_Last[13]={0};
void JoystickSend(void)
{         
int  i;
  long int indata1=0;
long int indata2=0;
uint8_t PROcess[8];


u8 cod1_8=0;
u8 cod2_8=0;
u8 cod3_8=0;
u8 cod4_8=0;
u8 cod5_8=0;
u8 cod6_8=0;
u8 cod7_8=0;
u8 cod8_8=0;

  GPIO_WriteBit(GPIOB,SH_LD165,Bit_RESET);//SH-0;
  delay_ms(5);
  GPIO_WriteBit(GPIOB,SH_LD165,Bit_SET);//SH-1;
  delay_ms(5);
  for(i=0;i<32;i++)
  {
    GPIO_WriteBit(GPIOB,CLK165,Bit_RESET);//CLK-0;
    indata1=indata1<<1;      
    if(GPIO_ReadInputDataBit(GPIOB,DATA165)==1)
    {
   indata1=indata1+1;
//                        LED0=0;
   delay_ms(300);
//                        LED0=1;
    }     
     GPIO_WriteBit(GPIOB,CLK165,Bit_SET);//CLK-1;
  }
   for(i=32;i<64;i++)
  {
    GPIO_WriteBit(GPIOB,CLK165,Bit_RESET);//CLK-0;
    indata2=indata2<<1;  
    if(GPIO_ReadInputDataBit(GPIOB,DATA165)==1)
    {
   indata2=indata2+1;
//                        LED0=0;
   delay_ms(300);
//                        LED0=1;                        
    }      
     GPIO_WriteBit(GPIOB,CLK165,Bit_SET);//CLK-1;
  }
cod1_8=((indata1&0xff000000)>>24);
cod2_8=((indata1&0xff0000)>>16);
cod3_8=((indata1&0xff00)>>8);
cod4_8=indata1&0xff;
cod5_8=((indata2&0xff000000)>>24);
cod6_8=((indata2&0xff0000)>>16);
cod7_8=((indata2&0xff00)>>8);
cod8_8=indata2&0xff;

Joystick_Buffer[5] = cod1_8;
Joystick_Buffer[6] = cod2_8;
Joystick_Buffer[7] = cod3_8;
Joystick_Buffer[8] = cod4_8;
Joystick_Buffer[9] = cod5_8;
Joystick_Buffer[10] = cod6_8;
Joystick_Buffer[11] = cod7_8;
Joystick_Buffer[12] = cod8_8;

PROcess[0]=Joystick_Buffer[5]^Joystick_Buffer_Last[5];
Joystick_Buffer_Last[5]=Joystick_Buffer[5];
switch(PROcess[0])
{
   case 0x01:Encode_right();break;
  case 0x02:Encode_left();break;
   case 0x04:LED0=0;delay_ms(10);break;
   case 0x08:LED0=0;delay_ms(10);break;
   case 0x10:LED0=0;delay_ms(10);break;
  case 0x20:LED0=0;delay_ms(10);break;
   case 0x40:LED0=0;delay_ms(10);break;
   case 0x80:LED0=0;delay_ms(10);        break;
  default :LED0=1;break;
}

USB_SIL_Write(EP1_IN, Joystick_Buffer, 13);  
SetEPTxValid(ENDP1);
delay_ms(20);

}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
人中狼
1楼-- · 2019-07-14 21:07
 精彩回答 2  元偷偷看……
kjwl0715
2楼-- · 2019-07-14 23:22
是可以用中断,但是我用的EC11比较多,资源不够啊,原理图比较简单,165八个输入接四个编码器。公共端接电源
人中狼
3楼-- · 2019-07-15 04:52
EC11转动时判断方向的两个引脚的波形时差应该很短,用165这种方式应该很容易会错过,没试过这种方式,即使只有一个EC11,使用这种查询判断的方法应都很容易出错,或者应该试试其他的方法

一周热门 更多>