eefocus_4062187 发表于 2026-5-30 19:55:08

【EK-RA4C1开发套件】步进电机驱动

# 【EK-RA4C1开发套件】步进电机驱动

本文介绍了 EK-RA4C1 开发套件结合 TMC2209 模块和 LCD 显示屏,实现 42 步进电机驱动和旋转角度显示的项目设计,包括环境搭建、工程创建、相关代码、流程图、效果演示等。

## 项目介绍

EK-RA4C1 开发套件结合 TMC2209 驱动板实现 42 步进电机驱动、LCD 显示旋转角度。

- 准备工作:步进电机参数、环境搭建、硬件连接等;
- 串口打印:工程配置、工程代码、工程调试等;
- 步进电机驱动:流程图、工程代码、效果演示等。

## 丝杆步进电机

采用 NIDEC 尼得科 8mm 步进电机。

### 参数

| 参数   | 数值             |
| :------- | :--------------- |
| 类型   | 2 相 4 线      |
| 步距角   | 18°            |
| 额定电压 | 3 - 5V         |
| 额定电流 | 0.12A/相         |
| 电阻   | 35 - 45Ω/相      |
| 电感   | 30mH/相          |
| 保持扭矩 | 0.15 - 0.2 mN·cm |
| 机身   | Φ8mm, H8.5mm   |

### 引脚定义

