完善资料让更多小伙伴认识你,还能领取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); }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个回答
|
|
试试扩展中断源的方法,就是用一个中断端口来接收多个中断源的中断,在51和计算机系统里都有用到,接收到中断后,再用165把EC11的信号读进来,进行判断。
最佳答案
|
|
|
|
最好能贴上相关部分的电路图,另外使用EC11为什么不用中断,用中断就很容易操作了
|
|
|
|
是可以用中断,但是我用的EC11比较多,资源不够啊,原理图比较简单,165八个输入接四个编码器。公共端接电源
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1330 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1263 浏览 3 评论
2430 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1416 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1847 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-30 18:59 , Processed in 0.888833 second(s), Total 83, Slave 66 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号