标题: 基于stm32f103系列单片机的AB相编码器使用程序 [打印本页]

作者: 小非    时间: 2018-12-7 13:08
标题: 基于stm32f103系列单片机的AB相编码器使用程序
库函数版编码器测试程序(编码器5V供电。AB相分别接PA0 PA1 串口1以9600波特率输出速度)

单片机源程序如下:
  1. #include "encoder.h"
  2. #include "stm32f10x_gpio.h"
  3.   /**************************************************************************
  4. 作者:平衡小车之家
  5. 我的淘宝小店:http://shop114407458.taobao.com/
  6. **************************************************************************/
  7. /**************************************************************************
  8. 函数功能:把TIM2初始化为编码器接口模式
  9. 入口参数:无
  10. 返回  值:无
  11. **************************************************************************/
  12. void Encoder_Init_TIM2(void)
  13. {
  14.         TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;  
  15.   TIM_ICInitTypeDef TIM_ICInitStructure;  
  16.   GPIO_InitTypeDef GPIO_InitStructure;
  17.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//使能定时器4的时钟
  18.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能PB端口时钟
  19.         
  20.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;        //端口配置
  21.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
  22.   GPIO_Init(GPIOA, &GPIO_InitStructure);                                              //根据设定参数初始化GPIOB
  23.   
  24.   TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  25.   TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // 预分频器
  26.   TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD; //设定计数器自动重装值
  27.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//选择时钟分频:不分频
  28.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;////TIM向上计数  
  29.   TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  30.   TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//使用编码器模式3
  31.   TIM_ICStructInit(&TIM_ICInitStructure);
  32.   TIM_ICInitStructure.TIM_ICFilter = 10;
  33.   TIM_ICInit(TIM2, &TIM_ICInitStructure);
  34.   TIM_ClearFlag(TIM2, TIM_FLAG_Update);//清除TIM的更新标志位
  35.   TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
  36.   //Reset counter
  37.   TIM_SetCounter(TIM2,0);
  38.   TIM_Cmd(TIM2, ENABLE);
  39. }
  40. /**************************************************************************
  41. 函数功能:把TIM4初始化为编码器接口模式
  42. 入口参数:无
  43. 返回  值:无
  44. **************************************************************************/
  45. void Encoder_Init_TIM4(void)
  46. {
  47.         TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;  
  48.   TIM_ICInitTypeDef TIM_ICInitStructure;  
  49.   GPIO_InitTypeDef GPIO_InitStructure;
  50.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);//使能定时器4的时钟
  51.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能PB端口时钟
  52.         
  53.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;        //端口配置
  54.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
  55.   GPIO_Init(GPIOB, &GPIO_InitStructure);                                              //根据设定参数初始化GPIOB
  56.   
  57.   TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  58.   TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // 预分频器
  59.   TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD; //设定计数器自动重装值
  60.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//选择时钟分频:不分频
  61.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;////TIM向上计数  
  62.   TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
  63.   TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//使用编码器模式3
  64.   TIM_ICStructInit(&TIM_ICInitStructure);
  65.   TIM_ICInitStructure.TIM_ICFilter = 10;
  66.   TIM_ICInit(TIM4, &TIM_ICInitStructure);
  67.   TIM_ClearFlag(TIM4, TIM_FLAG_Update);//清除TIM的更新标志位
  68.   TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
  69.   //Reset counter
  70.   TIM_SetCounter(TIM4,0);
  71.   TIM_Cmd(TIM4, ENABLE);
  72. }

  73. /**************************************************************************
  74. 函数功能:单位时间读取编码器计数
  75. 入口参数:定时器
  76. 返回  值:速度值
  77. **************************************************************************/
  78. int Read_Encoder(u8 TIMX)
  79. {
  80.     int Encoder_TIM;   
  81.    switch(TIMX)
  82.          {
  83.            case 2:  Encoder_TIM= (short)TIM2 -> CNT;  TIM2 -> CNT=0;break;
  84.                  case 3:  Encoder_TIM= (short)TIM3 -> CNT;  TIM3 -> CNT=0;break;        
  85.                  case 4:  Encoder_TIM= (short)TIM4 -> CNT;  TIM4 -> CNT=0;break;        
  86.                  default:  Encoder_TIM=0;
  87.          }
  88.                 return Encoder_TIM;
  89. }
  90. /**************************************************************************
  91. 函数功能:TIM4中断服务函数
  92. 入口参数:无
  93. 返回  值:无
  94. **************************************************************************/
  95. void TIM4_IRQHandler(void)
  96. {                                                                  
  97.         if(TIM4->SR&0X0001)//溢出中断
  98.         {                                                                                                
  99.         }                                   
  100.         TIM4->SR&=~(1<<0);//清除中断标志位            
  101. }
  102. /**************************************************************************
  103. 函数功能:TIM2中断服务函数
  104. 入口参数:无
  105. 返回  值:无
  106. **************************************************************************/
  107. void TIM2_IRQHandler(void)
  108. {                                                                  
  109.         if(TIM2->SR&0X0001)//溢出中断
  110.         {                                                                                                
  111.         }                                   
  112.         TIM2->SR&=~(1<<0);//清除中断标志位            
  113. }
