找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 28800|回復(fù): 48
打印 上一主題 下一主題
收起左側(cè)

基于stm32f103系列單片機(jī)的AB相編碼器使用程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
#
庫(kù)函數(shù)版編碼器測(cè)試程序(編碼器5V供電。AB相分別接PA0 PA1 串口1以9600波特率輸出速度)

單片機(jī)源程序如下:
  1. #include "encoder.h"
  2. #include "stm32f10x_gpio.h"
  3.   /**************************************************************************
  4. 作者:平衡小車之家
  5. 我的淘寶小店:http://shop114407458.taobao.com/
  6. **************************************************************************/
  7. /**************************************************************************
  8. 函數(shù)功能:把TIM2初始化為編碼器接口模式
  9. 入口參數(shù):無(wú)
  10. 返回  值:無(wú)
  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);//使能定時(shí)器4的時(shí)鐘
  18.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能PB端口時(shí)鐘
  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);                                              //根據(jù)設(shè)定參數(shù)初始化GPIOB
  23.   
  24.   TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  25.   TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // 預(yù)分頻器
  26.   TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD; //設(shè)定計(jì)數(shù)器自動(dòng)重裝值
  27.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//選擇時(shí)鐘分頻:不分頻
  28.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;////TIM向上計(jì)數(shù)  
  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的更新標(biāo)志位
  35.   TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
  36.   //Reset counter
  37.   TIM_SetCounter(TIM2,0);
  38.   TIM_Cmd(TIM2, ENABLE);
  39. }
  40. /**************************************************************************
  41. 函數(shù)功能:把TIM4初始化為編碼器接口模式
  42. 入口參數(shù):無(wú)
  43. 返回  值:無(wú)
  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);//使能定時(shí)器4的時(shí)鐘
  51.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能PB端口時(shí)鐘
  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);                                              //根據(jù)設(shè)定參數(shù)初始化GPIOB
  56.   
  57.   TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  58.   TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // 預(yù)分頻器
  59.   TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD; //設(shè)定計(jì)數(shù)器自動(dòng)重裝值
  60.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//選擇時(shí)鐘分頻:不分頻
  61.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;////TIM向上計(jì)數(shù)  
  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的更新標(biāo)志位
  68.   TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
  69.   //Reset counter
  70.   TIM_SetCounter(TIM4,0);
  71.   TIM_Cmd(TIM4, ENABLE);
  72. }

  73. /**************************************************************************
  74. 函數(shù)功能:?jiǎn)挝粫r(shí)間讀取編碼器計(jì)數(shù)
  75. 入口參數(shù):定時(shí)器
  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. 函數(shù)功能:TIM4中斷服務(wù)函數(shù)
  92. 入口參數(shù):無(wú)
  93. 返回  值:無(wú)
  94. **************************************************************************/
  95. void TIM4_IRQHandler(void)
  96. {                                                                  
  97.         if(TIM4->SR&0X0001)//溢出中斷
  98.         {                                                                                                
  99.         }                                   
  100.         TIM4->SR&=~(1<<0);//清除中斷標(biāo)志位            
  101. }
  102. /**************************************************************************
  103. 函數(shù)功能:TIM2中斷服務(wù)函數(shù)
  104. 入口參數(shù):無(wú)
  105. 返回  值:無(wú)
  106. **************************************************************************/
  107. void TIM2_IRQHandler(void)
  108. {                                                                  
  109.         if(TIM2->SR&0X0001)//溢出中斷
  110.         {                                                                                                
  111.         }                                   
  112.         TIM2->SR&=~(1<<0);//清除中斷標(biāo)志位            
  113. }
復(fù)制代碼

所有資料51hei提供下載:
庫(kù)函數(shù)版編碼器測(cè)試程序(編碼器5V供電。AB相分別接PA0 PA1 串口1以9600波特率輸出速度).rar (303.62 KB, 下載次數(shù): 979)


評(píng)分

參與人數(shù) 2黑幣 +80 收起 理由
songhetai + 30 很給力!
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏18 分享淘帖 頂4 踩
回復(fù)

使用道具 舉報(bào)

48#
ID:355694 發(fā)表于 2022-3-3 17:53 | 只看該作者
謝謝分享,正需要這東西參考
回復(fù)

使用道具 舉報(bào)

