找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 383|回复: 12
收起左侧

51单片机驱动编码器

[复制链接]
ID:350682 发表于 2024-11-13 21:53 | 显示全部楼层 |阅读模式
请教一下,51单片机驱动编码器实现计数功能,如果慢速转动,就正常计数,如果快速转动,直到停下来才计数一次,这个快速转动计数怎样才能实现呢?我的想法是通过定时器计时,测两次转动之间的时间,高于一个时间就认为是慢速转送,低于一个时间就认为是快速转动,但是这个时间设定为多少合适呢?
回复

使用道具 举报

ID:161164 发表于 2024-11-14 13:25 | 显示全部楼层
用一个定时器+一个外部中断来记录脉冲信号
外部中断每收到一个脉冲就对变量加1
定时器定时统计变量的值
回复

使用道具 举报

ID:350682 发表于 2024-11-14 16:12 | 显示全部楼层
lkc8210 发表于 2024-11-14 13:25
用一个定时器+一个外部中断来记录脉冲信号
外部中断每收到一个脉冲就对变量加1
定时器定时统计变量的值

有例程吗?我现在不是使用的中断来判断,是直接判断AB的电平区分正转还是反转
回复

使用道具 举报

ID:161164 发表于 2024-11-14 17:13 | 显示全部楼层
piscest_x 发表于 2024-11-14 16:12
有例程吗?我现在不是使用的中断来判断,是直接判断AB的电平区分正转还是反转

可以参考我的贴子
http://www.51hei.com/bbs/dpj-209594-1.html
回复

使用道具 举报

ID:350682 发表于 2024-11-14 22:42 | 显示全部楼层
lkc8210 发表于 2024-11-14 17:13
可以参考我的贴子
http://www.51hei.com/bbs/dpj-209594-1.html

试用了你的程序,不太行,不是每次都能识别到
回复

使用道具 举报

ID:1109793 发表于 2024-11-15 07:13 | 显示全部楼层
自然是要有个反应速度问题,你要做到多快?用更快的芯片比如STM32的,甚至DSP会更快的。
回复

使用道具 举报

ID:350682 发表于 2024-11-15 09:08 | 显示全部楼层
xiaobendan001 发表于 2024-11-15 07:13
自然是要有个反应速度问题,你要做到多快?用更快的芯片比如STM32的,甚至DSP会更快的。

不需要很快,就手动旋转编码器计数,慢旋加1,快旋多次才加1,现在的问题就是怎么判断是慢旋还是快旋
回复

使用道具 举报

ID:1109793 发表于 2024-11-15 16:03 | 显示全部楼层
piscest_x 发表于 2024-11-15 09:08
不需要很快,就手动旋转编码器计数,慢旋加1,快旋多次才加1,现在的问题就是怎么判断是慢旋还是快旋

手动旋转还有个分辨率问题,并且手动的速度范围很大。
实际上比如我那个欧万的示波器的那些旋钮,都不是很好用。也可能很久都不用的问题吧。对于类似EC11那种,如果不是刻意快速旋转的话,51是够用了,不行可以把主频搞到22.1184M,应该也可以了。
回复

使用道具 举报

ID:1133081 发表于 2024-11-16 16:59 | 显示全部楼层
piscest_x 发表于 2024-11-15 09:08
不需要很快,就手动旋转编码器计数,慢旋加1,快旋多次才加1,现在的问题就是怎么判断是慢旋还是快旋

//T0中断服务函数 周期10ms
void Timer0Interrupt() interrupt 1
{
        static unsigned int i;
    TH0 = 0xD8;
    TL0 = 0xF0;
        i++;
        if(i>=10)                                //100ms 调整到所需值以分辨快慢旋
        {
                i = 0;
                EX0 = 1;                        //开INT0中断
                TR0 = 0;                        //关定时器0
        }
}

//INT0中断服务函数
void INT0_Isr() interrupt 0 //EC11_A接外部中断,EC11_B接任意IO口
{
        if(EC11_B)direction=1;         //正转
        else direction=2;                //反转               
        EX0 = 0;                                //关INT0中断
        TR0 = 1;                                //开定时器0
        if(direction==1)num++;
        if(direction==2)num--;
}
回复

使用道具 举报

ID:1136609 发表于 2024-11-16 17:48 | 显示全部楼层
lkc8210 发表于 2024-11-14 13:25 | 只看该作者 用一个定时器+一个外部中断来记录脉冲信号 外部中断每收到一个脉冲就对变量加1 定时器定时统计变量的值
回复

使用道具 举报

ID:350682 发表于 2024-11-16 23:09 | 显示全部楼层
WL0123 发表于 2024-11-16 16:59
//T0中断服务函数 周期10ms
void Timer0Interrupt() interrupt 1
{

void INT0_ISR (void) interrupt 0
{
        if(last_A == 1&& BM_KEY_A == 0)
        {
                if(BM_KEY_B == 1)
                {
//                        encoder_show();
                        num++;
                }       
                else
                {
//                        encoder_show();
                        num++;
                }
        }
        last_A = BM_KEY_A;
        last_B = BM_KEY_B;
}
我这样写,有一个问题,就是旋转编码器,没完全旋转一格,就会被识别到,然后num++;
回复

使用道具 举报

ID:1109793 发表于 2024-11-17 07:15 | 显示全部楼层
论坛里面搜搜,有很多编码器的内容
回复

使用道具 举报

ID:1133081 发表于 2024-11-17 07:26 | 显示全部楼层
piscest_x 发表于 2024-11-16 23:09
void INT0_ISR (void) interrupt 0
{
        if(last_A == 1&& BM_KEY_A == 0)

同样的代码在不同的硬件条件和不同的使用场景下不一定能正常工作,需要做相应的修改和仔细的调试。给你一个船用中速柴油机转速传感器的程序参考。两个并列霍尔的输出的信号与普通旋转编码器输出的信号极为相似。 转速传感器.rar (1.89 KB, 下载次数: 0)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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