【瑞萨RA2L1入门学习】步进电机驱动
本文介绍了瑞萨 RA-Eco-RA2L1-48PIN-V2.0 开发板通过 GPIO 和 ULN2003 驱动步进电机旋转的项目设计,包括硬件连接、工程创建及配置、工程代码、编译上传、效果演示等流程。
项目介绍
- 硬件连接:28BYJ-48 步进电机、ULN2003 驱动板、J-LINK OB 调试器等;
- 工程创建:GPIO 配置、流程图等;
- 工程代码:主函数代码、步进电机驱动代码等;
- 效果演示:步进电机顺时针和逆时针旋转。
硬件连接
使用 J-LINK OB 连接开发板和电脑;
步进电机、驱动板、开发板的接线方式如下
| RA2L1 |
ULN2003驱动板 |
28BYJ-48 步进电机 |
|---|
| P201 |
IN1 |
红 (A+) |
| P206 |
IN2 |
蓝 (A-) |
| P301 |
IN3 |
粉 (B+) |
| P302 |
IN4 |
黄 (B-) |
| 5V |
VCC |
电机电源正极 |
| GND |
GND |
电机电源负极 |
注意,若步进电机额定电压较高或带负载运行,需使用外部电源连接 ULN2003 驱动板供电。
实物图

工程创建
- 打开 e^2^ studio 软件;
- 依次点击
文件 - 新建 - 瑞萨 C/C++ 项目 - Renesas RA ;
- 依次进行工程命名,路径设置,FSP版本,目标开发板选择,Device 选择
R7FA4E2B93CFM ,工具链选择 GNU ARM Embedded ,调试器选择 J-Link ,完成工程创建 ;
GPIO 配置
-
进入 FSP 配置界面,打开 Pins 标签页,选中 P201 引脚,模式配置为初始低电平的输出模式;
-
同理,将 P206、P301 和 P302 管脚也配置为初始低电平的输出模式;
-
点击 Generate Project Content 按钮,生成工程代码。

流程图

工程代码
包括主函数程序和驱动程序。
主函数
在左侧的项目目录中,打开 src/hal_entry.c 文件,添加如下关键代码
#include "hal_data.h"
#include "stepmotor.h"
void hal_entry(void)
{
step_motor_init();
step_motor_test_sequence();
step_motor_stop();
}
保存代码。
驱动代码
包括步进电机驱动头文件和源文件程序。
stepmotor.h
新建 stepper_motor.h 头文件 ,添加如下代码
#ifndef STEPMOTOR_H_
#define STEPMOTOR_H_
#include "hal_data.h"
#include <stdbool.h>
#define MOTOR_PIN_IN1 BSP_IO_PORT_02_PIN_01
#define MOTOR_PIN_IN2 BSP_IO_PORT_02_PIN_06
#define MOTOR_PIN_IN3 BSP_IO_PORT_03_PIN_01
#define MOTOR_PIN_IN4 BSP_IO_PORT_03_PIN_02
#define STEPS_PER_REVOLUTION 509
void step_motor_init(void);
void step_motor_rotate_steps(int32_t steps, uint32_t step_delay_ms);
void step_motor_rotate_degrees(float degrees, uint32_t step_delay_ms);
void step_motor_stop(void);
void step_motor_test_sequence(void);
#endif
保存代码。
stepmotor.c
新建 stepper_motor.c 源文件,添加如下代码
#include "stepmotor.h"
#include <stdio.h>
#include <stdlib.h>
const uint8_t STEP_SEQ[8][4] = {
{1, 0, 0, 1},
{1, 0, 0, 0},
{1, 1, 0, 0},
{0, 1, 0, 0},
{0, 1, 1, 0},
{0, 0, 1, 0},
{0, 0, 1, 1},
{0, 0, 0, 1}
};
#define STEPS_PER_REVOLUTION 509
void step_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 step_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);
}
}
}
}
void step_motor_rotate_degrees(float degrees, uint32_t step_delay_ms) {
int32_t steps = (int32_t)(degrees * (STEPS_PER_REVOLUTION / 360.0f));
if (steps != 0) {
step_motor_rotate_steps(steps, step_delay_ms);
}
}
void step_motor_stop(void) {
set_coil_state(0, 0, 0, 0);
}
void step_motor_test_sequence(void) {
while (1) {
step_motor_rotate_degrees(180.0f, 1);
step_motor_stop();
R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS);
step_motor_rotate_degrees(-90.0f, 1);
step_motor_stop();
R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS);
}
}
保存代码。
工程编译
- 右键工程文件夹,点击构建项目;
- 或点击工具栏小锤子按钮;
固件上传
- 右键工程文件夹 - 调试/运行项目 - 上传固件至开发板;
- 或点击工具栏小虫子按钮,进入 Debug 模式并运行。
效果演示
检查步进电机、ULN2003 驱动板、电源、RA2L1 开发板、J-LINK 硬件连接完成;

动态效果见底部视频。
总结
本文介绍了 RA-Eco-RA2L1-48PIN-V2.0 开发板驱动 28BYJ-48 步进电机的项目设计,包括硬件连接、工程创建、工程代码、测试效果等流程,为 Renesas RA 系列产品在工业自动化控制等相关领域的开发设计和快速应用提供了参考。