!(//m.qjumbo.com/forum/data/attachment/forum/202605/30/182922euyiiudtiz14v4dy.jpg)



## 硬件连接

使用 Type-C 数据线连接开发板和电脑;

TMC 2209 驱动板、EK-RA4C1 开发板的接线方式如下

| RA4C1 | TMC2209 | Note            |
| :---- | :------ | :---------------- |
| P510| Dir   | Direction         |
| P509| STEP    | Steps             |
| P511| EN      | Enable            |
| 5V    | VM      | Power for stepper |
| 3.3V| VCC   | Power for MCU   |
| GND   | GND   | Ground            |

> 注意,若步进电机额定电压较高或带负载运行,需使用外部电源连接 TMC2209 驱动板 VM 引脚供电。

由原理图可知, P509、P510、P511 分别对应 Arduino UNO 接口的 D10、D7、D8 引脚。

!(//m.qjumbo.com/forum/data/attachment/forum/202605/30/182949kkkwbn8r5mzr433n.jpg)



TMC2209 与 42 步进电机的接线方式如下

| 42步进电机 | TMC2209 | Note    |
| ---------- | ------- | ------- |
| A+         | 1A      | A phase |
| A-         | 1B      | A phase |
| B+         | 2A      | B phase |
| B-         | 2B      | B phase |

### 实物图

!(//m.qjumbo.com/forum/data/attachment/forum/202605/30/195024tha8uquu9a8n6nha.jpg)



## 环境搭建

搭建 FSP 开发环境。

- 下载并安装 [瑞萨FSP (flexible software package) 灵活配置软件包](https://www.renesas.cn/zh/software-tool/flexible-software-package-fsp) 。
- 下载并安装串口调试助手软件;

详见:[【EK-RA4C1开发套件】介绍、环境搭建、工程测试](//m.qjumbo.com/forum/thread-235467-1-1.html) .

## 工程创建

- [下载](https://www.renesas.cn/zh/design-resources/boards-kits/ek-ra4c1) 官方示例工程软件包;

!(//m.qjumbo.com/forum/data/attachment/forum/202605/30/195043gszsdd1nspl67k7l.jpg)

- 打开 e2 studio 软件,从文件目录 `..\ek_ra4c1\slcdc\slcdc_ek_ra4c1_ep\e2studio` 加载LCD 示例工程;
- 双击左侧目录文件 `configuration.xml` 进入 FSP Configuration 界面;
- 进入 Pins 标签页,将 P509、P510、P511 配置为输出模式,初始为低电平;

!(//m.qjumbo.com/forum/data/attachment/forum/202605/30/195100operpyd43enzdfki.jpg)
- 点击 `Generate Project Content` 重新生成工程框架代码;
- 右键项目文件夹,构建工程,确认无报错;

## 串口打印

由原理图可知,板载 JLINK 虚拟串口对应 P207 和 P206 引脚;

!(//m.qjumbo.com/forum/data/attachment/forum/202605/30/195117c1y445k919a0zdz5.jpg)



### 工程配置

- 设置目标串口对应的 GPIO 引脚

- 依次选择 `Pins` - `Peripherals` - `Connectivity:SCI` - `SCI4` 对应 P206 (RXD4) 和 P207 (TXD4) 引脚;
- 新建串口通信堆栈

- `New Stack` - `Connectivity` - `UART (r_sci_uart)`
- 选中 uart 堆栈方框,打开属性标签,配置串口参数

!(//m.qjumbo.com/forum/data/attachment/forum/202605/30/195137lw1662l0zlmyyk6k.jpg)

- 属性设置: `属性` - `Module g_uart4 UART (r_sci_uart)` - `General` 、`Baud`、`Interrupts` 设置回调函数;
- 点击 `Generate Code` 按钮,生成工程代码。

### 工程代码

打开 `./src/hal_entry.c` 文件,添加如下代码

```c++
#include "hal_data.h"
#include <stdio.h>

fsp_err_t err = FSP_SUCCESS;
volatile bool uart_send_complete_flag = false;
void user_uart4_callback (uart_callback_args_t * p_args)
{
    if(p_args->event == UART_EVENT_TX_COMPLETE)
    {
      uart_send_complete_flag = true;
    }
}

// 重定向 printf 到 UART4
#ifdef __GNUC__
    #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
    #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif

PUTCHAR_PROTOTYPE {
    fsp_err_t err = R_SCI_UART_Write(&g_uart4_ctrl, (uint8_t *)&ch, 1);
    if (FSP_SUCCESS != err) __BKPT();
    while (uart_send_complete_flag == false) {}
    uart_send_complete_flag = false;
    return ch;
}

// 重定向 _write 函数(支持 printf)
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 */
    /* Open the transfer instance with initial configuration. */
      err = R_SCI_UART_Open(&g_uart4_ctrl, &g_uart4_cfg);
      assert(FSP_SUCCESS == err);

      while(1)
      {
            printf("Hello World!\n");
            R_BSP_SoftwareDelay (500, BSP_DELAY_UNITS_MILLISECONDS);
      }
#if BSP_TZ_SECURE_BUILD
    /* Enter non-secure code */
    R_BSP_NonSecureEnter();
#endif
}
```

保存文件。

### 工程编译

- 右键项目文件夹,选择 `属性` ,进入 `C/C++ 构建` - `设置` 选项;
- 进入 `GNU Arm Cross Linker - Miscellaneous` 选项;
- 勾选 `Do not use syscalls` 选项 ,应用并关闭;

!(//m.qjumbo.com/forum/data/attachment/forum/202605/30/195255w8x6khy8ozdo3vwj.jpg)
- 右键项目文件夹,重新构建工程,确认无报错;

### 工程调试

右键工程文件夹 - 调试/运行项目(或点击工具栏小虫子按钮,进入 Debug 模式并运行)

!(//m.qjumbo.com/forum/data/attachment/forum/202605/30/195312yggrra6na2lcdpee.jpg)



### 效果演示

- 运行串口调试助手软件,配置波特率 115200 bps 等参数,打开串口;
- 串口连续输出 Hello World 字符串;

!(//m.qjumbo.com/forum/data/attachment/forum/202605/30/195328s2arbt4i488v5st9.jpg)



## 步进电机

在实现串口打印的基础上,进一步配置步进电机对应引脚定义及驱动程序。

### 流程图

!(//m.qjumbo.com/forum/data/attachment/forum/202605/30/195351qpxnio8ool3q3jit.jpg)



### 工程代码

包括主函数程序和驱动程序。

#### 主函数

在左侧的项目目录中,打开 `src/hal_entry.c` 文件,添加如下关键代码

```c++
#include "hal_data.h"
#include "stepmotor.h"

void hal_entry(void)
{
    /* TODO: add your own code here */
   
    step_motor_init(); // 初始化步进电机
   
    while (1)
    {
      lcd_clear_all(); // clear LCD
      set_segments_digits(180); // show rotate angle
      step_motor_rotate_degrees(180.0f, 2);// 顺时针旋转180°;
      step_motor_stop(); // release motor
      R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS);

      lcd_clear_all();
      set_segments_digits(90);
      step_motor_rotate_degrees(-90.0f, 2);// 逆时针旋转90°
      step_motor_stop();
      R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS);
    }

    step_motor_stop(); // stop motor
}
```

保存代码。

驱动代码包括步进电机驱动头文件和源文件程序。

#### stepmotor.h

新建 `stepmotor.h` 头文件 ,添加如下代码

```c++
#ifndef STEPMOTOR_H_
#define STEPMOTOR_H_

#include "hal_data.h"

// ===================== TMC2209 驱动配置 =====================
// 电机参数:1.8°步距角,8细分
#define STEP_ANGLE         1.8f
#define MICRO_STEP         8
#define STEPS_PER_REVOLUTION ((uint32_t)(360.0f / STEP_ANGLE * MICRO_STEP))// 1600 步/圈

// ===================== 引脚定义(你指定的) =====================
#define MOTOR_PIN_STEPBSP_IO_PORT_05_PIN_09   // P509
#define MOTOR_PIN_DIR   BSP_IO_PORT_05_PIN_10   // P510
#define MOTOR_PIN_EN    BSP_IO_PORT_05_PIN_11   // P511

// ===================== 方向定义 =====================
#define DIR_CW          BSP_IO_LEVEL_HIGH       // 顺时针
#define DIR_CCW         BSP_IO_LEVEL_LOW      // 逆时针

void step_motor_init(void);
void step_motor_enable(void);
void step_motor_disable(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_H_ */
```

保存代码。

#### stepmotor.c

新建 `stepper_motor.c` 源文件,添加如下代码

```c++
#include "stepmotor.h"
#include <stdio.h>
#include <stdlib.h>

// ===================== 函数声明 =====================
static void motor_pulse_send(void);

void step_motor_init(void)
{
    // 初始化引脚:EN=高电平(失能),STEP=低,DIR=低
    R_IOPORT_PinWrite(&g_ioport_ctrl, MOTOR_PIN_EN, BSP_IO_LEVEL_HIGH);
    R_IOPORT_PinWrite(&g_ioport_ctrl, MOTOR_PIN_STEP, BSP_IO_LEVEL_LOW);
    R_IOPORT_PinWrite(&g_ioport_ctrl, MOTOR_PIN_DIR, BSP_IO_LEVEL_LOW);

    printf("TMC2209 Stepper Motor Initialized.\r\n");
    printf("Steps per revolution: %lu\r\n", STEPS_PER_REVOLUTION);
}

// 使能电机(通电)
void step_motor_enable(void)
{
    R_IOPORT_PinWrite(&g_ioport_ctrl, MOTOR_PIN_EN, BSP_IO_LEVEL_LOW);
}

// 失能电机(断电)
void step_motor_disable(void)
{
    R_IOPORT_PinWrite(&g_ioport_ctrl, MOTOR_PIN_EN, BSP_IO_LEVEL_HIGH);
}

// 发送一个步进脉冲(TMC2209 上升沿触发)
static void motor_pulse_send(void)
{
    R_IOPORT_PinWrite(&g_ioport_ctrl, MOTOR_PIN_STEP, BSP_IO_LEVEL_HIGH);
    R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MICROSECONDS);
    R_IOPORT_PinWrite(&g_ioport_ctrl, MOTOR_PIN_STEP, BSP_IO_LEVEL_LOW);
}

// 旋转指定步数
void step_motor_rotate_steps(int32_t steps, uint32_t step_delay_ms)
{
    if (steps == 0) return;

    int8_tdir_flag   = (steps > 0) ? 1 : -1;
    uint32_t abs_steps   = (uint32_t)abs(steps);

    // 设置方向
    if (dir_flag > 0)
    {
      R_IOPORT_PinWrite(&g_ioport_ctrl, MOTOR_PIN_DIR, DIR_CW);
      printf("Rotating CW, steps: %lu, delay: %lu ms\r\n", abs_steps, step_delay_ms);
    }
    else
    {
      R_IOPORT_PinWrite(&g_ioport_ctrl, MOTOR_PIN_DIR, DIR_CCW);
      printf("Rotating CCW, steps: %lu, delay: %lu ms\r\n", abs_steps, step_delay_ms);
    }

    // 使能电机
    step_motor_enable();

    // 发送步数脉冲
    for (uint32_t i = 0; i < abs_steps; i++)
    {
      motor_pulse_send();
      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) + 0.5f);

    if (steps != 0)
    {
      step_motor_rotate_steps(steps, step_delay_ms);
    }
}

// 释放扭矩
void step_motor_stop(void)
{
    // 保持使能
    R_IOPORT_PinWrite(&g_ioport_ctrl, MOTOR_PIN_STEP, BSP_IO_LEVEL_LOW);
}

// 测试函数
void step_motor_test_sequence(void)
{
    while (1)
    {
      step_motor_rotate_degrees(180.0f, 2);// 正转180°
      step_motor_stop();
      R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS);

      step_motor_rotate_degrees(-90.0f, 2);// 反转90°
      step_motor_stop();
      R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS);
    }
}
```

保存代码。

### 工程编译

右键工程文件夹,点击构建项目(或点击工具栏小锤子按钮);

### 工程调试

右键工程文件夹 - 调试/运行项目 - 上传固件至开发板(或点击工具栏小虫子按钮,进入 Debug 模式并运行)。

### 效果演示

- 检查 42 步进电机、TMC2209 驱动板、电源、EK-RA4C1 开发板硬件连接;
- 运行串口调试助手软件,配置波特率 115200 bps 等参数,打开串口;
- 步进电机逆时针旋转,同时 LCD 显示角度数值;

!(//m.qjumbo.com/forum/data/attachment/forum/202605/30/195421brglt2jtfdtrz5vt.gif)



- 步进电机顺时针旋转,同时 LCD 显示角度数值;

!(//m.qjumbo.com/forum/data/attachment/forum/202605/30/195442tgbh8srhscpknlrb.gif)



- 串口打印旋转信息

!(//m.qjumbo.com/forum/data/attachment/forum/202605/30/195501ff73j4977jm17fs4.gif)



## 总结

本文介绍了 EK-RA4C1 开发套件结合 TMC2209 模块和 LCD 显示屏,实现 42 步进电机驱动和旋转角度显示的项目设计,包括环境搭建、工程创建、相关代码、流程图、效果演示等,为相关产品的开发设计提供了参考。


页: [1]
查看完整版本: 【EK-RA4C1开发套件】步进电机驱动

Baidu
map