【RA-Eco-RA4E2-64PIN-V1.0 開發板】步進電機驅動

【RA-Eco-RA4E2-64PIN-V1.0 開發板】步進電機驅動

本文介紹了 RA-Eco-RA4E2-64PIN-V1.0 開發板驅動 28BYJ-48 步進電機的設計。

項目介紹

  • 硬件連接:28BYJ-48 步進電機、ULN2003 驅動板、Jlink 調試器等;
  • 工程創建:GPIO 和 UART 的配置;
  • 工程代碼:包括主函數、步進電機驅動代碼等;
  • 測試效果:包括 步進電機旋轉、串口打印狀態信息等。

硬件連接

接線方式如下

ULN2003 驅動板RA4E2說明
IN1P100步進脈沖 A
IN2P101步進脈沖 B
IN3P104步進脈沖 C
IN4P112步進脈沖 D
VCC5V驅動板電源
GNDGND共地

實物圖

在這里插入圖片描述

工程創建

  • 打開 e2 studio 軟件;
  • 依次點擊 文件 - 新建 - 瑞薩 C/C++ 項目 - Renesas RA
  • 依次進行工程命名,路徑設置,FSP版本,目標開發板選擇,Device 選擇 R7FA4E2B93CFM ,工具鏈選擇 GNU ARM Embedded ,調試器選擇 J-Link ,完成工程創建 ;

串口配置

  • 進入 FSP 配置界面,打開 Pins 標簽頁,根據原理圖或開發板絲印,將 P109 和 P110 引腳分別配置為 TXD9 和 RXD9 串口模式;
  • 新建串口通信堆棧 New Stack - Connectivity - UART (r_sci_uart)
  • 串口屬性配置,General 標簽下的 Channel 改為 9,名稱改為 g_uart9,中斷回調函數命名為 user_uart_callback
  • 進入 BSP 標簽頁,配置 RA Common 屬性,RA Common 標簽下的 Heap size 改為 0x2000

GPIO 配置

  • 進入 FSP 配置界面,打開 Pins 標簽頁,選中 P100 引腳,模式配置為初始低電平的輸出模式;

  • 同理,將 P101、P104 和 P112 管腳也配置為初始低電平的輸出模式;

  • 點擊 Generate Project Content 按鈕,生成工程代碼。

流程圖

在這里插入圖片描述

工程代碼

在左側的項目目錄中,打開 src/hal_entry.c 文件,添加如下關鍵代碼

hal_entry.c
#include "hal_data.h"
#include "stepper_motor.h"
#include <stdio.h>FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTERfsp_err_t err = FSP_SUCCESS;
volatile bool uart_send_complete_flag = false;
void user_uart_callback (uart_callback_args_t * p_args)
{if(p_args->event == UART_EVENT_TX_COMPLETE){uart_send_complete_flag = true;}
}/*------------- 串口重定向 -------------*/
#ifdef __GNUC__#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else#endifPUTCHAR_PROTOTYPE
{err = R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)&ch, 1);if(FSP_SUCCESS != err) __BKPT();while(uart_send_complete_flag == false){}uart_send_complete_flag = false;return ch;
}int _write(int fd,char *pBuffer,int size)
{for(int i=0;i<size;i++){__io_putchar(*pBuffer++);}return size;
}void hal_entry(void)
{/* TODO: add your own code here */err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);assert(FSP_SUCCESS == err);printf("RA4E2 Stepper Motor Demo Started\r\n");// 初始化步進電機stepper_motor_init();stepper_motor_test_sequence();stepper_motor_stop(); // 釋放扭矩#if BSP_TZ_SECURE_BUILD/* Enter non-secure code */R_BSP_NonSecureEnter();
#endif
}
stepper_motor.h

新建 stepper_motor.h 頭文件,添加如下代碼

#ifndef STEPPER_MOTOR_H_
#define STEPPER_MOTOR_H_#include "hal_data.h"
#include <stdbool.h>// 引腳定義
#define MOTOR_PIN_IN1 BSP_IO_PORT_01_PIN_00  // IN1
#define MOTOR_PIN_IN2 BSP_IO_PORT_01_PIN_01  // IN2
#define MOTOR_PIN_IN3 BSP_IO_PORT_01_PIN_04  // IN3
#define MOTOR_PIN_IN4 BSP_IO_PORT_01_PIN_12  // IN4// 每轉步數
#define STEPS_PER_REVOLUTION 509// 函數聲明
void stepper_motor_init(void);
void stepper_motor_rotate_steps(int32_t steps, uint32_t step_delay_ms);
void stepper_motor_rotate_degrees(float degrees, uint32_t step_delay_ms);
void stepper_motor_stop(void);
void stepper_motor_test_sequence(void);#endif /* STEPPER_MOTOR_H_ */
stepper_motor.c

新建 stepper_motor.c 源文件,添加如下代碼

