0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于RT-Thread与瑞萨 VisionBoard 的多功能电机驱动器开发 | 技术集结

RT-Thread官方账号 2026-02-12 18:14 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1. 前言

该项目是基于瑞萨 VisionBoard 主控芯片开发的多功能电机驱动器,核心通过 485 串口协议实现外部设备与驱动器的通讯,进而控制电机启停等动作。开发过程中为丰富功能,临时新增了通用隔离输入输出、步进电机驱动等硬件电路,目前已完成电源模块无刷电机驱动模块、485 通讯模块的功能验证。

这次开发是实践学习的过程:不仅接触了新的 PCB 制图工具完成电路布局与走线(虽布局走线仍有待优化),还学习了 RT-Thread 操作系统的基础使用,同时初步掌握了瑞萨 VisionBoard 芯片及配套开发工具的操作逻辑。(我的这个作品项目主要是我个人学习一下第一次参加比较懵所以整体是一团乱的所以希望大家见谅哈谢谢)

a3fa122c-07fb-11f1-96ea-92fbcf53809c.png

a40c1454-07fb-11f1-96ea-92fbcf53809c.png

(实力有限我只是把我想尝试的部分先添加进去了看上去很杂后面会重新画板打样,然后功能这次就都一个模块一个模块去实现并没有进行整合,然后另外的BTB拓展板是后面发现RPI的PWM口正常来说应该是三个可以实现PWM互补然后用六步换相吧好像但是工具不是很会用所以就麻烦了点然后不够用所以就临时打样的有加LED数码管OLED并且把BTB的IO口用排针再引出来)

2. 设计方案

2.1电机模块

2.1.1 电机选择

选用两类电机覆盖不同场景:

无刷电机:用于持续运转的场景;

步进电机:用于高精度位置控制的场景。

2.1.2 无刷电机控制

基于硬件电路实现驱动与监测:

核心驱动:采用 EG2123A 无刷电机驱动芯片(U29),输出电机相驱动信号

电流监测:通过 INA240 双向电流检测芯片(U25、U26),实时监测无刷电机的相电流;

功率输出:由 NMOS 管组成的功率电路(Q4、Q5 等),放大驱动信号后连接无刷电机(接口 J8)。

  • a41f198c-07fb-11f1-96ea-92fbcf53809c.png

这个是驱动波形(电机转起来好像还是有点问题还得再测一下看看但是电路能正常的驱动电机)

  • a42ba012-07fb-11f1-96ea-92fbcf53809c.png

2.1.3 步进电机控制

基于 A4988 芯片实现细分驱动:

驱动核心:采用 A4988 双步进电机驱动芯片(U1、U2),支持 DIR(方向)、STEP(脉冲)控制;

电流监测:通过 INA219 电流检测芯片(U3、U4),监测步进电机工作电流;

接口:通过 J10、J13 接口连接步进电机,传输驱动信号。

a437eaac-07fb-11f1-96ea-92fbcf53809c.png

2.2 主控板及其按键模块

2.2.1 主控芯片选择

选用瑞萨 VisionBoard 系列芯片作为主控核心,负责:解析 485 通讯指令、输出电机驱动信号、管理各功能模块的逻辑调度。

2.2.2 无线通信模块的选取(调整为:通讯模块(485 串口通讯))

采用 “隔离 + 独立供电” 的 485 通讯方案:

信号隔离:通过 TJA121M31 芯片(U13)实现主控与 485 总线的信号隔离;

总线收发:通过 GM485E 收发器(U16)完成 485 差分信号的转换;

电源隔离:通过 B0505S-1WR3 模块(U14)为 485 电路单独供电,避免共地干扰;

接口:通过 J15 接口连接外部 485 设备。

  • a444a148-07fb-11f1-96ea-92fbcf53809c.png

a4506a50-07fb-11f1-96ea-92fbcf53809c.pnga45ce15e-07fb-11f1-96ea-92fbcf53809c.pnga4684670-07fb-11f1-96ea-92fbcf53809c.png

