標(biāo)題: STM32步進(jìn)電機(jī)編碼器讀取源碼 [打印本頁(yè)]

作者: Leo.Lee    時(shí)間: 2018-11-9 15:19
標(biāo)題: STM32步進(jìn)電機(jī)編碼器讀取源碼
STM32F10X  步進(jìn)電機(jī)編碼器 讀取  Hal固件庫(kù)。  

【1】例程簡(jiǎn)介
  使用定時(shí)器功能輸出PWM信號(hào)到步進(jìn)電機(jī)驅(qū)動(dòng)器,使其驅(qū)動(dòng)步進(jìn)電機(jī)轉(zhuǎn)動(dòng)。
  編碼器用于電機(jī)測(cè)速。在電機(jī)轉(zhuǎn)動(dòng)一圈時(shí)編碼器可以輸出固定的脈沖數(shù),通過讀取編碼器
脈沖可以獲取當(dāng)前電機(jī)轉(zhuǎn)動(dòng)狀態(tài)。
一般處理編碼器脈沖有兩種方法:
1. T法:計(jì)算一定量的脈沖數(shù)所用的時(shí)間
2. M法:計(jì)算一段固定時(shí)間內(nèi)所捕獲的脈沖數(shù)。

【2】跳線帽情況
編碼器              A相  --> PC6
                B相  --> PC7
               
步進(jìn)電機(jī)驅(qū)動(dòng)器    DIR- --> PB13
                ENA- --> PB14
                PUL- --> PA8
                DIR+ --> +5V
                ENA+ --> +5V
                PUL+ --> +5V
        
【3】操作及現(xiàn)象
  根據(jù)引腳定義方法連接開發(fā)板和步進(jìn)電機(jī)驅(qū)動(dòng)器,另外步進(jìn)電機(jī)驅(qū)動(dòng)器和
步進(jìn)電機(jī)的連接自行根據(jù)電機(jī)和驅(qū)動(dòng)器標(biāo)識(shí)連接,步進(jìn)電機(jī)驅(qū)動(dòng)器需要一個(gè)24V的直流
電源供電,編碼器是開漏輸出.所以需要接上拉電阻才能正常讀取數(shù)據(jù)。接線時(shí)注意開發(fā)板與步進(jìn)電機(jī)
驅(qū)動(dòng)板“共地”連接,編碼器與開發(fā)板"共地"連接。使用開發(fā)板配套的MINI USB線連接到開發(fā)板標(biāo)示
“調(diào)試串口”字樣的MIMI USB接口為開發(fā)板提供電源。下載完程序之后,開發(fā)板持續(xù)PWM脈沖給步進(jìn)
電機(jī)驅(qū)動(dòng)器,電機(jī)持續(xù)轉(zhuǎn)動(dòng),同時(shí)在串口發(fā)送當(dāng)前編碼器捕獲值,和速度值.


