用睿擎派实现 LVGL 可视化 EtherCAT 电机控制,触屏操控伺服电机就这么简单|技术集结
作者: 发布时间:2026-05-11 01:04:45 浏览量:
在工业自动化领域,运动控制系统往往面临两大痛点:实时性要求极高,同时又需要直观的人机交互界面。传统方案要么牺牲实时性换取界面体验,要么用昂贵的专用 HMI 设备来弥补。
今天分享一个基于睿擎派 RC3506的完整方案——用LVGL 图形界面 + EtherCAT 总线,在一块开发板上同时搞定可视化操控和微秒级实时控制。(文末附完整工程源码及使用指南扫码领取)
效果先看
触摸屏上拖动滑块 → 伺服电机精准转到指定位置;点击 Run/Stop 按钮 → 电机启停;切换 Direct/Reverse → 方向立即响应。屏幕上的位置表盘实时显示期望位置和当前位置,一目了然。
7寸触控屏上的 LVGL 控制界面:位置表盘 + 滑块 + 运行控制按钮
与此同时,EtherCAT 总线上挂载的远程 IO 模块同步输出流水灯效果,展示多从站并行控制能力。
为什么选 EtherCAT?
EtherCAT(Ethernet for Control Automation Technology)是目前工业现场总线中实时性最强的协议之一:
●通信周期最低 1ms,支持分布式时钟(DC)同步,精度达微秒级
●"飞速处理"机制:数据帧在经过从站时直接被读写,无需等待,延迟极低
●菊花链拓扑:一根网线串联多个从站,布线简单,最多支持 65535 个节点
●使用标准以太网硬件,无需专用芯片,成本可控
睿擎派 RC3506 内置 EtherCAT 主站协议栈,配合 RT-Thread 实时操作系统,可以稳定跑出1ms 控制周期。
硬件准备
连接方式:
睿擎派 ETH0 ──网线──> 伺服驱动器 IN 口
伺服驱动器 OUT 口 ──网线──> 远程 IO IN 口
睿擎派 MIPI 接口 ──排线──> 7 寸触控屏
EtherCAT 主从站硬件连接示意:睿擎派 → 伺服驱动器 → 远程 IO
软件架构
整个示例的软件结构非常清晰,main 函数只做两件事:
intmain(void)
{
lvgl_thread_init();// 启动 LVGL 图形线程
ethercat_domain_init();// 启动 EtherCAT 控制线程
return0;
}
两个线程并行运行,互不干扰:
●LVGL 线程:负责渲染界面、响应触摸事件,将用户操作写入共享变量
●EtherCAT 线程:以 1ms 为周期读取共享变量,通过 PDO 下发目标位置给伺服驱动器
EtherCAT 主站初始化流程
EtherCAT 的状态机切换是标准流程,睿擎平台封装得很简洁:
// 1. 初始化主站服务
ecat_service_init();
// 2. 自动扫描总线拓扑,发现所有从站
ecat_master_init(&csp_master);
// 2. 自动扫描总线拓扑,发现所有从站
slave_counts=ecat_slavecount(&csp_master);;
// 3. 配置分布式时钟(DC)同步
slave_cia402_config.dc_assign_activate=0x300;
slave_cia402_config.dc_sync[0].cycle_time=csp_master.main_cycletime_us*1000;
slave_cia402_config.dc_sync[0].shift_time=500000;
slave_cia402_config.dc_sync[1].cycle_time=0;
slave_cia402_config.dc_sync[1].shift_time=0;
// 4. 配置 PDO 映射(目标位置、控制字、状态字等)
slave_cia402_config.sync=slave_syncs;
slave_cia402_config.sync_count=sizeof(slave_syncs)/sizeof(ec_sync_info_t);
ecat_slave_config(&csp_master,0,&slave_cia402_config);
// 5. 启动主站自动完成状态机切换:INIT → PRE-OP → SAFE-OP → OPERATIONAL
ecat_master_start(&csp_master);
state=EC_STATE_OPERATIONAL;
ecat_check_state(&csp_master,0,&state,20000000*3);
进入 OPERATIONAL 状态后,主站开始周期性收发过程数据(PDO),电机控制正式开始。
CSP 模式:周期同步位置控制
本示例使用CSP(Cyclic Synchronous Position)模式,这是伺服控制中最常用的模式之一:
主站每个控制周期向伺服驱动器发送目标位置,驱动器内部完成位置环、速度环、电流环的闭环控制。主站只需关心"去哪里",不需要关心"怎么去"。
核心控制循环如下:
while(1)
{
servo_switch_op(rmap,tmap);// 进行伺服状态机切换
if(rmap->control_word==7)
{
rmap->mode_byte=0x8;
rmap->dest_pos=tmap->cur_pos;// 同步当前位置
}
if(rmap->control_word==0xf)
{
if(motor_target_pos_last!=motor_target_pos)
{
/* 获取当前位置 */
motor_current_pos=PULSE_TO_ANGLE(tmap->cur_pos);
if(abs(motor_current_pos-motor_target_pos)<=0)
{
rmap->dest_pos=tmap->cur_pos;
if(abs(tmap->cur_pos-rmap->dest_pos)<=10)
{
/* 微调目标位置 */
motor_target_pos_last=motor_target_pos;
}
gotostop;
}
if(servo_dir)
{
rmap->dest_pos-=motor_step;// 根据方向步进目标位置
}
else
{
rmap->dest_pos+=motor_step;// 根据方向步进目标位
}
}
}
stop:
rt_thread_delay(5);
}
servo_run、motor_target_pos、servo_dir 这些变量由 LVGL 界面线程写入,EtherCAT 线程读取,实现了界面与控制的解耦。
PDO 映射:主站与从站的数据约定
PDO(Process Data Object)定义了每个控制周期主站和从站交换哪些数据:
主站 → 从站(RPDO,输出):
|
对象字典 |
含义 |
|
0x6060 |
工作模式(设为 0x08 = CSP 模式) |
|
0x6040 |
控制字(使能/停止/故障复位) |
|
0x607A |
目标位置 |
|
0x60FF |
目标速度 |
|
0x6071 |
目标转矩 |
从站 → 主站(TPDO,输入):
|
对象字典 |
含义 |
|
0x603F |
错误码 |
|
0x6041 |
状态字(当前状态) |
|
0x6064 |
实际位置(反馈给 LVGL 显示) |
|
0x606C |
实际速度 |
|
0x6077 |
实际转矩 |




