【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]