切换到宽版
  • 4861阅读
  • 18回复

EC11旋转编码开关的汇编程序已经编写测试成功,即将开源 [复制链接]

上一主题 下一主题
 

发帖
522
M币
908
专家
11
粉丝
16
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2017-01-21
两个月前还在此发贴求教,http://bbs.mydigit.cn/read.php?tid=1900269
经过几晚的脑力,现在已经编写出汇编程序,并调试成功,不过还未算完美,只要问题是 旋转未扭到位那程序会死循环导致显示不正常,正在想法解决中。
所有程序都是本人原创,下面先上编程思路的图片,调试完善后再上全部程序。




本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共1条打赏M币+3
离线synctoy

发帖
1846
M币
1065
专家
2
粉丝
23
只看该作者 1楼 发表于: 2017-01-22
高级玩具,真牛

内容来自Android手机客户端

离线2545889167

发帖
12613
M币
15092
专家
287
粉丝
4669
只看该作者 2楼 发表于: 2017-01-22
stm32和stm8都是有编码器接口的,初始化好以后就能自己读了,根本不用任何操作。要值的时候去定时器计数器里面取一下就行。







  1. /* Includes ------------------------------------------------------------------*/
  2. #include "encoder.h"
  3. #include <stdio.h>
  4. /* Private typedef -----------------------------------------------------------*/
  5. /* Private define ------------------------------------------------------------*/
  6. #define ENCODER_TIMER                TIM3  // Encoder unit connected to TIM3
  7. #define ENCODER_TIMER_RCC                      RCC_APB1Periph_TIM3
  8. #define ENCODER_PPR           (u16)(0xffff)   // number of pulses per revolution
  9. #define COUNTER_RESET   (u16)0
  10. #define ICx_FILTER      (u8) 6 // 6<-> 670nsec消抖时间
  11. #define ENCODER_TIMER_IRQChannel  TIM3_IRQn
  12. #define TIMx_PRE_EMPTION_PRIORITY 1
  13. #define TIMx_SUB_PRIORITY 0
  14. /*******************************************************************************
  15. * Function Name  : ENC_Init//编码器接口初始化
  16. * Description    : General Purpose Timer x set-up for encoder speed/position
  17. *                  sensors
  18. * Input          : None
  19. * Output         : None
  20. * Return         : None
  21. *******************************************************************************/
  22. void Encoder_Init(void)
  23. {
  24.   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  25.   TIM_ICInitTypeDef TIM_ICInitStructure;
  26.   
  27. /* Encoder unit connected to TIM3, 4X mode */    
  28.   GPIO_InitTypeDef GPIO_InitStructure;
  29. //  NVIC_InitTypeDef NVIC_InitStructure;
  30.   
  31.   /* TIM3 clock source enable */
  32.   RCC_APB1PeriphClockCmd(ENCODER_TIMER_RCC, ENABLE);
  33.   /* Enable GPIOA, clock */
  34.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  35.   
  36.   GPIO_StructInit(&GPIO_InitStructure);
  37.   /* Configure PA.06,07 as encoder input */
  38.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
  39.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  40.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  41.   
  42.   /* Timer configuration in Encoder mode */
  43.   TIM_DeInit(ENCODER_TIMER);
  44.   TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  45.   
  46.   TIM_TimeBaseStructure.TIM_Prescaler = 0x0;  // No prescaling
  47.   TIM_TimeBaseStructure.TIM_Period = ENCODER_PPR;  
  48.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  49.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  50.   TIM_TimeBaseInit(ENCODER_TIMER, &TIM_TimeBaseStructure);
  51.   TIM_EncoderInterfaceConfig(ENCODER_TIMER, TIM_EncoderMode_TI1,
  52.                              TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
  53.   TIM_ICStructInit(&TIM_ICInitStructure);
  54.   TIM_ICInitStructure.TIM_ICFilter = ICx_FILTER;
  55.   TIM_ICInit(ENCODER_TIMER, &TIM_ICInitStructure);
  56.   
  57. // Clear all pending interrupts
  58.   TIM_ClearFlag(ENCODER_TIMER, TIM_FLAG_Update);
  59.   TIM_ITConfig(ENCODER_TIMER, TIM_IT_Update, ENABLE);
  60.   //Reset counter
  61.   ENCODER_TIMER->CNT = COUNTER_RESET;
  62.   
  63.   
  64.   TIM_Cmd(ENCODER_TIMER, ENABLE);  
  65. }
  66. u16 GET_Counter(void)//读取当前的编码器值
  67. {
  68.     return TIM_GetCounter(ENCODER_TIMER);
  69. }

  1. uint16_t TIM_GetCounter(TIM_TypeDef* TIMx)
  2. {
  3. //在定时器计数器寄存器里面取数
  4.   return TIMx->CNT;
  5. }





本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共2条打赏M币+13

发帖
522
M币
908
专家
11
粉丝
16
只看该作者 3楼 发表于: 2017-01-22
2545889167stm32和stm8都是有编码器接口的,初始化好以后就能自己读了,根本不用任何操作。要值的时候去定时器计数器里面取一下就行。<br> <span id="att_9097418" class="f12"><span id="td_att9097418" onmouseover="postAttImgHover('menu_att9097418','td_att9097418');" style="display:inline-block;" class="J_attImg"><img src="http://img.mydigit.net/Mon_1701/108_1795013_74c1d86bc96145e.jpg?161" border="0" onclick="if(this.parentNode.tagName!='A'&&this.width>=740) window.open('http://img.mydigit.net/Mon_1701/108_1795013_74c1d86bc96145e.jpg?161');" style="max-width:100%;" onload="if(is_ie6&&this.offsetWidth>740)this.width=740;" title="" alt=""></span><div id="menu_att9097418" class="fl" style="display:none;"><div class="pw_menu" style="position:absolute;z-index:1;"><div style="border:1px solid #ffffff;background:#f3f9fb;padding:5px 10px;"><p><span class="mr10">图片:1.JPG</span></p></div></div></div></span><br><span id="att_9097419" class="f12"><span id="td_att9097419" onmouseover="postAttImgHover('menu_att9097419','td_att9097419');" style="display:inline-block;" class="J_attImg"><img src="http://img.mydigit.net/Mon_1701/108_1795013_1ad01265293bd35.jpg?120" border="0" onclick="if(this.parentNode.tagName!='A'&&this.width>=740) window.open('http://img.mydigit.net/Mon_1701/108_1795013_1ad01265293bd35.jpg?120');" style="max-width:100%;" onload="if(is_ie6&&this.offsetWidth>740)this.width=740;" title="" alt=""></span><div id="menu_att9097419" class="fl" style="display:none;"><div class="pw_menu" style="position:absolute;z-index:1;"><div style="border:1px solid #ffffff;background:#f3f9fb;padding:5px 10px;"><p><span class="mr10">图片:2.JPG</span></p></div></div></div></span><br><span id="att_9097421" class="f12"><span id="td_att9097421" onmouseover="postAttImgHover('menu_att9097421','td_att9097421');" style="display:inline-block;" class="J_attImg"><img src="http://img.mydigit.net/Mon_1701/108_1795013_3cbe23a28d89a71.jpg?103" border="0" onclick="if(this.parentNode.tagName!='A'&&this.width>=740) window.open('http://img.mydigit.net/Mon_1701/108_1795013_3cbe23a28d89a71.jpg?103');" style="max-width:100%;" onload="if(is_ie6&&this.offsetWidth>740)this.width=740;" title="" alt=""></span><div id="menu_att9097421" class="fl" style="display:none;"><div class="pw_menu" style="position:absolute;z-index:1;"><div style="border:1px solid #ffffff;background:#f3f9fb;padding:5px 10px;"><p><span class="mr10">图片:3.JPG</span></p></div></div></div></span><br><br><br><br><br><div class="f12"><a href="javascript:" onclick="CopyCode(document.getElementById('code1'));">复制代码</a></div><div class="blockquote2" id="code1"><ol><li>/* Includes ------------------------------------------------------------------*/</li><li></li><li>#include "encoder.h"</li><li>#include <stdio.h></li><li></li><li>/* Private typedef -----------------------------------------------------------*/</li><li>/* Private define ------------------------------------------------------------*/</li><li>#define ENCODER_TIMER                TIM3  // Encoder unit connected to TIM3</li><li>#define ENCODER_TIMER_RCC                      RCC_APB1Periph_TIM3</li><li>#define ENCODER_PPR           (u16)(0xffff)   // number of pulses per revolution</li><li></li><li></li><li>#define COUNTER_RESET   (u16)0</li><li>#define ICx_FILTER      (u8) 6 // 6<-> 670nsec消抖时间</li><li></li><li>#define ENCODER_TIMER_IRQChannel  TIM3_IRQn</li><li>#define TIMx_PRE_EMPTION_PRIORITY 1</li><li>#define TIMx_SUB_PRIORITY 0</li><li></li><li></li><li></li><li></li><li>/*******************************************************************************</li><li>* Function Name  : ENC_Init//编码器接口初始化</li><li>* Description    : General Purpose Timer x set-up for encoder speed/position </li><li>*                  sensors</li><li>* Input          : None</li><li>* Output         : None</li><li>* Return         : None</li><li>*******************************************************************************/</li><li>void Encoder_Init(void)</li><li>{</li><li>  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;</li><li>  TIM_ICInitTypeDef TIM_ICInitStructure;</li><li>  </li><li>/* Encoder unit connected to TIM3, 4X mode */    </li><li>  GPIO_InitTypeDef GPIO_InitStructure;</li><li>//  NVIC_InitTypeDef NVIC_InitStructure;</li><li>  </li><li>  /* TIM3 clock source enable */</li><li>  RCC_APB1PeriphClockCmd(ENCODER_TIMER_RCC, ENABLE);</li><li>  /* Enable GPIOA, clock */</li><li>  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);</li><li>  </li><li>  GPIO_StructInit(&GPIO_InitStructure);</li><li>  /* Configure PA.06,07 as encoder input */</li><li>  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;</li><li>  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;</li><li>  GPIO_Init(GPIOA, &GPIO_InitStructure);</li><li>  </li><li></li><li>  /* Timer configuration in Encoder mode */</li><li>  TIM_DeInit(ENCODER_TIMER);</li><li>  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);</li><li>  </li><li>  TIM_TimeBaseStructure.TIM_Prescaler = 0x0;  // No prescaling </li><li>  TIM_TimeBaseStructure.TIM_Period = ENCODER_PPR;  </li><li>  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;</li><li>  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   </li><li>  TIM_TimeBaseInit(ENCODER_TIMER, &TIM_TimeBaseStructure);</li><li> </li><li>  TIM_EncoderInterfaceConfig(ENCODER_TIMER, TIM_EncoderMode_TI1, </li><li>                             TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);</li><li>  TIM_ICStructInit(&TIM_ICInitStructure);</li><li>  TIM_ICInitStructure.TIM_ICFilter = ICx_FILTER;</li><li>  TIM_ICInit(ENCODER_TIMER, &TIM_ICInitStructure);</li><li>  </li><li> // Clear all pending interrupts</li><li>  TIM_ClearFlag(ENCODER_TIMER, TIM_FLAG_Update);</li><li>  TIM_ITConfig(ENCODER_TIMER, TIM_IT_Update, ENABLE);</li><li>  //Reset counter</li><li>  ENCODER_TIMER->CNT = COUNTER_RESET;</li><li>  </li><li>  </li><li>  TIM_Cmd(ENCODER_TIMER, ENABLE);  </li><li>}</li><li></li><li></li><li></li><li>u16 GET_Counter(void)//读取当前的编码器值</li><li>{</li><li>    return TIM_GetCounter(ENCODER_TIMER);</li><li>}</li></ol></div><br><div class="f12"><a href="javascript:" onclick="CopyCode(document.getElementById('code2'));">复制代码</a></div><div class="blockquote2" id="code2"><ol><li>uint16_t TIM_GetCounter(TIM_TypeDef* TIMx)</li><li>{</li><li>//在定时器计数器寄存器里面取数</li><li>  return TIMx->CNT;</li><li>}</li></ol></div><br> <br> <br> <br> <br>
      
不会用stm,只会用c51
本帖最近打赏记录:共1条打赏M币+3
离线蓝昊王

发帖
205
M币
693
专家
1
粉丝
21
只看该作者 4楼 发表于: 2017-01-22
回 广东梁百万 的帖子
广东梁百万:不会用stm,只会用c51 (2017-01-22 11:32) 回 广东梁百万 的帖子

既然会用51,就可以学会STM,只不过是高级些的51而已。
离线yanxue11

发帖
538
M币
4846
专家
9
粉丝
81
只看该作者 5楼 发表于: 2017-01-22
编码器需要这么复杂吗?
就几行代码

我也是无语了。
离线lijn

发帖
248
M币
4012
专家
1
粉丝
9
只看该作者 6楼 发表于: 2017-01-22
原創內容,能解析原理就好了。

发帖
522
M币
908
专家
11
粉丝
16
只看该作者 7楼 发表于: 2017-01-22
yanxue11编码器需要这么复杂吗?<br>就几行代码<br><br>我也是无语了。
      
俺不懂c语言,不知道你要多少行代码就能解决。汇编语言的话那就要大概一百行代码
离线金向维

发帖
5216
M币
806
专家
110
粉丝
518
只看该作者 8楼 发表于: 2017-01-22
c语言极其简单的
本帖最近打赏记录:共1条打赏M币+3
离线金向维

发帖
5216
M币
806
专家
110
粉丝
518
只看该作者 9楼 发表于: 2017-01-22
心疼楼主 c语言用外部中断或者定时器中断 不算中断的代码的话 也就几行搞定
本帖最近打赏记录:共1条打赏M币+3