#include "stepper_motor.h"
#include <stdio.h>
#include <stdlib.h>// 四相八拍序列,序列格式: [IN1, IN2, IN3, IN4]
const uint8_t STEP_SEQ[8][4] = {{1, 0, 0, 1},  // AB' (A和D){1, 0, 0, 0},  // A{1, 1, 0, 0},  // AB{0, 1, 0, 0},  // B{0, 1, 1, 0},  // BC{0, 0, 1, 0},  // C{0, 0, 1, 1},  // CD{0, 0, 0, 1}   // D
};// 每轉步數
#define STEPS_PER_REVOLUTION 509void stepper_motor_init(void) {// 初始化所有引腳為低電平R_IOPORT_PinWrite(&g_ioport_ctrl, MOTOR_PIN_IN1, BSP_IO_LEVEL_LOW);R_IOPORT_PinWrite(&g_ioport_ctrl, MOTOR_PIN_IN2, BSP_IO_LEVEL_LOW);R_IOPORT_PinWrite(&g_ioport_ctrl, MOTOR_PIN_IN3, BSP_IO_LEVEL_LOW);R_IOPORT_PinWrite(&g_ioport_ctrl, MOTOR_PIN_IN4, BSP_IO_LEVEL_LOW);printf("Stepper motor initialized.\r\n");
}// 設置電機引腳狀態
static void set_coil_state(uint8_t in1, uint8_t in2, uint8_t in3, uint8_t in4) {R_IOPORT_PinWrite(&g_ioport_ctrl, MOTOR_PIN_IN1, in1 ? BSP_IO_LEVEL_HIGH : BSP_IO_LEVEL_LOW);R_IOPORT_PinWrite(&g_ioport_ctrl, MOTOR_PIN_IN2, in2 ? BSP_IO_LEVEL_HIGH : BSP_IO_LEVEL_LOW);R_IOPORT_PinWrite(&g_ioport_ctrl, MOTOR_PIN_IN3, in3 ? BSP_IO_LEVEL_HIGH : BSP_IO_LEVEL_LOW);R_IOPORT_PinWrite(&g_ioport_ctrl, MOTOR_PIN_IN4, in4 ? BSP_IO_LEVEL_HIGH : BSP_IO_LEVEL_LOW);
}// 驅動電機旋轉指定步數
void stepper_motor_rotate_steps(int32_t steps, uint32_t step_delay_ms) {int8_t direction = (steps >= 0) ? 1 : -1;uint32_t absolute_steps = (uint32_t)abs(steps);printf("Rotating %s, steps: %lu, delay: %lu ms\r\n",(direction > 0) ? "CW" : "CCW", absolute_steps, step_delay_ms);for (uint32_t i = 0; i < absolute_steps; i++) {if (direction > 0) {// 順時針:正向遍歷序列for (int phase = 0; phase < 8; phase++) {set_coil_state(STEP_SEQ[phase][0], STEP_SEQ[phase][1],STEP_SEQ[phase][2], STEP_SEQ[phase][3]);R_BSP_SoftwareDelay(step_delay_ms, BSP_DELAY_UNITS_MILLISECONDS);}} else {// 逆時針:反向遍歷序列for (int phase = 7; phase >= 0; phase--) {set_coil_state(STEP_SEQ[phase][0], STEP_SEQ[phase][1],STEP_SEQ[phase][2], STEP_SEQ[phase][3]);R_BSP_SoftwareDelay(step_delay_ms, BSP_DELAY_UNITS_MILLISECONDS);}}// 每10步輸出調試信息(會出現卡頓)if (i % 10 == 0) {//printf("Completed %lu/%lu steps\r\n", i, absolute_steps);}}printf("Rotation completed.\r\n");
}// 旋轉指定角度
void stepper_motor_rotate_degrees(float degrees, uint32_t step_delay_ms) {int32_t steps = (int32_t)(degrees * (STEPS_PER_REVOLUTION / 360.0f));printf("Rotating %.1f degrees -> %ld steps\r\n", degrees, steps);if (steps != 0) {stepper_motor_rotate_steps(steps, step_delay_ms);}
}// 釋放電機扭矩(所有引腳置低)
void stepper_motor_stop(void) {set_coil_state(0, 0, 0, 0);printf("Motor torque released.\r\n");
}// 測試函數
void stepper_motor_test_sequence(void) {printf("=== Starting Test Sequence ===\r\n");while (1) {printf("Rotating 180 degrees CCW...\r\n");stepper_motor_rotate_degrees(180.0f, 1); // 2ms延時stepper_motor_stop();R_BSP_SoftwareDelay(2000, BSP_DELAY_UNITS_MILLISECONDS);printf("Rotating 90 degrees CW...\r\n");stepper_motor_rotate_degrees(-180.0f, 1); // 2ms延時stepper_motor_stop();R_BSP_SoftwareDelay(2000, BSP_DELAY_UNITS_MILLISECONDS);}
}
  • 保存代碼,右鍵項目 - 構建程序;

  • 右鍵項目 - 調試項目 - 上傳固件至開發板。

測試效果

  • 28 BYJ-48 步進電機、ULN2003 驅動板、RA4E2 開發板接線硬件連接完成;
  • TypeC - USB 數據線連接開發板串口和電腦;
  • 打開串口調試助手,配置對應的波特率等參數;
  • 打開串口,即可接收芯片發送的字符串;

在這里插入圖片描述

同時串口打印輸出步進電機狀態

在這里插入圖片描述

總結

本文介紹了 RA-Eco-RA4E2-64PIN-V1.0 開發板驅動 28BYJ-48 步進電機的設計,包括硬件連接、工程創建、工程代碼、測試效果等流程,為 Renesas RA 系列產品在工業自動化、科研儀器控制等相關領域的開發設計和應用提供了參考。

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

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

相關文章

機器人爆發、汽車換代,速騰聚創開始講新故事

文&#xff5c;劉俊宏編&#xff5c;王一粟2025年智能汽車出貨量激增&#xff0c;堪稱“智駕安全帶”的激光雷達&#xff0c;迎來了自己的iPhone時刻。8月21日&#xff0c;速騰聚創發布了2025年第二季度及中期業績報告&#xff0c;激光雷達的中場戰事得以一并揭開。速騰聚創二季…

在Excel和WPS表格中如何隱藏單元格的公式

Excel和WPS表格中有數據、公式、圖表等以后&#xff0c;要發給他人查閱&#xff0c;如果不希望表格中的公式被查閱和修改&#xff0c;我們可以通過兩個步驟把公式隱藏起來。先設置有公式的單元格格式為隱藏&#xff0c;然后保護工作表即可。第一步&#xff1a;設置單元格格式為…

Eino 開源框架全景解析 - 以“大模型應用的搭積木指南”方式理解(一)

Eino 開源框架全景解析 - 大模型應用的搭積木指南 &#x1f3af; 什么是 Eino&#xff1f;一句話概括 Eino 是字節跳動開源的大語言模型應用開發框架&#xff0c;就像是一個專門為 AI 應用設計的"搭積木工具箱"&#xff0c;讓開發者能夠像搭樂高一樣輕松構建復雜的 A…

大語言模型原理(Transformer架構)

一、概覽1.1 定義大語言模型&#xff08;LLM&#xff09;是基于深度學習和神經網絡的自然語言處理技術&#xff0c;目前主要通過Transformer架構和大規模數據訓練來理解和生成語言。GPT不同架構的訓練參數&#xff1a;GPT-1(2018)&#xff1a;1.17億參數GPT-2(2018)&#xff1a…

Nginx npm + Node.js 簡單實踐

一、基本概念介紹 Nginx 是一款高性能的 Web 服務器和反向代理服務器&#xff0c;而 Node.js 是一個基于 Chrome V8 引擎的 JavaScript 運行環境&#xff0c;可以讓JavaScript 在服務器端運行。npm 則是 Node.js 的默認包管理工具&#xff0c;類似手機的應用市場。主要功能事故…

Python 中 SQLAlchemy 和 MySQLdb 的關系

目錄1. 角色和定位2. 工作原理和交互方式使用純 MySQLdb使用 SQLAlchemy&#xff08;核心或 ORM&#xff09;3. 依賴關系總結與選擇 簡單來說&#xff0c;它們的關系是&#xff1a;SQLAlchemy 是一個高層抽象的對象關系映射器&#xff08;ORM&#xff09;和 SQL 工具包&#xf…

【CV】OpenCV①——圖形處理簡介

一、OpenCV簡介 1. 圖像處理 1.1. 圖像起源 1.1.1. 圖像是什么1.1.2. 模擬圖像和數字圖像1.2. 數字圖像的表示 1.2.1. 位數1.2.2. 圖像分類 二值圖像灰度圖彩色圖

JAVA后端開發——API狀態字段設計規范與實踐

1. 引言在現代Web應用與API設計中&#xff0c;狀態&#xff08;Status&#xff09;字段的管理是一個普遍存在且至關重要的議題。狀態字段&#xff0c;如訂單狀態、任務執行狀態、模型運行狀態等&#xff0c;直接關系到系統的核心業務邏輯。不恰當的設計會導致API可讀性差、系統…

【MySQL的卸載】

MySQL的卸載卸載MySQL步驟1&#xff1a;停止MySQL服務步驟2&#xff1a;軟件的卸載卸載方式一&#xff1a;通過控制面板卸載軟件卸載方式二&#xff1a;通過360或電腦管家等軟件卸載卸載方式三&#xff1a;通過安裝包提供的卸載功能卸載步驟3&#xff1a;殘余文件的清理步驟4&a…

高效實時數據同步方案:秒級響應多字段搜索

目錄 1、其他 2、業務背景和目標 2.1 業務目標 2.2 核心痛點 3、技術選型 3.1 實時工具同步選型 3.2 OLAP數據庫選型 3.3 候選技術路線對比 3.4 技術難點 3.5 技術選型推薦 3.5.1、推薦的技術路線 3.5.2 架構示意圖 4 、可行性驗證方案?? ??4.1 測試用例設計? …

面試問題詳解七:Qt 信號與槽 + QML 的結合詳解

在現代 Qt 開發中&#xff0c;QML&#xff08;Qt Quick&#xff09;負責 UI 層&#xff0c;C 負責邏輯層或后端服務層 是一種非常流行的架構方式。 這一模式下&#xff0c;信號與槽機制在 QML 與 C 間的前后端通信中扮演橋梁角色&#xff0c;是實現數據驅動界面更新、事件響應、…

孔夫子舊書網 API 實戰:古籍與二手書數據獲取及接口調用方案

孔夫子舊書網作為國內知名的古籍、二手書交易平臺&#xff0c;其商品數據對于圖書收藏、學術研究及二手書電商系統具有重要價值。本文將詳細介紹孔夫子平臺接口的調用方法&#xff0c;涵蓋認證機制、搜索參數配置、數據解析及反爬策略&#xff0c;并提供可直接使用的 Python 代…

文件包含的學習筆記

面試問題 1&#xff0c;任意文件讀取&#xff0c;到底讀什么文件&#xff0c;有什么危害 權限是www 只能讀第一個&#xff0c;讀這個沒用&#xff0c;密碼在/etc/shadow中 其它沒有權限 my.cnf mysql密碼看不了 但是可以看見日志文件的目錄 sql注入時&#xff0c;你有注…

Linux 軟件包安裝和管理的相關操作及使用總結(未完成)

一、基礎知識1、軟件包分類源碼包&#xff08;Source Package&#xff09;&#xff1a;包含軟件的源代碼文件、編譯指令和配置文件。需要用戶自行編譯安裝&#xff0c;過程相對復雜&#xff0c;但靈活性高&#xff0c;可以定制安裝選項。文件格式通常為.tar.gz、.tar.bz2等壓縮…

【開發指南】飛凌i.MX9352核心板開發過程中的常見問題及排查思路

飛凌嵌入式作為NXP金牌合作伙伴&#xff0c;已基于i.MX系列應用處理器推出了多款嵌入式主控產品&#xff0c;除了最新發布的i.MX95xx系列核心板外&#xff0c;同為i.MX9系的i.MX93xx系列核心板也已上市多年并獲得了眾多客戶的認可和選擇。在長期的技術支持服務過程中&#xff0…

Windows應急響應一般思路(二)

進程排查 進程(Process)是計算機中的程序關于某數據集合上的一次運行活動&#xff0c;是系統進行資源分配和調度的基本單位&#xff0c;是操作系統結構的基礎 無論是在Windows系統還是Linux系統中&#xff0c;主機在感染惡意程序后&#xff0c;惡意程序都會啟動相應的進程&am…

FFmpeg03:多媒體文件處理基礎

日志系統 #include <libavutil/log.h>av_log_set_level(AV_LOG_DEBUG)av_log(NULL, AV_LOG_INFO, “…%s\n”, op) 常用日志級別 AV_LOG_ERROR AV_LOG_WARNING AV_LOG_INFO Demo log.cpp #include <iostream> extern "C" { #include <libavutil/log.h…

【每天一個知識點】AIOps 與自動化管理

一、AIOps 的內涵AIOps&#xff08;Artificial Intelligence for IT Operations&#xff09;&#xff1a;指將人工智能、大數據分析和機器學習技術應用于 IT 運維管理中。主要目標是&#xff1a;利用智能算法對云平臺、網絡、應用和日志等海量運維數據進行實時分析&#xff0c;…

ios使用saveVideoToPhotosAlbum 保存視頻失敗提示 invalid video

ios使用saveVideoToPhotosAlbum 保存視頻失敗提示 invalid video 解決辦法 iOS 上對保存到相冊的視頻存在某種格式和分辨率上的限制&#xff0c;建議先自查看下視頻生成的參數&#xff0c;可以先試試蘋果自帶瀏覽器 safari 上能否播放該視頻。 如果不能播放&#xff0c;證明 io…

Vue基礎(③父子組件)

房子&#xff08;父組件&#xff09;包含窗戶和門&#xff08;子組件&#xff09; 窗戶和門&#xff08;子組件&#xff09;是房子&#xff08;父組件&#xff09;的一部分父組件<!-- 父組件&#xff1a;比如叫 Home.vue --> <template><div><h1>這是父…