这些主要是485测试到的波形能够使用但是波形可能不太正常峰值没有到3.3V还得修改。

2.2.3 通用隔离输入输出模块

通过 EL357N 光耦实现信号隔离:

隔离输入:外部信号经 2.2K 电阻限流、1N4148W 防反后,通过光耦(U18、U19)传输至主控(MCU_IN1~IN4,接口 U40);

隔离输出:主控信号(MCU_OUT1~OUT2)经光耦(U20、U21)隔离后输出(接口 U42、U7),配合 4.7K 上拉电阻增强驱动能力。

  • a47487a0-07fb-11f1-96ea-92fbcf53809c.png

2.3.5 电源模块

设计多级稳压电路,为各模块供电:

+12V 输入:经 U54 芯片稳压后,供给无刷电机驱动等高压模块;

+12V 转 + 5V:经 U35 芯片转换,供给 485 通讯、无刷驱动电路

+5V 转 + 3.3V:经 RT90L3-33GB LDO(U36)转换,供给主控、光耦、电流检测芯片等低压模块;

滤波:各电源支路搭配 10uF/0.1uF 电容,实现稳压滤波。

a482dc1a-07fb-11f1-96ea-92fbcf53809c.png

下面这张图是电源的纹波还可以个人感觉可能有机会再调试下电阻电容

a48e302e-07fb-11f1-96ea-92fbcf53809c.pnga499b336-07fb-11f1-96ea-92fbcf53809c.pnga4a55718-07fb-11f1-96ea-92fbcf53809c.png

下面的这几张是降压后的波形

a499b336-07fb-11f1-96ea-92fbcf53809c.pnga4b823fc-07fb-11f1-96ea-92fbcf53809c.png

3. 代码工程

3.1源码分享

分享 RT-Thread 在瑞萨 VisionBoard 的适配代码;

提供 485 驱动、无刷电机驱动、电源监测等模块的源码(含初始化、指令解析逻辑)。

rasc配置以及部分代码

  • a4c3420a-07fb-11f1-96ea-92fbcf53809c.png

PWM参数死区时间波形方式以及频率等需要按照实际去调
可参考RT-Thread指南

《RA8D1 Vision Board开发实践指南》上线啦

十三、RA8D1 Vision Board上的IIC实践(欧小龙)

https://club.rt-thread.org/ask/article/ee39d1a9067b6ca0.html

RT-Thread-【Vision Board 创客营】Vision Board上的ADC实践RT-Thread问答社区 - RT-Thread

https://club.rt-thread.org/ask/article/921f3b1452d1d203.html

[RT-Thread-Vision Board创客营] PWM模块实践RT-Thread问答社区 - RT-Thread

https://club.rt-thread.org/ask/article/921f3b1452d1d203.html


motor_ctrl.c

#include"FOC.h"#include"rtdevice.h"

#defineMOTOR_THREAD_STACK_SIZE 2048

#defineMOTOR_THREAD_PRIORITY 8

#defineMOTOR_THREAD_TIMESLICE 10

#defineMAX_TARGET_SPEED_RPM 2400.0f

#defineSPEED_RAMP_RATE 100.0f

static float current_target_speed = 0.0f;

static rt_bool_t motor_enabled = RT_FALSE;

static rt_uint16_t motor_pole_pairs = 7;

static float rpm_to_radps(float rpm) {

return rpm 2.0f PI / 60.0f;

}

static float radps_to_rpm(float radps) {

return radps 60.0f / (2.0f PI);

}

static float speed_ramp(float target_speed, float current_speed, float dt) {

float max_delta = SPEED_RAMP_RATE * dt;

if (target_speed > current_speed) {

current_speed += max_delta;

if (current_speed > target_speed) current_speed = target_speed;

} else {

current_speed -= max_delta;

if (current_speed < target_speed) current_speed = target_speed; 

} return current_speed;

}

