STM32+TMC2209控制步進電機正反轉。

STM32F103ZET6+TMC2209控制步進電機正反轉

  • 1. 步進電機介紹
  • 2 驅動器TMC2209介紹
    • 2.1 引腳圖及其功能
    • 2.2 細分介紹
    • 2.3 TMC控制驅動器接法
  • 3 控制器介紹
    • 3.1 確定控制引腳
    • 3.2 UBEMX配置
      • 3.2.1 GPIO配置
      • 3.2.2 NVIC配置
      • 3.2.3 RCC配置
      • 3.2.4 SYS配置
      • 3.2.5 USRAT2配置(PS:沒用上可以跳過)
      • 3.2.6 保存并生成工程
  • 4 代碼部分

1. 步進電機介紹

  • 本實驗采用2項步進電機,電機只有2項,A+\A-\B+\B-。
  • 電機步距角1.8°
    在這里插入圖片描述

2 驅動器TMC2209介紹

2.1 引腳圖及其功能

在這里插入圖片描述
在這里插入圖片描述

2.2 細分介紹

在這里插入圖片描述

  • 8細分控制精度=1.8°/8=0.225°,電機轉一周需要1600個脈沖。
  • 16細分控制精度=1.8°/16=0.1125°,電機轉一周需要3200個脈沖。
  • 32細分控制精度=1.8°/32=0.05625°,電機轉一周需要6400個脈沖。
  • 64細分控制精度=1.8°/64=0.0140625°,電機轉一周需要12800個脈沖。
    滿足絕大多數精度場景,如低精度機床、家電、3D打印等。

2.3 TMC控制驅動器接法

這里只需要使用13個引腳
EN:控制器使能引腳,接GND, 電機才能工作。
DIR:控制方向,這個引腳的高\低電平分別控制正\反轉
VM:給電機的電壓(4.75—>28VDC),可以選擇24V電源供電,沒24V直流電源可以在網上買一個。電機電壓5V可能導致電機丟步,盡量選擇24V的直流電源。
GND:VM的GND
STEP: 控制脈沖,一個占空比為50%高電平、一個占空比50%的低電平為一個脈沖。
MS1\MS2: 控制細分,參考2.2節
VDD: 給TMC2209供電,供+5V供電。
GND: VDD的GND
A1\A2\B1\B2: 參考第1節的電機。

3 控制器介紹

  • STM32F103ZET6(正點原子V3)

3.1 確定控制引腳

  • 將下面的引腳與2.3的引腳連接,具體位置如下圖紅圈位置。
    DIR: PF12/FSMC_A6
    STEP: PG1/FSMC_A11
    EN: PF14/FSMC_A8
    MS1: PF15/FSMC_A9
    MS2: PG0/FSMC_VA10
    VDD: 見下圖紅圈位置
    GND: 見下圖紅圈位置
    在這里插入圖片描述

3.2 UBEMX配置

3.2.1 GPIO配置

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

3.2.2 NVIC配置

在這里插入圖片描述在這里插入圖片描述

3.2.3 RCC配置

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

3.2.4 SYS配置

  • 用的ST-link V2的仿真器,選擇下面這個:
    在這里插入圖片描述

3.2.5 USRAT2配置(PS:沒用上可以跳過)

在這里插入圖片描述

3.2.6 保存并生成工程

在這里插入圖片描述

4 代碼部分

主要修改main.c,其他的不用管。

