当前位置: 首页 > news >正文

【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.dtcms.com/a/345142.html

相关文章:

  • 育教大师广州专插本培训机构指南
  • STM32项目分享:基于STM32的焊接工位智能排烟系统
  • 视频编码异常的表现
  • 【Linux系列】Linux 中替换文件中的字符串
  • 基于SpringBoot的考研学习交流平台【2026最新】
  • Nginx 创建和配置虚拟主机
  • 掌握设计模式--命令模式
  • 全面解析 `strchr` 字符串查找函数
  • Java面试宝典:Redis底层原理(持久化+分布式锁)
  • 智慧农业新基建:边缘计算网关在精准农业中的落地实践案例
  • C#_高性能内存处理:Span<T>, Memory<T>, ArrayPool
  • const(常量)
  • Android.bp 基础
  • 安全帽检测算法如何提升工地安全管理效率
  • AI 向量库:从文本到数据的奇妙之旅​
  • 编排之神--Kubernetes中包管理Helm工具详解
  • Jmeter压测实操指南
  • 金融量化入门:Pandas 时间序列处理与技术指标实战(含金叉死叉 / 均线策略)
  • GaussDB SQL引擎(1)-SQL执行流程
  • 从创新到落地:技术驱动下的企业管理变革新趋势
  • python-对图片中的人体换背景色
  • 小杰机械视觉(three day)——图象旋转、镜像、缩放、矫正
  • Android UI界面绘制
  • AI赋能体育训练突破:AI动作捕捉矫正精准、战术分析系统提效率,运动员破瓶颈新路径
  • AI计算提效关键。自适应弹性加速,基于存算架构做浮点运算
  • 自学嵌入式第二十五天:数据结构-队列、树
  • JavaWeb前端05(Vue工程化,Vue组件两种风格:组合式API 和 选项式API)及简单案例)
  • 文件下载和文件上传漏洞
  • FTP/TCP上传下载文件
  • C++ 判断: 深度解析与实战指南