OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3711|回复: 9

求助,关于使用纯软件操作正交编码器。

[复制链接]

22

主题

133

帖子

2

精华

高级会员

Rank: 4

积分
901
金钱
901
注册时间
2015-12-24
在线时间
197 小时
发表于 2016-11-1 12:37:31 | 显示全部楼层 |阅读模式
2金钱
    情况是这样,想做个东西,两个脉冲输入,用中断做,现在临时想改用旋转编码器做,但是引脚并没有链接到定时器通道上,想问一下,有没有类似51那种,纯软件读取管角来判断编码器的程序。
    之前有写过51的,但是移植过来不好用,从网上也没找到合用的,基本都是用定时器,不知道有没有人做过这种,还请不吝赐教。

最佳答案

查看完整内容[请看2#楼]

这个得要看你的编码器的线数及转速来决定, 如果线数高, 转速这高,定时器的时间就要短,最少你要保正AB相信号变化一定, 时间器中断4次这样的比例才能保证不掉脉冲。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

507

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3347
金钱
3347
注册时间
2013-4-10
在线时间
333 小时
发表于 2016-11-1 12:37:32 | 显示全部楼层
玉麒麟 发表于 2016-11-2 13:01
我现在用的是最简单的EC11编码器,定时器1ms,可以吗?

这个得要看你的编码器的线数及转速来决定, 如果线数高, 转速这高,定时器的时间就要短,最少你要保正AB相信号变化一定, 时间器中断4次这样的比例才能保证不掉脉冲。
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2016-11-1 14:36:38 | 显示全部楼层
51可以搞定,STM一定可以搞定.
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2016-9-23
在线时间
52 小时
发表于 2016-11-1 16:03:17 | 显示全部楼层
本帖最后由 silentk 于 2016-11-1 16:06 编辑

我做过ALPS编码器的!现在是用外部中断写的!双边沿触发中断!在中断服务函数里判断2个脚的电平!电平相同正转!不同反转!轮询的方式写的漏码太多。。。。不知什么原因。。。
定时器编码器模式写了大半。。。发现我有7个编码器。。。。STM32的8个定时器只有6个有编码器模式。。。。
最后只有用中断写了、、、、
回复

使用道具 举报

9

主题

507

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3347
金钱
3347
注册时间
2013-4-10
在线时间
333 小时
发表于 2016-11-1 17:27:31 | 显示全部楼层
本帖最后由 likunxue 于 2016-11-1 17:29 编辑


sbit BianMa_A  = P2^0;                    //编码器A相输出脉冲线
sbit BianMa_B  = P2^1;                    //编码器B机输出脉冲线

unsigned char data ShuChuZhuangTai = 0;   //ABZ信号状态寄存器(静态变量)
signed long   data WeiZhiJiShuQi  = 0;          //光电编码器位置计数器


/*********************************************************************************************
函数名:记数器中断处理函数
调  用:无
参  数:无
返回值:无
结  果:完成编码器的采集工作,记录编码器的位置状态
TIM2->CNT = 65427;    //重装定时常数0.00456ms(220KHz)
/**********************************************************************************************/
void name(void) interrupt 1
     {
     unsigned char k,Cal;
     Cal = P2&0x03;//取得当前光电编码器输入状态值
     if(Cal != ShuChuZhuangTai)
       {
       k = (ShuChuZhuangTai << 2 )+ Cal;//得到4倍频编码输入状态值
       switch(k)
             {
             case 0x07:WeiZhiJiShuQi++;break;
             case 0x0E:WeiZhiJiShuQi++;break;
             case 0x08:WeiZhiJiShuQi++;break;
             case 0x01:WeiZhiJiShuQi++;break;
             case 0x0D:WeiZhiJiShuQi--;break;
             case 0x04:WeiZhiJiShuQi--;break;
             case 0x02:WeiZhiJiShuQi--;break;
             case 0x0B:WeiZhiJiShuQi--;break;
             }
       ShuChuZhuangTai = Cal; //输入状态存副本
       }
     }
回复

使用道具 举报

22

主题

133

帖子

2

精华

高级会员

Rank: 4

积分
901
金钱
901
注册时间
2015-12-24
在线时间
197 小时
 楼主| 发表于 2016-11-2 12:49:41 | 显示全部楼层
silentk 发表于 2016-11-1 16:03
我做过ALPS编码器的!现在是用外部中断写的!双边沿触发中断!在中断服务函数里判断2个脚的电平!电平相同 ...

方便的话代码能参考一下吗,谢谢。
回复

使用道具 举报

22

主题

133

帖子

2

精华

高级会员

Rank: 4

积分
901
金钱
901
注册时间
2015-12-24
在线时间
197 小时
 楼主| 发表于 2016-11-2 12:50:00 | 显示全部楼层
likunxue 发表于 2016-11-1 17:27
sbit BianMa_A  = P2^0;                    //编码器A相输出脉冲线
sbit BianMa_B  = P2^1;            ...

这个是正交编码器吗?没太看懂其中原理。
回复

使用道具 举报

9

主题

507

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3347
金钱
3347
注册时间
2013-4-10
在线时间
333 小时
发表于 2016-11-2 12:53:54 | 显示全部楼层
本帖最后由 likunxue 于 2016-11-2 12:58 编辑
玉麒麟 发表于 2016-11-2 12:50
这个是正交编码器吗?没太看懂其中原理。

是正交的, AB相, 两路相差90度, 可得到方向及脉冲数, 这个函数是经4倍频处理的,软件法处理编码器这是比较好的算法了,可用于C51 或STM32芯片都行,只定时间的中断时间最少得小于输入AB相信号的4倍以上。
回复

使用道具 举报

22

主题

133

帖子

2

精华

高级会员

Rank: 4

积分
901
金钱
901
注册时间
2015-12-24
在线时间
197 小时
 楼主| 发表于 2016-11-2 13:01:50 | 显示全部楼层
likunxue 发表于 2016-11-2 12:53
是正交的, AB相, 两路相差90度, 可得到方向及脉冲数, 这个函数是经4倍频处理的,软件法处理编码器这 ...

我现在用的是最简单的EC11编码器,定时器1ms,可以吗?
回复

使用道具 举报

22

主题

133

帖子

2

精华

高级会员

Rank: 4

积分
901
金钱
901
注册时间
2015-12-24
在线时间
197 小时
 楼主| 发表于 2016-11-2 13:18:14 | 显示全部楼层
likunxue 发表于 2016-11-2 13:05
这个得要看你的编码器的线数及转速来决定, 如果线数高, 转速这高,定时器的时间就要短,最少你要保正AB ...

很感谢,回去试试。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-24 18:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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