47#
ID:990057 發(fā)表于 2022-2-10 15:57 | 只看該作者
你好,下面代碼有問題嗎
函數(shù)功能:把TIM2初始化為編碼器接口模式
入口參數(shù):無(wú)
返回  值:無(wú)
**************************************************************************/
void Encoder_Init_TIM2(void)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;  
  TIM_ICInitTypeDef TIM_ICInitStructure;  
  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//使能定時(shí)器4的時(shí)鐘
//  RCC_APB2PeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);//使能PB端口時(shí)鐘
//      
//  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;        //端口配置
//  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //浮空輸入
//  GPIO_Init(GPIOA, &GPIO_InitStructure);     
        //根據(jù)設(shè)定參數(shù)初始化GPIOB
          RCC_APB2PeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);//使能PB端口時(shí)鐘
        
  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; // 預(yù)分頻器
  TIM_TimeBaseStructure.TIM_Period = 1024; //設(shè)定計(jì)數(shù)器自動(dòng)重裝值
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//選擇時(shí)鐘分頻:不分頻
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;////TIM向上計(jì)數(shù)  
  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的更新標(biāo)志位
  TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
  //Reset counter
  TIM_SetCounter(TIM2,0);
  TIM_Cmd(TIM2, ENABLE);
}
回復(fù)

使用道具 舉報(bào)

46#
ID:990057 發(fā)表于 2022-2-10 15:45 | 只看該作者
ENCODER_TIM_PERIOD 這個(gè)變量是多少值
回復(fù)

使用道具 舉報(bào)

45#
ID:807874 發(fā)表于 2021-5-5 23:49 | 只看該作者
牛B,大哥。找了一天的程序,直到遇見你的程序,正反轉(zhuǎn)區(qū)分的問題才解決了。起碼讓我看到了希望
謝謝分享!。。。。。。。。。。。。。。。。。。。
回復(fù)

使用道具 舉報(bào)

44#
ID:658039 發(fā)表于 2021-4-21 11:04 | 只看該作者
如果知道編碼器的線數(shù)就可以算轉(zhuǎn)速了
回復(fù)

使用道具 舉報(bào)

43#
ID:706833 發(fā)表于 2021-1-25 17:52 | 只看該作者
請(qǐng)教大家,問什么我一直接收到的都是   0   
回復(fù)

使用道具 舉報(bào)

42#
ID:135635 發(fā)表于 2020-12-29 10:53 | 只看該作者
好東西呀,謝謝分享。我也在寫這個(gè)。
回復(fù)

使用道具 舉報(bào)

41#
ID:552256 發(fā)表于 2020-11-21 15:26 | 只看該作者
支持樓主,程序可用
回復(fù)

使用道具 舉報(bào)

40#
ID:747752 發(fā)表于 2020-5-17 23:08 | 只看該作者
Thanks !!!!!
回復(fù)

使用道具 舉報(bào)

39#
ID:328687 發(fā)表于 2020-5-6 16:01 | 只看該作者
正在研究這個(gè),感謝分享。!
回復(fù)

使用道具 舉報(bào)

38#
ID:469511 發(fā)表于 2020-4-6 10:49 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

37#
ID:717693 發(fā)表于 2020-4-5 11:20 | 只看該作者
謝謝分享!
回復(fù)

使用道具 舉報(bào)

36#
ID:720182 發(fā)表于 2020-4-4 13:59 | 只看該作者
多謝分享,
回復(fù)

使用道具 舉報(bào)

35#
ID:593395 發(fā)表于 2020-3-30 16:04 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

34#
ID:692454 發(fā)表于 2020-3-20 15:52 | 只看該作者
lwlh1115 發(fā)表于 2019-7-11 08:16
這個(gè)程序如何讀出單片機(jī)接收并處理的數(shù)據(jù)啊?

我也想知道啊
回復(fù)

使用道具 舉報(bào)

33#
ID:482321 發(fā)表于 2020-3-19 21:01 | 只看該作者
想問一下 我輸出是0  是為什么呀
回復(fù)

使用道具 舉報(bào)

32#
ID:701162 發(fā)表于 2020-3-2 14:32 | 只看該作者
encoder.h在哪里?
回復(fù)

使用道具 舉報(bào)

31#
ID:674516 發(fā)表于 2019-12-26 13:54 | 只看該作者
好東西呀,謝謝分享
回復(fù)

