欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10685|回復: 9
打印 上一主題 下一主題
收起左側

STM32步進電機編碼器讀取源碼

  [復制鏈接]
跳轉到指定樓層
樓主
ID:364498 發表于 2018-11-9 15:19 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
STM32F10X  步進電機編碼器 讀取  Hal固件庫。  

【1】例程簡介
  使用定時器功能輸出PWM信號到步進電機驅動器,使其驅動步進電機轉動。
  編碼器用于電機測速。在電機轉動一圈時編碼器可以輸出固定的脈沖數,通過讀取編碼器
脈沖可以獲取當前電機轉動狀態。
一般處理編碼器脈沖有兩種方法:
1. T法:計算一定量的脈沖數所用的時間
2. M法:計算一段固定時間內所捕獲的脈沖數。

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


單片機源程序如下:
  1. /**
  2.   ******************************************************************************
  3.   * 文件名程: main.c
  4.   * 作    者: 硬石嵌入式開發團隊
  5.   * 版    本: V1.1
  6.   * 功    能: 步進電機編碼測速

  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    // 數據發送周期;單位:ms
  18. #define SAMPLING                  0x01    // 采樣標記
  19. #define TXD                       0x02    // 發送數據標記                        
  20. #define SPEED_CONSTANT            ((((float)(TXDCYCLE)/SAMPLING_PERIOD))/PSPM);//脈沖數轉換為mm/s的系數,1秒的脈沖數/1毫米的脈沖數,這里擴大10倍

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

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

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

  32. uint8_t aTxBuffer[SENDBUFF_SIZE];          // 串口DMA發送緩沖區
  33. /* 擴展變量 ------------------------------------------------------------------*/
  34. extern int16_t OverflowCount;             //編碼器計數溢出 計數器
  35. /* 私有函數原形 --------------------------------------------------------------*/
  36. /* 函數體 --------------------------------------------------------------------*/

  37. /**
  38.   * 函數功能: 系統時鐘配置
  39.   * 輸入參數: 無
  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主時鐘
  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;       // 系統時鐘:72MHz
  57.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;              // AHB時鐘:72MHz
  58.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;               // APB1時鐘:36MHz
  59.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;               // APB2時鐘: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);  // 配置并啟動系統滴答定時器
  65.   /* 系統滴答定時器時鐘源 */
  66.   HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
  67.   /* 系統滴答定時器中斷優先級配置 */
  68.   HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
  69. }

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

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

  84.   /* 編碼器定時器初始化并配置輸入捕獲功能 */
  85.   ENCODER_TIMx_Init();
  86.   /* 啟動編碼器接口 */
  87.   HAL_TIM_Encoder_Start(&htimx_Encoder, TIM_CHANNEL_ALL);
  88.   
  89.   /* 步進電機定時器初始化*/
  90.   STEPMOTOR_TIMx_Init();
  91.   /* 啟動定時器 */
  92.   HAL_TIM_Base_Start(&htimx_STEPMOTOR);
  93.   /* 啟動比較輸出并使能中斷 */
  94.   HAL_TIM_OC_Start_IT(&htimx_STEPMOTOR,TIM_CHANNEL_1);
  95.   STEPMOTOR_OUTPUT_ENABLE();
  96.   /* 無限循環 */
  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法 測速度 M法是測量單位時間內的脈數,然后換算成頻率,這里不算頻率
  105.       MSF = CaptureNumber  - Last_CaptureNumber;
  106.       Last_CaptureNumber = CaptureNumber;
  107.       //對速度進行累計,得到1s內的脈沖數
  108.       MSF = abs(MSF);
  109.       SUM_Pulse += MSF;
  110.       MMPS = MSF*SPEED_CONSTANT;//由脈沖數轉換為 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.     //數據發送周期為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內編碼器計數值: %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.   * 函數功能: 系統滴答定時器中斷回調函數
  132.   * 輸入參數: 無
  133.   * 返 回 值: 無
  134.   * 說    明: 每發生一次滴答定時器中斷進入該回調函數一次
  135.   */
  136. void HAL_SYSTICK_Callback(void)
  137. {
  138.   // 每1ms自動增一
  139.   time_count++;         
  140.   if(time_count%(SAMPLING_PERIOD) == 0)// 20ms讀取一次編碼器數值
  141.   {
  142.     Time_Flag |= SAMPLING;
  143.   }
  144.   else if(time_count>=TXDCYCLE)        //1s發送一次數據
  145.   {
  146.     Time_Flag |= TXD;
  147.     time_count=0;
  148.   }
  149. }
  150. /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式開發團隊 *****END OF FILE****/
復制代碼

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


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

使用道具 舉報

沙發
ID:185372 發表于 2018-11-22 08:43 | 只看該作者
這個先支持一下,最近一直調試這個,解決不了呢。
回復

使用道具 舉報

板凳
ID:242969 發表于 2018-11-26 13:37 | 只看該作者
這個先支持一下
回復

使用道具 舉報

地板
ID:242797 發表于 2018-12-12 17:42 | 只看該作者
學習一下編碼器
回復

使用道具 舉報

5#
ID:484341 發表于 2019-3-4 16:22 | 只看該作者
支持樓主
回復

使用道具 舉報

6#
ID:489661 發表于 2019-4-8 15:49 | 只看該作者
剛需,學習一下啊
回復

使用道具 舉報

7#
ID:500798 發表于 2019-7-11 11:12 | 只看該作者
我是想找樓主要一下hal庫的教程的。我剛開始用hal庫,很多不是很懂,想找個視頻教程什么的。或者課件也是可以的
回復

使用道具 舉報

8#
ID:305616 發表于 2019-12-19 17:40 | 只看該作者

感謝分享!!
回復

使用道具 舉報

9#
ID:305616 發表于 2019-12-19 17:41 | 只看該作者


這個先支持一下
回復

使用道具 舉報

10#
ID:237117 發表于 2020-5-13 10:54 | 只看該作者
謝謝分享
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表