复制代码

所有资料51hei提供下载:
库函数版编码器测试程序(编码器5V供电。AB相分别接PA0 PA1 串口1以9600波特率输出速度).rar (303.62 KB, 下载次数: 979)



作者: 82493210    时间: 2019-2-18 01:21
好东西呀,谢谢分享,正需要这东西参考
作者: 小旺仔    时间: 2019-2-20 09:55
你好,我想问下31管脚接的那两个电容是多大
作者: koethen    时间: 2019-2-28 08:15
谢谢分享!
作者: FREEDOG    时间: 2019-4-4 08:06
谢谢分享,楼主辛苦
作者: lxj437294988    时间: 2019-4-18 19:57
谢谢分享,棒!
作者: 1069167864    时间: 2019-4-18 23:59
学习学习
作者: a570532086    时间: 2019-4-26 11:55
刚好需要参考下!
作者: 青菜110    时间: 2019-4-30 14:07
好东西,下过来看看。
作者: lxy512031921    时间: 2019-5-6 16:48
好东西 参考一下
作者: shengye5257    时间: 2019-6-6 20:31
感谢分享感谢分享
作者: zp17777    时间: 2019-6-20 21:12
正好需要,谢谢分享

作者: plj213    时间: 2019-6-28 19:21

谢谢分享,正好需要。。。
作者: twoseven271    时间: 2019-7-6 14:21
好东西呀,谢谢分享
作者: 鹏博士PBs    时间: 2019-7-6 22:21
好东西 感谢分享
作者: zhang445465853    时间: 2019-7-9 11:14
学习了。
作者: lwlh1115    时间: 2019-7-9 15:13
非常实用。
作者: lwlh1115    时间: 2019-7-11 08:16
这个程序如何读出单片机接收并处理的数据啊?
作者: Hi啥是啥    时间: 2019-7-11 15:50
学习了。
作者: h505459004    时间: 2019-7-24 22:21
谢谢楼主啦,代码好详细
作者: 堂堂    时间: 2019-7-25 18:05
这个用的那个开发板?
作者: 69800204    时间: 2019-7-26 09:57
已成功编译,稍做修改后,达到效果
直接用STM32F103C8T6最小系统板,