使用道具 舉報(bào)

30#
ID:593395 發(fā)表于 2019-12-15 19:30 | 只看該作者
好東西呀,謝謝分享
回復(fù)

使用道具 舉報(bào)

29#
ID:214628 發(fā)表于 2019-12-5 15:34 | 只看該作者
需要單相編碼器實(shí)驗(yàn),正好做測(cè)試,謝謝樓主。
回復(fù)

使用道具 舉報(bào)

28#
ID:74437 發(fā)表于 2019-9-29 19:49 | 只看該作者
好東西呀,謝謝分享,正需要這東西參考
回復(fù)

使用道具 舉報(bào)

27#
ID:322573 發(fā)表于 2019-8-19 22:30 | 只看該作者
學(xué)習(xí)一下,很感謝
回復(fù)

使用道具 舉報(bào)

26#
ID:160995 發(fā)表于 2019-8-12 11:30 | 只看該作者
好東西呀,謝謝分享,正需要這東西參考
回復(fù)

使用道具 舉報(bào)

25#
ID:586030 發(fā)表于 2019-8-2 19:13 | 只看該作者
用TIM8連編碼器應(yīng)該用那個(gè)中斷啊
回復(fù)

使用道具 舉報(bào)

24#
ID:586030 發(fā)表于 2019-8-2 19:12 | 只看該作者
用TIM8連編碼器應(yīng)該用那個(gè)中斷啊
回復(fù)

使用道具 舉報(bào)

23#
ID:484435 發(fā)表于 2019-8-1 10:23 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

22#
ID:430698 發(fā)表于 2019-7-26 10:00 | 只看該作者
代碼直接可用,稍做修改,增加狀態(tài)燈,左旋轉(zhuǎn)燈及右旋轉(zhuǎn)燈,并在串口只輸出旋轉(zhuǎn)狀態(tài)
回復(fù)

使用道具 舉報(bào)

21#
ID:430698 發(fā)表于 2019-7-26 09:57 | 只看該作者
已成功編譯,稍做修改后,達(dá)到效果
直接用STM32F103C8T6最小系統(tǒng)板,
回復(fù)

使用道具 舉報(bào)

20#
ID:496604 發(fā)表于 2019-7-25 18:05 | 只看該作者
這個(gè)用的那個(gè)開發(fā)板?
回復(fù)

使用道具 舉報(bào)

19#
ID:583076 發(fā)表于 2019-7-24 22:21 | 只看該作者
謝謝樓主啦,代碼好詳細(xì)
回復(fù)

使用道具 舉報(bào)

18#
ID:582378 發(fā)表于 2019-7-11 15:50 | 只看該作者
學(xué)習(xí)了。
回復(fù)

使用道具 舉報(bào)

17#
ID:580100 發(fā)表于 2019-7-11 08:16 | 只看該作者
這個(gè)程序如何讀出單片機(jī)接收并處理的數(shù)據(jù)啊?
回復(fù)

使用道具 舉報(bào)

16#
ID:580100 發(fā)表于 2019-7-9 15:13 | 只看該作者
非常實(shí)用。
回復(fù)

使用道具 舉報(bào)

15#
ID:410905 發(fā)表于 2019-7-9 11:14 | 只看該作者
學(xué)習(xí)了。
回復(fù)

使用道具 舉報(bào)

14#
ID:282095 發(fā)表于 2019-7-6 22:21 | 只看該作者
好東西 感謝分享
回復(fù)

使用道具 舉報(bào)

13#
ID:68108 發(fā)表于 2019-7-6 14:21 | 只看該作者
好東西呀,謝謝分享
回復(fù)

使用道具 舉報(bào)

12#
ID:138247 發(fā)表于 2019-6-28 19:21 | 只看該作者

謝謝分享,正好需要。。。
回復(fù)

使用道具 舉報(bào)

11#
ID:477269 發(fā)表于 2019-6-20 21:12 | 只看該作者
正好需要,謝謝分享
回復(fù)

使用道具 舉報(bào)

10#
ID:256435 發(fā)表于 2019-6-6 20:31 | 只看該作者
感謝分享感謝分享
回復(fù)

使用道具 舉報(bào)

9#
ID:438489 發(fā)表于 2019-5-6 16:48 | 只看該作者
好東西 參考一下
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表