STM32-编码器的软件解码

本文介绍了STM32编码器的两种软件解码方法:查表法和鉴相法。查表法通过记录AB相波形的四种状态来判断步进方向,而鉴相法则类似于硬件触发器鉴相,根据A相边沿和B相电平确定步进方向。文中还提及了代码实现和消抖滤波的应用。
摘要由CSDN通过智能技术生成

编码器的输出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++;
	}
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值