24303|26

466

帖子

0

TA的资源

版主

最精简的stm32编码器程序 [复制链接]

 
本帖最后由 weizhongc 于 2015-4-8 10:07 编辑
  1. #define ROTATE_A  PAin(2)
  2. #define ROTATE_B PAin(3)
  3. s16 DATA=0;

  4. void EXTI2_IRQHandler(void)
  5. {
  6.   if(EXTI_GetITStatus(EXTI_Line2) != RESET)
  7.   {
  8.     if(ROTATE_A!=ROTATE_B)
  9.      {
  10.         DATA++;   
  11.      }
  12.         else DATA--;
  13.     EXTI_ClearITPendingBit(EXTI_Line2);
  14.   }
  15. }


  16. void main(void)
  17. {
  18.           SystemInit();
  19.           delay_init(72);
  20.           NVIC_Configuration();
  21.           KEY_Init();
  22.    while(1)
  23.   {
  24.        ;
  25.   }
  26. }
复制代码




QQ图片20150408100100.jpg QQ图片20150408095519.jpg 大家可以观察图片,当顺时针时,A下降沿时, A!=B;当逆时针时,A下降沿时,A=B,从而来判断顺时针,还是逆时针。而且这样实现简单,只要一个中断就行了。其实我在别的地方看的思路,然后复制过来改的。如果遇到AB 输出的编码器,大家可以参考下啊。有问题可以提出来,互相学习啊、














此帖出自stm32/stm8论坛

最新回复

我想问下的是这种方式,到底能不能使用,以你的经验来说。我现在就是只要实现判断他正转和反转,然后记录两种方式下,脉冲的个数。如我的编码器有1000个栅格,我的理解就是1000个脉冲,算是转一圈。 我在你说的这个if(ROTATE_A != ROTATE_B)这个条件判断中去记录cnt,如语句为cntA++;判断如果cntA 等于1000就算一圈。 else (ROTATE_A == ROTATE_B)使用cntB++;判断cntB等于1000就是一圈。 这样判断,我想应该是没有问题的。 但是事实是,已经转了一圈,cnt没有到1000 是我对这个编码器脉冲数(电机的型号就是最后的后缀有xxx-1000Z)的理解有问题还是?   详情 回复 发表于 2016-8-15 11:53

回复
举报

503

帖子

1

TA的资源

一粒金砂(高级)

可以试试定时器的编码器模式
此帖出自stm32/stm8论坛

回复

4997

帖子

19

TA的资源

裸片初长成(初级)

确实很简洁,比我的简洁多了。
此帖出自stm32/stm8论坛
个人签名我的博客

回复

4005

帖子

0

TA的资源

版主

既然下降沿所以A=0;
换成if (ROTATE_B) data++; else data--;
不行末?
此帖出自stm32/stm8论坛

回复

466

帖子

0

TA的资源

版主

huo_hu 发表于 2015-4-8 16:22
既然下降沿所以A=0;
换成if (ROTATE_B) data++; else data--;
不行末?

恩 确实不错啊。不过你会不会觉得抗干扰会弱很多啊
此帖出自stm32/stm8论坛

回复

29

帖子

1

TA的资源

一粒金砂(中级)

此帖出自stm32/stm8论坛

回复

5

帖子

0

TA的资源

一粒金砂(初级)

相位相差90度的编码器,在顺时针旋转时,A端下降沿对应B端的电平和逆时针旋转时候的B端电平是相反的
此帖出自stm32/stm8论坛

回复

637

帖子

2

TA的资源

版主

这个程序应该是从51或类似的8位单片机的例程中移植过来的,当时51单片机资源不够,只能尽量少用中断来判断编码器状态
但是现在STM32本身硬件就支持编程器,所以用硬件来做会更好(占用软件资源较少)
       程序主要存在的问题是抗干扰,程序本身原理是没错的,但还是建议增加点抗干扰程序为好。

此帖出自stm32/stm8论坛

回复

466

帖子

0

TA的资源

版主

dingzy_2002 发表于 2015-4-9 14:32
这个程序应该是从51或类似的8位单片机的例程中移植过来的,当时51单片机资源不够,只能尽量少用中断来判断编码器状态
但是现在STM32本身硬件就支持编程器,所以用硬件来做会更好(占用软件资源较少)
       程序主要存在的问题是抗干扰,程序本身原理是没错的,但还是建议增加点抗干扰程序为好。

果然是有经验啊,确实需要加抗干扰的啊。在  上升沿,下降沿的时候加延时,来消除抖动会好很多,但还不是很好。
此帖出自stm32/stm8论坛

回复

4005

帖子

0

TA的资源

版主

是的,stm定时器可以实现4个上下沿都计数.
此帖出自stm32/stm8论坛

回复

55

帖子

0

TA的资源

一粒金砂(中级)

Stm32的编码模式,更简单,更好用
此帖出自stm32/stm8论坛

回复

4005

帖子

0

TA的资源

版主

stm定时器软件开销小,不过楼主这个哪里都可以用也不错.
此帖出自stm32/stm8论坛

回复

466

帖子

0

TA的资源

版主

sting_yang 发表于 2015-4-9 23:54
Stm32的编码模式,更简单,更好用

试了 下,资源很受限制啊
此帖出自stm32/stm8论坛

回复

466

帖子

0

TA的资源

版主

  1. #define ROTATE_A  PAin(2)
  2. #define ROTATE_B PAin(3)
  3. s16 DATA=0;

  4. void EXTI2_IRQHandler(void)
  5. {
  6.   if(EXTI_GetITStatus(EXTI_Line2) != RESET)
  7.   {
  8.    delay_us(500);//消抖
  9.     if(ROTATE_A!=ROTATE_B)
  10.      {
  11.         DATA++;   
  12.      }
  13.         else DATA--;
  14.     EXTI_ClearITPendingBit(EXTI_Line2);
  15.   }
  16. }


  17. void main(void)
  18. {
  19.           SystemInit();
  20.           delay_init(72);
  21.           NVIC_Configuration();
  22.           KEY_Init();
  23.    while(1)
  24.   {
  25.        ;
  26.   }
  27. }
复制代码
此帖出自stm32/stm8论坛

回复

2

帖子

0

TA的资源

一粒金砂(初级)

感谢.
此帖出自stm32/stm8论坛

回复

1704

帖子

4

TA的资源

纯净的硅(初级)

不错刚好要用都,需要做个白光烙铁,讲的清楚明白
此帖出自stm32/stm8论坛

回复

1042

帖子

6

TA的资源

纯净的硅(中级)

用外部中断啊;
最好用定时器;
此帖出自stm32/stm8论坛

回复

466

帖子

0

TA的资源

版主

music_586 发表于 2015-4-19 10:21
用外部中断啊;
最好用定时器;

恩 都行啊,我还发了另一个贴 用定时器的,不过如果你有多个编码器你就可能有点麻烦了。
此帖出自stm32/stm8论坛

回复

87

帖子

0

TA的资源

一粒金砂(中级)

之前用STM32做过编码器,网上都找不到资料,自己的代码和楼主几乎一致,但是实测抗感染能力差。加个消抖就OK了,我加的是1ms
此帖出自stm32/stm8论坛

回复

466

帖子

0

TA的资源

版主

jerrylwb 发表于 2015-4-20 11:12
之前用STM32做过编码器,网上都找不到资料,自己的代码和楼主几乎一致,但是实测抗感染能力差。加个消抖就OK了,我加的是1ms

恩  我后面补充了消抖了,之前那程序完全是理论的啊,后面才验证了。
此帖出自stm32/stm8论坛

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表