软件 A/B相编码器译码输出控制

发布于:2022-12-16 ⋅ 阅读:(276) ⋅ 点赞:(0)

软件 A/B相编码器译码输出控制

Encode


STM32 TIMX 有 ENCODER MODE, 但如果资源不足, 可以利用软件处理 AB Phase 编码器。

  • 换相速度慢, 可以利用 SysTick (1ms) , 周期性执行确认 AB Phase.
  • 速度快, 可以利用 PIN EXTI中断处理。
  • 相位弹跳部分, 依编码进程会自动被滤除
/****************************************************************************
*  Software for AB Decoder 
*/
typedef enum { BACKWARD=0, FORWARD=1,  UNKNOWN=2 }  Direction_typedef; 

#define hwA     0
#define hwB     1
#define getA()  (GPIOA->IDR & (1U<<hwA))
#define getB()  (GPIOA->IDR & (1U<<hwB))
#define getAB() (((getB()>>hwB)<<1 ) + ( getA()>>hwA ))

uint8_t   ucPrevAB = 0; 
uint32_t  lEncoder = 0; 
/****************************************************************************
*  vCheckEncoder (void)
*    Convert AB Pahse to Encoder value
*/
void vCheckEncoder(void)
 {
     uint8_t  NewAB ; 
     Direction_typedef cDir = UNKNOWN; 
     
     NewAB = getAB();  
     if( NewAB == ucPrevAB ) return;      
     
     switch(ucPrevAB)
     {
        case 0: 
            if( NewAB == 1 ) cDir = BACKWARD; 
            if( NewAB == 2 ) cDir = FORWARD ;  
            break; 
        case 1: 
            if( NewAB == 3 ) cDir = BACKWARD; 
            if( NewAB == 0 ) cDir = FORWARD ;  
            break; 
        case 2:
            if( NewAB == 0 ) cDir = BACKWARD;
            if( NewAB == 3 ) cDir = FORWARD ;
            break; 
        case 3:
            if( NewAB == 2 ) cDir = BACKWARD;
            if( NewAB == 1 ) cDir = FORWARD ;  
            break; 
        }
   if( FORWARD   ==  cDir )  ++lEncoder; 
   if( BACKWARD ==  cDir )  --lEncoder;   
   ucPrevAB = NewAB;         
}

int16_t  main(void)
{
	int32_t   lPosition=0;
	int32_t   lPrevEncoder=0; 
	int32_t   lNewEncoder=0; 	
    do{
         vCheckEncoder( );
		if (    lPrevEncoder ==  lEncoder  ) continue; 	
		lNewEncoder =   lEncoder ; 
         if (  lPrevEncoder > lNewEncoder )   {  xExcute_Forward( lPrevEncoder-lNewEncoder )  } ; 
         if (  lPrevEncoder <  lNewEncoder )  {  xExcute_Backward(  lNewEncoder- lPrevEncoder  ) } ; 
         lPrevEncoder = lNewEncoder; 
    } while(1); 
}

软件 A/B相编码器译码输出控制 Software AB Phase Encode
<备份> 收集资料, 仅供参考。
数据剪辑自原厂规格书, 版权归原所有人拥有。
档案取自互联网!如有侵权或不适用情形, 请联系移除!
** 使用有风险, 请详阅原厂使用说明!
** 范例码为自用,请谨慎引用, Ctrl-C, Ctrl-V结果自行承担!
#Blog转移


网站公告

今日签到

点亮在社区的每一天
去签到