【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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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>这是父…