久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9982|回復: 9
收起左側(cè)

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

  [復制鏈接]
ID:364498 發(fā)表于 2018-11-9 15:19 | 顯示全部樓層 |閱讀模式
STM32F10X  步進電機編碼器 讀取  Hal固件庫。  

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

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


單片機源程序如下:
  1. /**
  2.   ******************************************************************************
  3.   * 文件名程: main.c
  4.   * 作    者: 硬石嵌入式開發(fā)團隊
  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    // 數(shù)據(jù)發(fā)送周期;單位:ms
  18. #define SAMPLING                  0x01    // 采樣標記
  19. #define TXD                       0x02    // 發(fā)送數(shù)據(jù)標記                        
  20. #define SPEED_CONSTANT            ((((float)(TXDCYCLE)/SAMPLING_PERIOD))/PSPM);//脈沖數(shù)轉(zhuǎn)換為mm/s的系數(shù),1秒的脈沖數(shù)/1毫米的脈沖數(shù),這里擴大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ù),每1ms增加一(與滴答定時器頻率有關(guān))
  25. __IO int32_t CaptureNumber=0;       // 輸入捕獲數(shù)
  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發(fā)送緩沖區(qū)
  33. /* 擴展變量 ------------------------------------------------------------------*/
  34. extern int16_t OverflowCount;             //編碼器計數(shù)溢出 計數(shù)器
  35. /* 私有函數(shù)原形 --------------------------------------------------------------*/
  36. /* 函數(shù)體 --------------------------------------------------------------------*/

  37. /**
  38.   * 函數(shù)功能: 系統(tǒng)時鐘配置
  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主時鐘
  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)時鐘: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);  // 配置并啟動系統(tǒng)滴答定時器
  65.   /* 系統(tǒng)滴答定時器時鐘源 */
  66.   HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
  67.   /* 系統(tǒng)滴答定時器中斷優(yōu)先級配置 */
  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.   /* 復位所有外設(shè),初始化Flash接口和系統(tǒng)滴答定時器 */
  79.   HAL_Init();
  80.   /* 配置系統(tǒng)時鐘 */
  81.   SystemClock_Config();

  82.   /* 調(diào)試串口初始化 */
  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.   /* 無限循環(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法 測速度 M法是測量單位時間內(nèi)的脈數(shù),然后換算成頻率,這里不算頻率
  105.       MSF = CaptureNumber  - Last_CaptureNumber;
  106.       Last_CaptureNumber = CaptureNumber;
  107.       //對速度進行累計,得到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)編碼器計數(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)滴答定時器中斷回調(diào)函數(shù)
  132.   * 輸入?yún)?shù): 無
  133.   * 返 回 值: 無
  134.   * 說    明: 每發(fā)生一次滴答定時器中斷進入該回調(diào)函數(shù)一次
  135.   */
  136. void HAL_SYSTICK_Callback(void)
  137. {
  138.   // 每1ms自動增一
  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ā)團隊 *****END OF FILE****/
復制代碼

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

使用道具 舉報

ID:185372 發(fā)表于 2018-11-22 08:43 | 顯示全部樓層
這個先支持一下,最近一直調(diào)試這個,解決不了呢。
回復

使用道具 舉報

ID:242969 發(fā)表于 2018-11-26 13:37 | 顯示全部樓層
這個先支持一下
回復

使用道具 舉報

ID:242797 發(fā)表于 2018-12-12 17:42 | 顯示全部樓層
學習一下編碼器
回復

使用道具 舉報

ID:484341 發(fā)表于 2019-3-4 16:22 | 顯示全部樓層
支持樓主
回復

使用道具 舉報

ID:489661 發(fā)表于 2019-4-8 15:49 | 顯示全部樓層
剛需,學習一下啊
回復

使用道具 舉報

ID:500798 發(fā)表于 2019-7-11 11:12 | 顯示全部樓層
我是想找樓主要一下hal庫的教程的。我剛開始用hal庫,很多不是很懂,想找個視頻教程什么的。或者課件也是可以的
回復

使用道具 舉報

ID:305616 發(fā)表于 2019-12-19 17:40 | 顯示全部樓層

感謝分享!!
回復

使用道具 舉報

ID:305616 發(fā)表于 2019-12-19 17:41 | 顯示全部樓層


這個先支持一下
回復

使用道具 舉報

ID:237117 發(fā)表于 2020-5-13 10:54 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区三区四区视频 | 一区二区视频在线 | 亚洲视频免费在线观看 | 福利成人 | 一区二区三区四区五区在线视频 | 亚洲在线一区二区 | 久久久久国产精品一区二区 | 中文字幕一级 | 日韩在线一区二区三区 | av中文字幕在线播放 | 欧美一区二区三区在线观看 | 国产精品久久性 | 日韩欧美高清 | 国产精品99久久久精品免费观看 | 无毛av | 天天艹日日干 | 蜜桃传媒av| www.久久99 | 国产羞羞视频在线观看 | 激情黄色在线观看 | 欧美在线视频观看 | 精久久久久| 男女视频在线免费观看 | 国产亚洲成av人在线观看导航 | 久热久草 | 九九导航 | 亚洲欧洲一区二区 | 国产目拍亚洲精品99久久精品 | 性高湖久久久久久久久aaaaa | 亚洲成人一区 | 欧美亚洲另类丝袜综合网动图 | 玖玖视频 | 九九亚洲精品 | 99爱在线免费观看 | av黄色在线观看 | 久久国产精品免费一区二区三区 | 久久久久久成人 | 国内自拍视频在线观看 | 美女天天操 | 91欧美| 欧美亚洲国产成人 |