编码器的输出AB两相的波形如下图所示,其原理不赘述。
软件解码方案有两种
1.查表法
有波形可以知道,波形有四种状态组成:
A相 | 0 | 1 | 1 | 0 |
B相 | 0 | 0 | 1 | 1 |
当AB相波形经历00—10—11—01的状态就表示一个正向步进。反之则表示反向步进。
读引脚电平的代码就不贴上了,只贴波形处理代码:
#define FILTER_MAX 3 // 电平滤波次数
//AB电平状态表
const unsigned char TrueTabA[4] = {1,0,0,1} ;
const unsigned char TrueTabB[4] = {1,1,0,0} ;
typedef struct
{
unsigned char AVal; // A电平
unsigned char BVal; // B电平
unsigned char PreAVal; // 前次A电平
unsigned char PreBVal; // 前次B电平
unsigned char CmpNum; // 滤波次数
unsigned char Index; // 真值表中位置 (这是什么鬼?)
unsigned char CWW ; // 方向 1-正向 0-反向
unsigned char Initbut; // 上电后初始化标志
signed short PNum; // 累计脉冲数
signed short PrePNum; // 前次累计脉冲数
GPIO_TypeDef port; //
unsigned short pin; //
}T_TubeButInfo;
// 获取在真值表中的位置
static unsigned char GetIndex(unsigned char tbindex) //当AB不同电平的时候返回相应的值
{
if(TubeButInfo[tbindex].AVal)
{
if(TubeButInfo[tbindex].BVal) return 0 ;//A高B高
return 3 ; //A高 B低
}
else
{
if(TubeButInfo[tbindex].BVal) return 1 ;//A低B高
return 2 ; //A低 B低
}
}
// 计算脉冲个数
// asf : 1表示累加 0-累减
static void SetPNum(unsigned char tbindex, unsigned char asf)
{ //1表示正向转 0表示反向转
if((asf != 0) & (TubeButInfo[tbindex].PNum < 8000)) //防止溢出
{
TubeButInfo[tbindex].PNum++;
}