软件 A/B相编码器译码输出控制
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转移