【RA-Eco-RA4E2-64PIN-V1.0 开发板】步进电机驱动
本文介绍了 RA-Eco-RA4E2-64PIN-V1.0 开发板驱动 28BYJ-48 步进电机的设计。
项目介绍
- 硬件连接:28BYJ-48 步进电机、ULN2003 驱动板、Jlink 调试器等;
- 工程创建:GPIO 和 UART 的配置;
- 工程代码:包括主函数、步进电机驱动代码等;
- 测试效果:包括 步进电机旋转、串口打印状态信息等。
硬件连接
接线方式如下
ULN2003 驱动板 | RA4E2 | 说明 |
---|---|---|
IN1 | P100 | 步进脉冲 A |
IN2 | P101 | 步进脉冲 B |
IN3 | P104 | 步进脉冲 C |
IN4 | P112 | 步进脉冲 D |
VCC | 5V | 驱动板电源 |
GND | GND | 共地 |
实物图
工程创建
- 打开 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 系列产品在工业自动化、科研仪器控制等相关领域的开发设计和应用提供了参考。