STM32/STM8技术论坛
直播中

罗帅

5年用户 39经验值
私信 关注
[问答]

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

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

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);

}

回帖(4)

人中狼

2019-4-17 16:37:47

最佳答案

试试扩展中断源的方法,就是用一个中断端口来接收多个中断源的中断,在51和计算机系统里都有用到,接收到中断后,再用165把EC11的信号读进来,进行判断。
举报

人中狼

2019-4-17 18:30:07
最好能贴上相关部分的电路图,另外使用EC11为什么不用中断,用中断就很容易操作了
举报

罗帅

2019-4-18 09:23:00
是可以用中断,但是我用的EC11比较多,资源不够啊,原理图比较简单,165八个输入接四个编码器。公共端接电源
举报

人中狼

2019-4-18 15:50:41
EC11转动时判断方向的两个引脚的波形时差应该很短,用165这种方式应该很容易会错过,没试过这种方式,即使只有一个EC11,使用这种查询判断的方法应都很容易出错,或者应该试试其他的方法
1 举报
  • 罗帅: 是这样的  让我很苦恼,需要用的EC11比较多单片机资源远远不够,又想不到好的方案来替代,求大虾给个宝贵的建议

更多回帖

发帖
×
20
完善资料,
赚取积分