單片機(jī)源程序如下:
  1. /**
  2.   ******************************************************************************
  3.   * 文件名程: main.c
  4.   * 作    者: 硬石嵌入式開發(fā)團(tuán)隊(duì)
  5.   * 版    本: V1.1
  6.   * 功    能: 步進(jìn)電機(jī)編碼測(cè)速

  7.   */
  8. /* 包含頭文件 ----------------------------------------------------------------*/
  9. #include "stm32f1xx_hal.h"
  10. #include "StepMotor/bsp_STEPMOTOR.h"
  11. #include "usart/bsp_debug_usart.h"
  12. #include "EncoderTIM/bsp_EncoderTIM.h"
  13. #include  <string.h>
  14. /* 私有類型定義 --------------------------------------------------------------*/
  15. /* 私有宏定義 ----------------------------------------------------------------*/
  16. #define SAMPLING_PERIOD             20    // 采樣周期;單位20ms
  17. #define TXDCYCLE                  1000    // 數(shù)據(jù)發(fā)送周期;單位:ms
  18. #define SAMPLING                  0x01    // 采樣標(biāo)記
  19. #define TXD                       0x02    // 發(fā)送數(shù)據(jù)標(biāo)記                        
  20. #define SPEED_CONSTANT            ((((float)(TXDCYCLE)/SAMPLING_PERIOD))/PSPM);//脈沖數(shù)轉(zhuǎn)換為mm/s的系數(shù),1秒的脈沖數(shù)/1毫米的脈沖數(shù),這里擴(kuò)大10倍

  21. #define abs(x)                    ((x)<0?(-x):(x))
  22. #define SENDBUFF_SIZE             60  // 串口DMA發(fā)送緩沖區(qū)大小

  23. /* 私有變量 ------------------------------------------------------------------*/
  24. __IO uint16_t time_count=0;         // 時(shí)間計(jì)數(shù),每1ms增加一(與滴答定時(shí)器頻率有關(guān))
  25. __IO int32_t CaptureNumber=0;       // 輸入捕獲數(shù)
  26. __IO int32_t Last_CaptureNumber=0;  // 上一次捕獲值

  27. __IO static int16_t Speed = 50;   // 換算為絲杠上行進(jìn)的速度,單位為:0.1mm/s所以實(shí)際速度是5mm/s
  28. __IO uint16_t SUM_Pulse = 0;
  29. __IO int16_t MSF = 0;               // 電機(jī)反饋速度
  30. __IO float MMPS = 0;                // mm Per Seconed (mm/s)
  31. __IO uint8_t Time_Flag = 0;         // 標(biāo)記時(shí)間

  32. uint8_t aTxBuffer[SENDBUFF_SIZE];          // 串口DMA發(fā)送緩沖區(qū)
  33. /* 擴(kuò)展變量 ------------------------------------------------------------------*/
  34. extern int16_t OverflowCount;             //編碼器計(jì)數(shù)溢出 計(jì)數(shù)器
  35. /* 私有函數(shù)原形 --------------------------------------------------------------*/
  36. /* 函數(shù)體 --------------------------------------------------------------------*/

  37. /**
  38.   * 函數(shù)功能: 系統(tǒng)時(shí)鐘配置
  39.   * 輸入?yún)?shù): 無
  40.   * 返 回 值: 無
  41.   * 說    明: 無
  42.   */
  43. void SystemClock_Config(void)
  44. {
  45.   RCC_OscInitTypeDef RCC_OscInitStruct;
  46.   RCC_ClkInitTypeDef RCC_ClkInitStruct;

  47.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;  // 外部晶振,8MHz
  48.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  49.   RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  50.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  51.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  52.   RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;  // 9倍頻,得到72MHz主時(shí)鐘
  53.   HAL_RCC_OscConfig(&RCC_OscInitStruct);

  54.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  55.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  56.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;       // 系統(tǒng)時(shí)鐘:72MHz
  57.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;              // AHB時(shí)鐘:72MHz
  58.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;               // APB1時(shí)鐘:36MHz
  59.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;               // APB2時(shí)鐘:72MHz
  60.   HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);

  61.          // HAL_RCC_GetHCLKFreq()/1000    1ms中斷一次
  62.         // HAL_RCC_GetHCLKFreq()/100000         10us中斷一次
  63.         // HAL_RCC_GetHCLKFreq()/1000000 1us中斷一次
  64.   HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);  // 配置并啟動(dòng)系統(tǒng)滴答定時(shí)器
  65.   /* 系統(tǒng)滴答定時(shí)器時(shí)鐘源 */
  66.   HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
  67.   /* 系統(tǒng)滴答定時(shí)器中斷優(yōu)先級(jí)配置 */
  68.   HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
  69. }

  70. /**
  71.   * 函數(shù)功能: 主函數(shù).
  72.   * 輸入?yún)?shù): 無
  73.   * 返 回 值: 無
  74.   * 說    明: 無
  75.   */
  76. int main(void)
  77. {
  78.   /* 復(fù)位所有外設(shè),初始化Flash接口和系統(tǒng)滴答定時(shí)器 */
  79.   HAL_Init();
  80.   /* 配置系統(tǒng)時(shí)鐘 */
  81.   SystemClock_Config();

  82.   /* 調(diào)試串口初始化 */
  83.   MX_DEBUG_USART_Init();

  84.   /* 編碼器定時(shí)器初始化并配置輸入捕獲功能 */
  85.   ENCODER_TIMx_Init();
  86.   /* 啟動(dòng)編碼器接口 */
  87.   HAL_TIM_Encoder_Start(&htimx_Encoder, TIM_CHANNEL_ALL);
  88.   
  89.   /* 步進(jìn)電機(jī)定時(shí)器初始化*/
  90.   STEPMOTOR_TIMx_Init();
  91.   /* 啟動(dòng)定時(shí)器 */
  92.   HAL_TIM_Base_Start(&htimx_STEPMOTOR);
  93.   /* 啟動(dòng)比較輸出并使能中斷 */
  94.   HAL_TIM_OC_Start_IT(&htimx_STEPMOTOR,TIM_CHANNEL_1);
  95.   STEPMOTOR_OUTPUT_ENABLE();
  96.   /* 無限循環(huán) */
  97.   while (1)
  98.   {
  99.     //采樣和控制周期為20ms
  100.     if(Time_Flag & SAMPLING)
  101.     {
  102.       //獲得編碼器的脈沖值
  103.       CaptureNumber = OverflowCount*65535 + __HAL_TIM_GET_COUNTER(&htimx_Encoder);

  104.       //M法 測(cè)速度 M法是測(cè)量單位時(shí)間內(nèi)的脈數(shù),然后換算成頻率,這里不算頻率
  105.       MSF = CaptureNumber  - Last_CaptureNumber;
  106.       Last_CaptureNumber = CaptureNumber;
  107.       //對(duì)速度進(jìn)行累計(jì),得到1s內(nèi)的脈沖數(shù)
  108.       MSF = abs(MSF);
  109.       SUM_Pulse += MSF;
  110.       MMPS = MSF*SPEED_CONSTANT;//由脈沖數(shù)轉(zhuǎn)換為 mm/s, MMPS = (MSF*(TXDCYCLE/SAMPLING_PERIOD))/PSPM;

  111.       if(Speed >= MAX_SPEED)//限制最大速度
  112.         Speed = MAX_SPEED;
  113.       if(Speed <= MIN_SPEED)
  114.         Speed = MIN_SPEED;
  115.    
  116.       STEPMOTOR_Motion_Ctrl(CW,Speed);
  117.       Time_Flag &= ~SAMPLING;
  118.     }
  119.     //數(shù)據(jù)發(fā)送周期為1s
  120.     if(Time_Flag & TXD)
  121.     {
  122.       sprintf(aTxBuffer,"捕獲值: %d -- 速度: %.2f mm/s\n",CaptureNumber,(float)MMPS);
  123.       sprintf(aTxBuffer+strlen((const char*)aTxBuffer),"1s內(nèi)編碼器計(jì)數(shù)值: %5d \n\0",SUM_Pulse);
  124.       HAL_UART_Transmit_DMA(&husart_debug,aTxBuffer,strlen((const char*)aTxBuffer));
  125.       SUM_Pulse = 0;
  126.       Time_Flag &= ~TXD;
  127.     }
  128.   }
  129. }

  130. /**
  131.   * 函數(shù)功能: 系統(tǒng)滴答定時(shí)器中斷回調(diào)函數(shù)
  132.   * 輸入?yún)?shù): 無
  133.   * 返 回 值: 無
  134.   * 說    明: 每發(fā)生一次滴答定時(shí)器中斷進(jìn)入該回調(diào)函數(shù)一次
  135.   */
  136. void HAL_SYSTICK_Callback(void)
  137. {
  138.   // 每1ms自動(dòng)增一
  139.   time_count++;         
  140.   if(time_count%(SAMPLING_PERIOD) == 0)// 20ms讀取一次編碼器數(shù)值
  141.   {
  142.     Time_Flag |= SAMPLING;
  143.   }
  144.   else if(time_count>=TXDCYCLE)        //1s發(fā)送一次數(shù)據(jù)
  145.   {
  146.     Time_Flag |= TXD;
  147.     time_count=0;
  148.   }
  149. }
  150. /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式開發(fā)團(tuán)隊(duì) *****END OF FILE****/
