【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 系列產品在工業自動化、科研儀器控制等相關領域的開發設計和應用提供了參考。