作者: 69800204    时间: 2019-7-26 10:00
代码直接可用,稍做修改,增加状态灯,左旋转灯及右旋转灯,并在串口只输出旋转状态
作者: 迁就    时间: 2019-8-1 10:23
谢谢分享
作者: 自学成才1    时间: 2019-8-2 19:12
用TIM8连编码器应该用那个中断啊
作者: 自学成才1    时间: 2019-8-2 19:13
用TIM8连编码器应该用那个中断啊
作者: witp    时间: 2019-8-12 11:30
好东西呀,谢谢分享,正需要这东西参考
作者: sym_cool    时间: 2019-8-19 22:30
学习一下,很感谢
作者: ya496928541    时间: 2019-9-29 19:49
好东西呀,谢谢分享,正需要这东西参考
作者: zhczlzhang    时间: 2019-12-5 15:34
需要单相编码器实验,正好做测试,谢谢楼主。
作者: imlion    时间: 2019-12-15 19:30
好东西呀,谢谢分享
作者: picasso123    时间: 2019-12-26 13:54
好东西呀,谢谢分享
作者: ZWZ99    时间: 2020-3-2 14:32
encoder.h在哪里?
作者: 梵xxxx    时间: 2020-3-19 21:01
想问一下 我输出是0  是为什么呀
作者: 62@ls    时间: 2020-3-20 15:52
lwlh1115 发表于 2019-7-11 08:16
这个程序如何读出单片机接收并处理的数据啊?

我也想知道啊
作者: imlion    时间: 2020-3-30 16:04
谢谢分享
作者: 行者无疆555    时间: 2020-4-4 13:59
多谢分享,
作者: 迷路的喵先生    时间: 2020-4-5 11:20
谢谢分享!
作者: 51sam    时间: 2020-4-6 10:49
感谢分享
作者: o大少o    时间: 2020-5-6 16:01
正在研究這個,感謝分享!!!
作者: jackiewu3    时间: 2020-5-17 23:08
Thanks !!!!!
作者: 1054525774    时间: 2020-11-21 15:26
支持楼主,程序可用
作者: popo321    时间: 2020-12-29 10:53
好东西呀,谢谢分享。我也在写这个。
作者: 那一切都是巧合    时间: 2021-1-25 17:52
请教大家,问什么我一直接收到的都是   0   
作者: shu_007    时间: 2021-4-21 11:04
如果知道编码器的线数就可以算转速了
作者: zsp0605    时间: 2021-5-5 23:49
牛B,大哥。找了一天的程序,直到遇见你的程序,正反转区分的问题才解决了。起码让我看到了希望
谢谢分享!!!!!!!!!!!!!!!!!!!!!
作者: xiuyan    时间: 2022-2-10 15:45
ENCODER_TIM_PERIOD 这个变量是多少值
作者: xiuyan    时间: 2022-2-10 15:57
你好,下面代码有问题吗
函数功能:把TIM2初始化为编码器接口模式
入口参数:无
返回  值:无
**************************************************************************/
void Encoder_Init_TIM2(void)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;  
  TIM_ICInitTypeDef TIM_ICInitStructure;  
  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//使能定时器4的时钟
//  RCC_APB2PeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);//使能PB端口时钟
//      
//  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;        //端口配置
//  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //浮空输入
//  GPIO_Init(GPIOA, &GPIO_InitStructure);     
        //根据设定参数初始化GPIOB
          RCC_APB2PeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);//使能PB端口时钟
        
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;        //端口配置
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //浮空输入
  GPIO_Init(GPIOB, &GPIO_InitStructure);         
  
  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // 预分频器
  TIM_TimeBaseStructure.TIM_Period = 1024; //设定计数器自动重装值
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//选择时钟分频:不分频
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;////TIM向上计数  
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//使用编码器模式3
  TIM_ICStructInit(&TIM_ICInitStructure);
  TIM_ICInitStructure.TIM_ICFilter = 10;
  TIM_ICInit(TIM2, &TIM_ICInitStructure);
  TIM_ClearFlag(TIM2, TIM_FLAG_Update);//清除TIM的更新标志位
  TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
  //Reset counter
  TIM_SetCounter(TIM2,0);
  TIM_Cmd(TIM2, ENABLE);
}
作者: 2232611    时间: 2022-3-3 17:53
谢谢分享,正需要这东西参考




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1