復(fù)制代碼

所有資料51hei提供下載:
YSF1_HAL_MOTOR-017. 步進(jìn)電機(jī)編碼器讀取.rar (3.15 MB, 下載次數(shù): 198)



作者: esmember    時(shí)間: 2018-11-22 08:43
這個(gè)先支持一下,最近一直調(diào)試這個(gè),解決不了呢。
作者: swap1    時(shí)間: 2018-11-26 13:37
這個(gè)先支持一下
作者: Papertiger    時(shí)間: 2018-12-12 17:42
學(xué)習(xí)一下編碼器
作者: LET_ME    時(shí)間: 2019-3-4 16:22
支持樓主
作者: BATTER_LI    時(shí)間: 2019-4-8 15:49
剛需,學(xué)習(xí)一下啊
作者: Tiramisu_L    時(shí)間: 2019-7-11 11:12
我是想找樓主要一下hal庫(kù)的教程的。我剛開始用hal庫(kù),很多不是很懂,想找個(gè)視頻教程什么的;蛘哒n件也是可以的
作者: rick_liu    時(shí)間: 2019-12-19 17:40

感謝分享!!
作者: rick_liu    時(shí)間: 2019-12-19 17:41


這個(gè)先支持一下
作者: 你的青春我的夢(mèng)    時(shí)間: 2020-5-13 10:54
謝謝分享




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1