static void motor_thread_entry(void *parameter) {

static rt_tick_t last_time = 0;

static float current_speed_rpm = 0.0f;

foc_init(); foc_start(); motor_enabled = RT_TRUE;

while (1) { rt_tick_t current_time = rt_tick_get(); float dt = (current_time - last_time) * 0.001f; if (dt <= 0) dt = 0.001f;

if (motor_enabled) {
float target_velocity = get_target_velocity();
float target_speed_rpm = radps_to_rpm(target_velocity);

target_speed_rpm = target_speed_rpm > MAX_TARGET_SPEED_RPM ? MAX_TARGET_SPEED_RPM : target_speed_rpm;
target_speed_rpm = target_speed_rpm < -MAX_TARGET_SPEED_RPM ? -MAX_TARGET_SPEED_RPM : target_speed_rpm;

current_speed_rpm = speed_ramp(target_speed_rpm, current_speed_rpm, dt);

float target_mech_radps = rpm_to_radps(current_speed_rpm);
FOC_M0_SET_VEL(target_mech_radps);

foc_loop();

if (current_time - last_time > RT_TICK_PER_SECOND) {
float actual_vel = getVelocity();
float actual_rpm = radps_to_rpm(actual_vel);
rt_kprintf("Motor: Target=%.1fRPM, Actual=%.1fRPM\n", current_speed_rpm, actual_rpm);
last_time = current_time;
}
} else {
current_speed_rpm = 0;
FOC_M0_SET_VEL(0);
}

rt_thread_mdelay(1);
last_time = current_time;

}

}

void motor_start(void) {

rt_thread_t tid = rt_thread_create("motor", motor_thread_entry, RT_NULL, MOTOR_THREAD_STACK_SIZE, MOTOR_THREAD_PRIORITY, MOTOR_THREAD_TIMESLICE);

if (tid) { rt_thread_startup(tid);

}

}

void motor_enable(rt_bool_t enable) {

motor_enabled = enable;

if (!enable) {

set_target_velocity(0);

}

}


rs485.c

#include"bsp_rs485.h"
#include"hal_data.h"

#defineRS485_RX_BUF_SIZE 100
#defineRS485_SWITCH_DELAY 10

static uint8_t rs485_rx_data[RS485_RX_BUF_SIZE];
static volatile uint16_t rs485_rx_datalen;
static volatile bool rs485_rx_complete;
static volatile bool rs485_tx_complete;

fsp_err_t RS485_Init(void)
{
fsp_err_t err = FSP_SUCCESS;
err = R_SCI_B_UART_Open(&g_uart2_rs485_ctrl, &g_uart2_rs485_cfg);
if(FSP_SUCCESS != err) return err;
err = R_SCI_B_UART_Read(&g_uart2_rs485_ctrl, rs485_rx_data, RS485_RX_BUF_SIZE);
return err;
}

void RS485_Print(uint8_t *str, uint32_t strlen)
{
RS485_TX_EN;
R_BSP_SoftwareDelay(RS485_SWITCH_DELAY, BSP_DELAY_UNITS_MILLISECONDS);
rs485_tx_complete = false;
R_SCI_B_UART_Write(&g_uart2_rs485_ctrl, str, strlen);
while(false == rs485_tx_complete);
R_BSP_SoftwareDelay(RS485_SWITCH_DELAY, BSP_DELAY_UNITS_MILLISECONDS);
RS485_RX_EN;
}

uint16_t RS485_GetRxData(uint8_t *buf, uint16_t len)
{
uint16_t copy_len = (rs485_rx_datalen < len) ? rs485_rx_datalen : len;
R_BSP_InterruptsDisable();
memcpy(buf, rs485_rx_data, copy_len);
rs485_rx_datalen = 0;
rs485_rx_complete = false;
R_BSP_InterruptsEnable();
R_SCI_B_UART_Read(&g_uart2_rs485_ctrl, rs485_rx_data, RS485_RX_BUF_SIZE);
return copy_len;
}