/* USER CODE BEGIN Header */
/********************************************************************************* @file           : main.c* @brief          : Main program body******************************************************************************* @attention** Copyright (c) 2024 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usart.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes *//* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD *//* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*/
// UART_HandleTypeDef huart2a;
/* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
// static void MX_GPIO_Init(void);
// static void MX_USART2_UART_Init(void);
void SystemClock_Config(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void SubdivisionSet(uint8_t i);												//細分設置
void MoveStep(uint8_t DIR_Flag,uint32_t Step);				//電機移動多少步
/* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART2_UART_Init();/* USER CODE BEGIN 2 */SubdivisionSet(64);													//細分設置為64HAL_GPIO_WritePin(GPIOG,STEP_Pin, GPIO_PIN_SET);//STEP設置為高/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE */MoveStep(1,12800*10);													//正轉一圈HAL_Delay(2000);														//延時2SMoveStep(0,12800*10);													//反轉一圈HAL_Delay(2000);														//延時2S/* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}/*** @brief SubdivisionSet* 細分設置* @retval None*/
void SubdivisionSet(uint8_t i)
{if(i==8){HAL_GPIO_WritePin(GPIOG,MS2_Pin, GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOF,MS1_Pin, GPIO_PIN_RESET);}else 	if(i==32){HAL_GPIO_WritePin(GPIOG,MS2_Pin, GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOF,MS1_Pin, GPIO_PIN_SET);}else 	if(i==64){HAL_GPIO_WritePin(GPIOG,MS2_Pin, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOF,MS1_Pin, GPIO_PIN_RESET);}else{HAL_GPIO_WritePin(GPIOG,MS2_Pin, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOF,MS1_Pin, GPIO_PIN_SET);}
}
/*** @brief DelayNop* 延時* @retval None*/
void DelayNop(uint8_t i)
{uint32_t 	j;do{for(j=0;j<100;j++){;}}while(i--);
}
/*** @brief MoveStep* 電機移動多少步* @retval None*/
void MoveStep(uint8_t DIR_Flag,uint32_t Step)
{//uint8_t		j=200;uint32_t		j=1;uint32_t 	i;//電機使能HAL_GPIO_WritePin(GPIOF,EN_Pin, GPIO_PIN_RESET);if(DIR_Flag){//正轉HAL_GPIO_WritePin(GPIOF,DIR_Pin, GPIO_PIN_SET);}else{//反轉HAL_GPIO_WritePin(GPIOF,DIR_Pin, GPIO_PIN_RESET);}for(i=0;i<Step;i++){//發送脈沖HAL_GPIO_WritePin(GPIOG,STEP_Pin, GPIO_PIN_RESET);//if(j>1)	j--;//else;		DelayNop(j);HAL_GPIO_WritePin(GPIOG,STEP_Pin, GPIO_PIN_SET);DelayNop(j);}HAL_Delay(10);//電機非使能HAL_GPIO_WritePin(GPIOF,EN_Pin, GPIO_PIN_SET);
}
/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 */
/*** @brief USART2 Initialization Function* @param None* @retval None*/
//void MX_USART2_UART_Init(void)
//{//  /* USER CODE BEGIN USART2_Init 0 *///  /* USER CODE END USART2_Init 0 *///  /* USER CODE BEGIN USART2_Init 1 *///  /* USER CODE END USART2_Init 1 */
//  huart2a.Instance = USART2;
//  huart2a.Init.BaudRate = 115200;
//  huart2a.Init.WordLength = UART_WORDLENGTH_8B;
//  huart2a.Init.StopBits = UART_STOPBITS_1;
//  huart2a.Init.Parity = UART_PARITY_NONE;
//  huart2a.Init.Mode = UART_MODE_TX_RX;
//  huart2a.Init.HwFlowCtl = UART_HWCONTROL_NONE;
//  huart2a.Init.OverSampling = UART_OVERSAMPLING_16;
//  if (HAL_UART_Init(&huart2a) != HAL_OK)
//  {
//    Error_Handler();
//  }/* USER CODE BEGIN USART2_Init 2 *//* USER CODE END USART2_Init 2 *///}/*** @brief  This function is executed in case of error occurrence.* @retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */
}#ifdef  USE_FULL_ASSERT
/*** @brief  Reports the name of the source file and the source line number*         where the assert_param error has occurred.* @param  file: pointer to the source file name* @param  line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
  • 這邊的代碼是選擇64細分,正轉10圈-等待2S-反轉10圈-等待2S。
    在這里插入圖片描述
  • 編譯代碼燒錄到單板
    仿真器配置參考link中13節。
    在這里插入圖片描述
  • 這樣,就可以控制電機正反轉啦。
    ps: 正點原子STM32戰艦版V3的板子每次燒錄需要摁紅色reset按鈕,燒錄才能生效。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/45616.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/45616.shtml
英文地址,請注明出處:http://en.pswp.cn/web/45616.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

單相電機或風扇接電容的具體接線方法示例

單相電機或風扇接電容的具體接線方法示例 如下圖所示&#xff0c;單相電機引出3根繞組線&#xff08;不同品牌或型號的電機&#xff0c;引出線的顏色可能會有差異&#xff09;&#xff0c; 那么如何進行接線呢&#xff1f; 首先&#xff0c;跳過萬用表測量主、副繞組的阻值…

Unable to obtain driver using Selenium Manager: Selenium Manager failed解決方案

大家好,我是愛編程的喵喵。雙985碩士畢業,現擔任全棧工程師一職,熱衷于將數據思維應用到工作與生活中。從事機器學習以及相關的前后端開發工作。曾在阿里云、科大訊飛、CCF等比賽獲得多次Top名次。現為CSDN博客專家、人工智能領域優質創作者。喜歡通過博客創作的方式對所學的…

聊聊自動駕駛中的路徑和軌跡

在移動機器人領域&#xff0c;路徑&#xff08;Path&#xff09;和軌跡&#xff08;Trajectory&#xff09;是兩個緊密相關但又有所區別的概念。 路徑 是機器人從起點到終點的一系列點的序列&#xff0c;它只考慮了位置信息&#xff0c;而不考慮時間信息。路徑描述了機器人將要…

Java中常見的語法糖

文章目錄 概覽泛型增強for循環自動裝箱與拆箱字符串拼接枚舉類型可變參數內部類try-with-resourcesLambda表達式 概覽 語法糖是指編程語言中的一種語法結構&#xff0c;它們并不提供新的功能&#xff0c;而是為了讓代碼更易讀、更易寫而設計的。語法糖使得某些常見的編程模式或…

【Linux】Ubuntu 漏洞掃描與修復的吃癟經歷

自從上次“劫持”事情后&#xff0c;項目經理將所有跟安全相關的都推給我了&#xff08;不算 KPI 又要被白嫖&#xff0c;煩死了&#xff09;。這次客戶又提了一個服務器安全掃描和漏洞修復的“活”&#xff0c;我這邊順手將過程記錄一下&#xff0c;就當經驗總結跟各位分享一下…

centos7安裝配置maven

一、配置安裝環境 #安裝wget yum install -y wget #安裝jdk17 #創建jdk存放目錄 mkdir -p /usr/local/java #切換目錄 cd /usr/local/java #下載jdk17 wget https://download.java.net/java/GA/jdk17.0.1/2a2082e5a09d4267845be086888add4f/12/GPL/openjdk-17.0.1_linux-x64_b…

【Linux】多線程_7

文章目錄 九、多線程8. POSIX信號量根據信號量環形隊列的生產者消費者模型代碼結果演示 未完待續 九、多線程 8. POSIX信號量 POSIX信號量和SystemV信號量作用相同&#xff0c;都是用于同步操作&#xff0c;達到無沖突的訪問共享資源目的。 但POSIX可以用于線程間同步。 創建…

什么ISP?什么是IAP?

做單片機開發的工程師經常會聽到兩個詞&#xff1a;ISP和IAP&#xff0c;但新手往往對這兩個概念不是很清楚&#xff0c;今天就來和大家聊聊什么是ISP&#xff0c;什么是IAP&#xff1f; 一、ISP ISP的全稱是&#xff1a;In System Programming&#xff0c;即在系統編程&…

如何申請抖音本地生活服務商?3種方式優劣勢分析!

隨著多家互聯網大廠在本地生活板塊的布局力度不斷加大&#xff0c;以抖音為代表的頭部互聯網平臺的本地生活服務商成為了創業賽道中的大熱門&#xff0c;與抖音本地生活服務商怎么申請等相關的帖子&#xff0c;更是多次登頂創業者社群的話題榜單。 就目前的市場情況來看&#x…

Go語言--廣播式并發聊天服務器

實現功能 每個客戶端上線&#xff0c;服務端可以向其他客戶端廣播上線信息&#xff1b;發送的消息可以廣播給其他在線的客戶支持改名支持客戶端主動退出支持通過who查找當前在線的用戶超時退出 流程 變量 用戶結構體 保存用戶的管道&#xff0c;用戶名以及網絡地址信息 typ…

ARM功耗管理之功耗數據與功耗收益評估

安全之安全(security)博客目錄導讀 思考&#xff1a;功耗數據如何測試&#xff1f;功耗曲線&#xff1f;功耗收益評估&#xff1f; UPF的全稱是Unified Power Format&#xff0c;其作用是把功耗設計意圖&#xff08;power intent&#xff09;傳遞給EDA工具&#xff0c; 從而幫…

vscode OpenCV環境搭建

cmake 官網https://cmake.org/files/ 環境變量D:\Program Files\CMake\bin w64devkit 官網https://github.com/skeeto/w64devkit/tags 環境變量D:\Program Files\w64devkit\bin minGW32-make 拷貝并重命名為make OpenCV 在執行完后&#xff0c;把關于python的都給取消勾選…

mybatis-plus映射mysql的json類型的字段

一、對json里面內容建立實體類 Data AllArgsConstructor NoArgsConstructor public class RouteMetaEntity {private String title;private Boolean affix;private Boolean isAlwaysShow; }二、主類做映射 TableField(typeHandler JacksonTypeHandler.class)private RouteMe…

Codeforces Round 958 (Div. 2)補題

文章目錄 A題 (拆分多集)B題(獲得多數票)C題&#xff08;固定 OR 的遞增序列&#xff09; A題 (拆分多集) 本題在賽時卡的時間比較久&#xff0c;把這題想復雜了&#xff0c;導致WA了兩次。后來看明白之后就是將n每次轉換成k-1個1&#xff0c;到最后分不出來k-1個1直接一次就能…

Hive的基本操作(查詢)

1、基礎查詢 基本語法 select 字段列表|表達式|子查詢 from 表(子查詢|視圖|臨時表|普通表) where [not] 條件A and|or 條件B --先&#xff1a;面向原始行進行篩選 group by 字段A[,字段B,...] > 分組【去重處理】 having 聚合條件(非原始字段條件) --再&#x…

JMeter案例分享:通過數據驗證的錯誤,說說CSV數據文件設置中的線程共享模式

前言 用過JMeter參數化的小伙伴&#xff0c;想必對CSV Data Set Config非常熟悉。大家平時更關注變量名稱&#xff0c;是否忽略首行等參數&#xff0c;其余的一般都使用默認值。然而我最近遇到一個未按照我的預想讀取數據的案例&#xff0c;原因就出在最后一個參數“線程共享模…

深度學習中激活函數的演變與應用:一個綜述

摘要 本文全面回顧了深度學習中激活函數的發展歷程,從早期的Sigmoid和Tanh函數,到廣泛應用的ReLU系列,再到近期提出的Swish、Mish和GeLU等新型激活函數。深入分析了各類激活函數的數學表達、特點優勢、局限性以及在典型模型中的應用情況。通過系統的對比分析,本文探討了激…

樹莓派配置vsftpd主動模式

sudo apt-get install vsftpd /etc/vsftpd.conf anonymous_enableNO # 禁用匿名用戶 local_enableYES # 允許本地用戶登錄 write_enableYES # 允許修改權限 #chroot_local_userYES # 將用戶限制在其主目錄 systemctl restart vsftpd sudo adduser ftpuser sudo pa…

詳解MySQL中的遞歸查詢

MySQL中的遞歸查詢主要通過WITH RECURSIVE語句來實現&#xff0c;這在處理具有層級關系或樹形結構的數據時非常有用。下面將通過一個具體的例子來詳細解釋如何在MySQL中使用遞歸查詢。 示例場景 假設我們有一個部門表&#xff08;departments&#xff09;&#xff0c;其中包含…

昇思訓練營打卡第二十五天(RNN實現情感分類)

RNN&#xff0c;即循環神經網絡&#xff08;Recurrent Neural Network&#xff09;&#xff0c;是一種深度學習模型&#xff0c;特別適用于處理序列數據。以下是對RNN的簡要介紹&#xff1a; RNN的特點&#xff1a; 記憶性&#xff1a;與傳統的前饋神經網絡不同&#xff0c;R…