创龙科技研发的 TL3588-EVM 评估板可基于 IgH EtherCAT 实现伺服电机控制。为助力开发者掌握相关开发要点,本文先介绍 IgH EtherCAT,再详述案例测试(多模式多状态电机控制与抖动统计)、编译流程及核心代码,覆盖环境配置、驱动加载与程序运行,帮助开发者高效完成评估板 IgH EtherCAT 主站开发与电机控制功能实现。
本文档适用开发环境:
Windows开发环境:Windows 7 64bit、Windows 10 64bit
开发环境:VMware16.2.5、Ubuntu20.04.6 64bit
U-Boot:U-Boot-2017.09
Kernel:Linux-RT-5.10.160
LinuxSDK:LinuxSDK-[版本号](基于rk3588_linux_release_v1.2.1_20230720)
IgH EtherCAT:ethercat-stable-1.5-gcd0d17d-20210723
伺服驱动器:台达ASD-A2-0121-E
伺服电机:台达ECMA-C10401GS
我司默认使用的是Linux内核,同时提供了Linux-RT内核boot-rt.img位于产品资料“4-软件资料\Debian\Kernel\image\linux-5.10.160-[版本号]-[Git系列号]\”目录下,版本号、Git序列号以实际情况为准。请按照如下方法替换为Linux-RT内核。
请将boot-rt.img镜像拷贝至评估板文件系统任意目录下。执行如下命令,替换内核镜像至系统启动卡,评估板重启生效。
备注:如需固化至eMMC,请将设备节点修改为"/dev/mmcblk0p3"。
Target# dd if=boot-rt.img of=/dev/mmcblk1p3
Target# sync
Target# reboot
我司提供的IgH EtherCAT主站开发案例igh_ethercat_dc_motor位于产品资料“4-软件资料\Demo\”目录下,主要包含src、bin和igh_ethercat等文件夹,具体说明如下。
IgH EtherCAT为运行于Linux系统的免费开源EtherCAT主站程序,框架如下所示。
IgH EtherCAT主站通过构建Linux字符设备,应用程序通过对字符设备的访问实现与EtherCAT主站模块的通信。
IgH EtherCAT开发包提供EtherCAT工具,该工具提供各种可在Linux用户层运行的命令,可直接实现对从站的访问和设置,如设置从站地址、显示总线配置、显示PDO数据、读写SDO参数等。
IgH EtherCAT官网:https://www.etherlab.org/en/ethercat。
案例功能:EtherCAT通讯周期时间为1ms,控制伺服电机正转和反转,并通过串口循环打印EtherCAT通讯周期时间的最大值和最小值。
(1)正转:伺服电机目标速度从0加速到10000,当达到10000速度后,控制伺服电机减速至0,循环运行。
(2)反转:伺服电机目标速度从0加速到-10000,当达到-10000速度后,控制伺服电机减速至0,循环运行。
在本案例测试过程中,程序均在隔离CPU环境下运行,并分别采用SCHED_FIFO和SCHED_DEADLINE两种进程调度策略,在空载状态、满负荷状态下持续运行12小时。
请按下图所示使用网线连接评估板ETH1网口和伺服驱动器A的IN网口,将伺服驱动器A的OUT网口使用网线连接至伺服驱动器B的IN网口。
本次测试以隔离CPU4核心为例进行演示,评估板上电前长按"Ctrl + C"进入U-Boot命令行模式,修改环境变量,隔离CPU4核心,保存环境变量后重启评估板。
U-Boot# setenv bootargs "storagemedia=emmc androidboot.storagemedia=emmc androidboot.mode=normal isolcpus=4"
U-Boot# saveenv
U-Boot# reset
进入评估板文件系统,执行如下命令,确认已正确隔离CPU。
Target# cat /proc/cmdline
为便于测试,我司提供经验证的IgH EtherCAT主站程序为案例"igh_ethercat\images\"目录下的ethercat-stable-[版本号]-[Git序列号].tar.gz压缩包,将其拷贝至评估板文件系统任意目录下。版本号、Git序列号请以实际情况为准。将案例bin目录下的igh_ethercat_dc_motor可执行文件拷贝至评估板文件系统。
执行如下命令,解压IgH EtherCAT主站程序压缩包,得到_install文件夹。
Target# tar -xvf ethercat-stable-1.5-gcd0d17d.tar.gz
执行如下命令,并查询评估板网卡物理地址。
Target# ifconfig
执行如下命令,加载驱动模块,命令中"0e:e2:85:a1:c8:fd"为评估板网卡物理地址,请根据实际情况修改。
Target# insmod -f /root/_install/modules/ec_master.ko main_devices=0e:e2:85:a1:c8:fd
执行如下命令,拷贝EtherCAT主站相关文件至评估板文件系统。
Target# mkdir /etc/sysconfig
Target# cp _install/etc/sysconfig/ethercat /etc/sysconfig
Target# mkdir -p /lib/modules/$(uname -r)
Target# cp _install/modules/ec_master.ko /lib/modules/$(uname -r)
Target# depmod -a
备注:此处的警告信息不影响测试结果,忽略即可。
执行如下命令,启动EtherCAT主站。
Target# /root/_install/etc/init.d/ethercat start
执行如下命令,加载ec_generic.ko驱动文件。
Target# insmod -f _install/modules/ec_generic.ko
执行如下命令,添加IgH动态链接库路径。
Target# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/root/_install/lib
Target# sync
执行如下命令,修改内核信息打印级别。
Target# echo 1 4 1 7 > /proc/sys/kernel/printk
执行如下命令,可查看igh_ethercat_dc_motor程序相关参数信息。
Target# ./igh_ethercat_dc_motor --help
参数解释
(1)-d:指定电机转向,0:正转,1:反转;
(2)-v:打印程序版本信息;
(3)-s:选择进程调度策略模式。程序执行时未使用-s参数或-s参数值为0,进程调度策略默认为SCHED_FIFO;若使用-s参数且参数值为1,进程调度策略为SCHED_DEADLINE,后面未添加参数值[xxx xxx xxx]则使用默认参数值,其中sched-runtime值表示运行时间、sched-deadline值表示相对的期限、sched-period值表示周期,单位均为ns;
(4)-help:查看程序运行参数。
该测试状态为程序运行在隔离CPU,程序进程调度策略设置为SCHED_FIFO,进程优先级设置为最高,空载状态测试12个小时。
执行以下命令,控制两台伺服电机同时正转。
Target# taskset -c 4 ./igh_ethercat_dc_motor -d 0 -s 0 > log.txt &
打印信息"2554"为进程号,请根据实际进程号,执行如下命令,确认进程调度策略。
Target# chrt -p 2554
如需停止运行后台程序,请执行如下命令。
Target# kill -9 2554
该测试状态为程序运行在隔离CPU,程序进程调度策略设置为SCHED_FIFO,进程优先级设置为最高,满负荷状态压力测试12个小时。
执行以下命令,控制两台伺服电机同时正转。
Target# stress --cpu 8 --io 8 --vm 8 -t 43200 &
Target# taskset -c 4 ./igh_ethercat_dc_motor -d 0 -s 0 > log.txt &
打印信息"2785"为进程号,请根据实际进程号,执行如下命令,确认进程调度策略。
Target# chrt -p 2785
如需停止运行后台程序,请执行如下命令。
Target# kill -9 2785
该测试状态为程序运行在隔离CPU,程序进程调度策略设置为SCHED_DEADLINE、进程优先级设置为最高,空载状态测试12个小时。
执行如下命令,控制两台伺服电机同时正转。
Target# taskset -c 4 ./igh_ethercat_dc_motor -d 0 -s 1 > log.txt &
打印信息"2874"为进程号,请根据实际进程号,执行如下命令,确认进程调度策略。
Target# chrt -p 2874
如需停止运行后台程序,请执行如下命令。
Target# kill -9 2874
该测试状态为程序运行在隔离CPU,进程调度策略设置为SCHED_DEADLINE,优先级设置为最高,满负荷状态压力测试12个小时。
执行以下命令,控制两台伺服电机同时正转。
Target# stress --cpu 8 --io 8 --vm 8 -t 43200 &
Target# taskset -c 4 ./igh_ethercat_dc_motor -d 0 -s 1 > log.txt &
打印信息"2985"为进程号,请根据实际进程号,执行如下命令,确认进程调度策略。
Target# chrt -p 2985
如需停止运行后台程序,执行如下命令。
Target# kill -9 2985
程序运行输出的打印信息保存到了log.txt,停止后台运行程序后,执行如下命令查看log.txt部分内容。
Target# head -n100 log.txt
参数解释:
(1)latency:等待唤醒时间(ns);
(2)period:EtherCAT通讯周期时间(ns);
(3)exec:接收和发送EtherCAT数据时间(ns)。
案例设置period为1ms,通过分析log.txt得到12小时的period最小值和period最大值(period单位:纳秒),通过分析计算period得到12个小时的period抖动值(period最大值 - period最小值),从period抖动值中分析、计算得到period最大抖动值、period平均抖动值。
对log.txt文件内容进行数据分析后,得到如下结果。
备注:从表中数据可知,SCHED_DEADLINE模式在空载、满负荷状态都比SCHED_FIFO模式抖动值小,建议使用SCHED_DEADLINE模式。
请参考上述“电机正转”测试方法,将运行igh_ethercat_dc_motor可执行程序命令中的"-d 0"参数修改为"-d 1"。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。