找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5085|回复: 6
收起左侧

单片机如何能高效读取编码器的AB相信号

[复制链接]
ID:28415 发表于 2021-6-4 22:37 | 显示全部楼层 |阅读模式
本帖最后由 mxlslf 于 2021-6-4 22:40 编辑

情况说明:在做单片读取编码器的AB相信号时,选用ATMEGA328P单片机,把A相信号接到单片机INT0外部中断上,B相接到另一个引脚上。识别到A相发生中断时计数器加1计数,并判断B相的电平高低得出是正转还是反转。同时,上位机会通过串口下发指令给单片机,让单片机把相应的管脚打开和关闭操作。实际PCB板做好后,发现上位机发送的串口指令有时候是没有被执行,这样的情况在10次里面有4次的样子。

情况分析:我分析是否是因为外部中断打断了单片机接收串口指令。
判断过程:于是我把外部中断脉冲线拔掉,程序正常,单片机100%接收到串口指令,并正确控制。
提出问题:单片机如何能高效读取编码器的AB相信号?是否有串口缓存的芯片,可以把上位机发送给单片机的串口指令缓存起来,单片机从缓存芯片处逐个取走指令?




回复

使用道具 举报

ID:213173 发表于 2021-6-5 08:28 | 显示全部楼层
只要主函数周期够短,可以不用外部中断,改用查询方式。编码器的AB信号随便用2个IO口。
回复

使用道具 举报

ID:752974 发表于 2021-6-5 08:29 | 显示全部楼层
你的这种做法,像你说的中断计数影响程序工作,B信号判向也很难。简单的方法是AB信号经D触发器判向,判向后的信号给单片机,A或B给T计数,这样做,单片机负担轻,不影响其他程序。
回复

使用道具 举报

ID:883242 发表于 2021-6-5 20:02 | 显示全部楼层
select microcontroller with quadrature encoder interface .
回复

使用道具 举报

ID:28415 发表于 2021-6-8 09:02 | 显示全部楼层
munuc_w 发表于 2021-6-5 08:29
你的这种做法,像你说的中断计数影响程序工作,B信号判向也很难。简单的方法是AB信号经D触发器判向,判向后 ...

我借鉴了网上别人写的文档,这样改进:用双D触发器74HC74读取A,B两相,OUT1如果有输出脉冲说明是正转,OUT2如果有输出脉冲说明是反转。您觉得这样是否可行?我要对OUT1和OUT2进行计数的话,是直接在主循环程序里直接读OUT1和OUT2端口的电平,还是用外部中断计数的方式读入 这样您觉得哪个更优?
51hei图片_20210608085947.png
回复

使用道具 举报

ID:450849 发表于 2021-6-8 10:07 | 显示全部楼层
回复

使用道具 举报

ID:47286 发表于 2021-6-8 10:54 | 显示全部楼层
mxlslf 发表于 2021-6-8 09:02
我借鉴了网上别人写的文档,这样改进:用双D触发器74HC74读取A,B两相,OUT1如果有输出脉冲说明是正转,OU ...

如果在主循环里判断次数和方向 除非你用一个片子专门去扫编码器 否则 主循环时间不一定 有可能错过 所以中断是相对最可靠的 但中断里不适于做防抖 即便是计时器防抖或者变量累加防抖 都有可能在第二个脉冲过来的时候冲突 如果处理冲突 又可能造成中断内程序太多 那么理想的状态就是中断中得到的是确定脉冲 所以我认为编码器的消抖用硬件消抖 单片机中断计数 可以在中断函数里用两个标记分别对比以确定方向

硬件消抖实际上也有点缺点 要么容错低 要么体积大 要么成本高 硬件消抖简单的就是用个0.1uf电容 这方法是假定抖动会在十几毫秒内 随使用编码器那东西会越来越接触不良 到后期误判很多 另一种是用门电路做消抖 我没试过 但至少布线上要多一大坨东西 还有就是专门的消抖片子 有专门干这个的芯片 但那东西好贵啊 感觉很不值得

至于最终怎么弄 我认为主要是看速率 就是编码器拧多快 如果1s拧一下 那无所谓什么方法了 最便宜最简单的都不是问题 如果特别快 或者脉冲特别多的编码器 讲真 我觉得只能用专门的芯片 好象叫什么增量触发之类的 专用芯片 也特别贵 当时就是看见价格直接就忽略了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表