OpenEdv-开源电子网

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

共享一个万无一失的旋转编码器检测程序

[复制链接]

20

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
175
金钱
175
注册时间
2012-10-23
在线时间
9 小时
发表于 2015-12-25 23:56:55 | 显示全部楼层 |阅读模式

本程序中针对的传感器具有A和C两个输出,旋转时两个都可以产生中断,只是转向不同时相位不同。程序中使用一个触发中断,在中断里面判断另外一个的电平,开始不管怎么写都会有有一些误判断,我曾经循环判断了100次,只要有一次判断与其他不同的都丢弃,结果还是会有一些误判断,后来加了两个边沿检测,基本可以算是万无一失了,我转了1一个小时都没发现有方向判断错误的。加t1、t2是防止程序死在中断里面,如果慢转丢失判断结果可以适当增大t1、t2。

[mw_shl_code=c,true]//旋转编码器旋转中断
//ROTARY_A、ROTARY_C
void EXTI3_IRQHandler(void)        //中断号9(PC3)
{
        u8 t1 = 50;
        u16 t2 = 1000;
        if ((EXTI->PR) & (1 << 3))
        {
                EXTI->PR = 1 << 3;                //清除LINE3上的中断标志位
                if (!ROTARY_C)
                {
                        Delay_us(10);
                        while ((ROTARY_A == 0) && (t1--))
                        {
                                Delay_ms(1);
                        }
                        Delay_us(10);
                        if (ROTARY_C)
                                UART1_printf("顺时针转\r\n\r\n");
                }
                else
                {
                        Delay_us(10);
                        while ((ROTARY_A == 0) && (t2--))
                        {
                                Delay_ms(1);
                        }
                        Delay_us(10);
                        if (!ROTARY_C)
                                UART1_printf("逆时针转\r\n\r\n");
                }
        }
}
[/mw_shl_code]
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

20

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
175
金钱
175
注册时间
2012-10-23
在线时间
9 小时
 楼主| 发表于 2015-12-26 00:02:49 | 显示全部楼层
另外再发一个print函数,不需要重定义fputc,fgetc,并且所有的串口都可以写个这个函数,功能与标准c语言里的printf函数一样,应该是一样的吧,反正我还没发现不一样的。

[mw_shl_code=applescript,true]//需要包含的头文件
#include <stdarg.h>

void UART1_printf(char *fmt,...)
{
        va_list ap;
        char string[256];
        va_start(ap, fmt);
        vsprintf(string, fmt, ap);
        UART1_SendString(string);
        va_end(ap);
}[/mw_shl_code]
回复 支持 反对

使用道具 举报

17

主题

237

帖子

0

精华

高级会员

Rank: 4

积分
925
金钱
925
注册时间
2012-2-27
在线时间
393 小时
发表于 2015-12-26 09:36:49 | 显示全部楼层
只能判断转向吗?给力
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2015-12-26 09:55:52 | 显示全部楼层
貌像迟点会用到,呵呵,谢谢分享!!!
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2015-12-26 17:30:14 | 显示全部楼层
感谢分享,后面说不定会用得到,先收藏
回复 支持 反对

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2014-6-23
在线时间
17 小时
发表于 2015-12-26 19:18:44 | 显示全部楼层
mark....
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-12-26 19:47:10 | 显示全部楼层
不错,谢谢分享。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1878
金钱
1878
注册时间
2014-6-27
在线时间
995 小时
发表于 2015-12-26 22:01:58 | 显示全部楼层
你不用delay看看,不用delay更简单,我应用中用没发现你的这种误判情况。
回复 支持 反对

使用道具 举报

5

主题

163

帖子

0

精华

高级会员

Rank: 4

积分
615
金钱
615
注册时间
2011-11-7
在线时间
180 小时
发表于 2016-1-1 23:54:10 | 显示全部楼层
方法不错,不过在中断里面做ms级别的延时,总感觉不太好。
回复 支持 反对

使用道具 举报

9

主题

86

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3906
金钱
3906
注册时间
2014-7-26
在线时间
543 小时
发表于 2016-1-2 17:36:47 | 显示全部楼层
谢谢分享,学习了。
回复 支持 反对

使用道具 举报

51

主题

1455

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2613
金钱
2613
注册时间
2011-1-25
在线时间
176 小时
发表于 2016-1-4 08:34:35 | 显示全部楼层
谢谢分享。定时器也有个编码器模式
一直努力就很好。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2016-3-28
在线时间
2 小时
发表于 2016-3-28 13:13:17 | 显示全部楼层
不错正是我所需要的,刚开始用查询的方式,根本就没有效果,试试楼主这个方法,看看行不行
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
20
金钱
20
注册时间
2016-7-17
在线时间
6 小时
发表于 2016-7-26 14:32:56 | 显示全部楼层
mark
回复 支持 反对

使用道具 举报

3

主题

6

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2017-2-23
在线时间
4 小时
发表于 2017-2-23 17:32:41 | 显示全部楼层
请问 ROTARY_C 是什么
回复 支持 反对

使用道具 举报

2

主题

11

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
296
金钱
296
注册时间
2017-1-18
在线时间
91 小时
发表于 2017-2-28 10:07:23 | 显示全部楼层
兄弟,你的旋钮式怎么接线的?
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2013-10-20
在线时间
10 小时
发表于 2017-3-27 14:52:27 | 显示全部楼层
请教一下,你的单片机IO口是怎么配置的,按照你的程序和波形对不上呢?
天道酬勤
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-22 22:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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