bool RS485_GetRxComplete(void)
{
return rs485_rx_complete;
}

void rs485_uart2_callback(uart_callback_args_t *p_args)
{
switch(p_args->event)
{
case UART_EVENT_RX_COMPLETE:
rs485_rx_complete = true;
break;
case UART_EVENT_RX_CHAR:
R_BSP_InterruptsDisable();
if(rs485_rx_datalen < RS485_RX_BUF_SIZE)
{
rs485_rx_data[rs485_rx_datalen] = (uint8_t)p_args->data;
rs485_rx_datalen++;
}
R_BSP_InterruptsEnable();
break;
case UART_EVENT_TX_COMPLETE:
rs485_tx_complete = true;
break;
default:
break;
}
}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 瑞萨
    +关注

    关注

    37

    文章

    22482

    浏览量

    90904
  • 电机驱动器
    +关注

    关注

    16

    文章

    861

    浏览量

    66466
  • RT-Thread
    +关注

    关注

    32

    文章

    1614

    浏览量

    44909
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RT-Thread Vector软件包:嵌入式开发的动态数组容器 | 技术集结

    RT-Thread Vector软件包:嵌入式开发的动态数组容器 | 技术集结
    的头像 发表于 01-25 09:33 5411次阅读
    <b class='flag-5'>RT-Thread</b> Vector软件包:嵌入式<b class='flag-5'>开发</b>的动态数组容器 | <b class='flag-5'>技术</b><b class='flag-5'>集结</b>

    RA4系列开发板体验】+RT-thread5.0.0

    1.插上电源和自制的ST-Link。2.下载RT-Thread5.0.0 https://github.com/RT-Thread/rt-thread3.下载MDK中的
    发表于 12-28 00:35

    RT-Thread Studio驱动SD卡

    总结前言硬件平台:RT-Thread ART-Pi STM32H750XBH6开发板 H750开发开发软件:RT-Thread Studi
    发表于 12-27 19:13 20次下载
    <b class='flag-5'>RT-Thread</b> Studio<b class='flag-5'>驱动</b>SD卡

    RT-Thread全球技术大会:的解决方案、产品阵容以及四大核心技术介绍

    RT-Thread全球技术大会:的解决方案、产品阵容以及四大核心技术介绍           审核编辑:彭静
    的头像 发表于 05-27 10:14 1791次阅读
    <b class='flag-5'>RT-Thread</b>全球<b class='flag-5'>技术</b>大会:<b class='flag-5'>瑞</b><b class='flag-5'>萨</b>的解决方案、产品阵容以及四大核心<b class='flag-5'>技术</b>介绍

    RT-Thread全球技术大会:关于“e-AI”概念的训练和开发流程

    RT-Thread全球技术大会:关于“e-AI”概念的训练和开发流程         审核编辑:彭静  
    的头像 发表于 05-27 10:30 1618次阅读
    <b class='flag-5'>RT-Thread</b>全球<b class='flag-5'>技术</b>大会:关于<b class='flag-5'>瑞</b><b class='flag-5'>萨</b>“e-AI”概念的训练和<b class='flag-5'>开发</b>流程

    RT-Thread全球技术大会:搭载触摸按键单元的MCU介绍

    RT-Thread全球技术大会:搭载触摸按键单元的MCU介绍         审核编辑:彭静  
    的头像 发表于 05-27 10:33 1759次阅读
    <b class='flag-5'>RT-Thread</b>全球<b class='flag-5'>技术</b>大会:搭载触摸按键单元的<b class='flag-5'>瑞</b><b class='flag-5'>萨</b>MCU介绍

    RT-Thread大会:e- AI成功案例及部署

      RT-Thread IoT OS Global Tech Conference (RT-Thread GTC,RT-Thread全球技术大会)致力于围绕
    的头像 发表于 05-27 10:18 2016次阅读
    <b class='flag-5'>RT-Thread</b>大会:<b class='flag-5'>瑞</b><b class='flag-5'>萨</b>e- AI成功案例及部署

    RT-Thread全球技术大会:关于RA2L1-CPK低功耗CPU演示

    RT-Thread全球技术大会:关于RA2L1-CPK低功耗CPU演示           审核编辑:彭静  
    的头像 发表于 05-27 15:23 2080次阅读
    <b class='flag-5'>RT-Thread</b>全球<b class='flag-5'>技术</b>大会:关于<b class='flag-5'>瑞</b><b class='flag-5'>萨</b>RA2L1-CPK低功耗CPU演示

    电子正式成为RT-Thread金牌会员:进一步加速RA生态发展

    日前,全球半导体解决方案供应商电子(Renesas)与知名物联网操作系统厂商睿赛德科技(RT-Thread)签署会员合作协议,电子正
    的头像 发表于 11-09 10:38 1411次阅读
    <b class='flag-5'>瑞</b><b class='flag-5'>萨</b>电子正式成为<b class='flag-5'>RT-Thread</b>金牌会员:进一步加速RA生态发展

    【线下培训】上海临港: RT-Thread × 工业监视 RA6M3 HMI Board解决方案

    RT-Thread将于10月14日在上海临港举行一场线下培训。 本次培训将为开发者们带来期待已久的热门技术主题,
    的头像 发表于 09-07 17:40 1808次阅读
    【线下培训】上海临港: <b class='flag-5'>RT-Thread</b> × <b class='flag-5'>瑞</b><b class='flag-5'>萨</b> 工业监视<b class='flag-5'>器</b> RA6M3 HMI Board解决方案

    Cortex-M内核RA MCU的RT-Thread BSP制作教程发布

    Cortex-M内核RA MCU的RT-Thread BSP制作教程发布
    的头像 发表于 09-18 10:58 1615次阅读
    <b class='flag-5'>瑞</b><b class='flag-5'>萨</b>Cortex-M内核RA MCU的<b class='flag-5'>RT-Thread</b> BSP制作教程发布

    【议程发布】10月上海线下培训:RT-Thread × 工业监视+HMI解决方案!

    为大家带来行业主题演讲! 同时,我们也邀请到RT-Thread工程师 张丙儒 和 张康 ,他们将为开发者们带来期待已久的热门技术主题培训,RT-Thread × 
    的头像 发表于 09-28 18:45 1360次阅读
    【议程发布】10月上海线下培训:<b class='flag-5'>RT-Thread</b> × <b class='flag-5'>瑞</b><b class='flag-5'>萨</b> 工业监视<b class='flag-5'>器</b>+HMI解决方案!

    【好书推荐】RT-Thread设备驱动开发指南

    近年来国内芯片产业和物联网产业的快速崛起,行业发展迫切需要更多人才,尤其需要掌握嵌入式操作系统等底层技术的人才。随着RT-Thread被更广泛地应用于行业中,开发者对嵌入式驱动
    的头像 发表于 08-01 08:35 2060次阅读
    【好书推荐】<b class='flag-5'>RT-Thread</b>设备<b class='flag-5'>驱动</b><b class='flag-5'>开发</b>指南

    电子全球VP莅临RT-Thread指导交流

    近日,电子高级副总裁関俊彦(ToshihikoSeki)先生及电子嵌入式处理事业部市场总监沈清女士一行拜访了上海睿赛德电子科技有限
    的头像 发表于 08-30 13:11 1278次阅读
    <b class='flag-5'>瑞</b><b class='flag-5'>萨</b>电子全球VP莅临<b class='flag-5'>RT-Thread</b>指导交流

    电子亮相RT-Thread 20周年开发者大会

    日前,“开源向实·生产力进化启示录”全球峰会暨RT-Thread睿赛德二十周年开发者大会在上海举行。过去一年中,电子与RT-Thread
    的头像 发表于 02-02 16:05 328次阅读