ECAT轴【调试笔记】

本文详细介绍了EtherCat主站如何配置从站电机,包括SDO和PDO的区别、伺服电机的电流调节、圈脉冲设置、回零操作以及速度、加速度和力矩的控制。同时,强调了电子齿轮比在精度控制中的重要性,并提供了伺服电机的相关寄存器设置。此外,还提及了步进电机的齿轮比调整和CNC系统的轴跟随功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网口区分输入输出:插错会导致总线棕色三角标

看清楚从站的rj45网口的in和out,不要插错了。

硬件搭建好后:
1鼠标点击 EtherCat主站
2点击【扳手在线】
3【ecat主站】右键,扫描网络【如果报错,修改实际ecat网口mac】,扫描出硬件,复制到工程,
        然后【离线】然后驱动器下添加【CIA402电机】然后电机改别名,如【X1】
4【扳手在线】点击从站电机
5调试
6电机点击对应按钮,电机应该正常工作【能旋转】

 学前知识:

SDO和PDO有区别:
SDO是对单一寄存器的读写。【效率低】
SDO只在PDO通讯前,只运行一次。【相当于对对象的初始化】

PDO是批量读写多个寄存器【效率高】【利用一帧数据的数据包长度,
直接覆盖到对应的寄存器组】这样【一帧数据包】就能批量写多个寄存器了
PDO是在硬件的ecat线程中死循环运行的。

驱动器使用前的注意事项:

步进电机不同于伺服。【缺力矩模式】
1先用SDO调节电机电流。   【参考:雷赛 0x2000】
2再修改电机一圈脉冲当量。 【参考:雷赛 0x2001】

在驱动器页》SDO启动参数》添加

 0x6060是伺服的工作模式【定位,速度,力矩,力矩定位,等】。

【1】先设置电机额定电流;【2】再设置圈脉冲。 

回零:【0x6098赋值35和37是当前位置为零点】

伺服模式:6060    //【1位置 3速度 4扭矩 6回零 7补间 8CSP  // 8是ecat

设置速度:6081
起跳速度:6082
加速:6083
减速:6084
急停速度:6085

原点偏置:607C
回零方式:6098 // 【35和37当前位置,设置零位】17~37(十进制)
回零高速:6099-01
回零低速:6099-02
回零加减速:609A
回零最大速度:607F

位置偏差阀值:6065

当前模式:6061
状态字:6041
指令位置:60FC
编码值:6063
坐标位置:6064
位置偏差:60F4
速度反馈:606C
错误码:603F

//6040-b4触发    b8停止

 0x6098设置35后,这样调试的时候,方便调节电机零位,先失能后转动电机,然后使能,然后回零。

点击通用》勾选专家模式》点击COE在线》设置0x6098=35;

 

电子齿轮比: 

电子齿轮比非常重要。
这个分2部分:软件缩放比和伺服齿轮比。

软件缩放比: 软件上位置1.00mm对应给下位机发多少脉冲。
假设丝杆导程是5mm【电机转一圈是5毫米】// 始终以一圈为参考单位
软件5mm发25万脉冲给下位机,那缩放比是【10000 : 1】
就是说:软件走1毫米,发给下位机10000脉冲。//伺服位置寄存器u32bit
【一个导程,你想发多少脉冲当量】
//=========================
伺服电机:
分子:填编码器脉冲数
分母:一个导程的脉冲当量【例如:设置50000,就是上位机要发5万脉冲,电机才能转1圈】

【转速】一个导程值,为1秒1圈。
每分钟转数【/】60【x】导程值

 要改成 10000比1   或者  【50000 比 5 】

【编码器脉冲数】        【电机圈数】
【电机圈速】            【减速机输出圈速】
【减速机输出圈速】       【应用程序移动单元】

同样的步进电机也要改齿轮比。

都是以1圈为参考:
伺服齿轮比改成:50000脉冲 一圈

雷赛的参数在  0x2001=50000;

距离 除以 速度  等于   多少秒完成。【可以大概计算出路径多少秒完成】 

距离设置5,按住按钮,电机正好转1圈。 

速度:【r/s】转/秒  //只需要填实际速度【r/s】
60步进电机140转秒     //42步进2.5A240r/s, 1A90r/s

加速度:【r/s】转/秒
600 r/s

减速度:
1600 r/s  //  超过极限,没意义

加加速:
不清楚

计算时间:  路径 /  距离 = n秒完成
600/10= 60秒完成
或者 步进电机 140mm/s  计算出距离

CNC很重视精度,所以齿轮比一定要学会设置。伺服的齿轮比还涉及到编码器的位数,所以参考一圈脉冲当量。

从轴跟随:

  

【注:】所有轴控函数,要放在ecat线程内。 

新手先跳过。

主要分3大块:基础Basic,CNC,机械臂Robotic
//======================================
基础:
凸轮【耦合】        MC_CamIn
绑定凸轮表          MC_CamTableSelect
凸轮【解耦】        MC_CamOut
修正凸轮偏移        MC_Phasing
追剪               MC_GearInPos
获取凸轮从轴信息    SMC_GetCamSlaveSetPosition
获取当前挺杆输出值  SMC_GetTappetValue

位置【跟随】        SMC_FollowPosition    
位置速度【跟随】    SMC_FollowPositionVelocity    
速度【跟随】        SMC_FollowVelocity
可选项【跟随】      SMC_FollowSetValues    // 力矩,速度,位置,加减速等【跟随】
直接轴【跟随】      SMC_TrackAxis (FB)// 从轴要使能状态下
                        bExecute上升沿:开始执行功能块。
                        Velocity 最大速度[u/s]
                        Acceleration 最大加速度,单位为[u/s²]。
                        Deceleration 最大减速度,单位为【u/s²】。
                        Jerk    起跳速度,单位为【u/s³】。

//========================================
CNC:
这个是用于轴组。比如CNC或机械臂还有3轴机械臂等。【也用于机器跟随主轴脉冲】
使用轴组方便减少代码,直接绑定实轴的话,后期改伺服品牌改动的多。
绑定虚轴,能方便调试。
SMC_ControlAxisByPos (FB)    //跟随位置 、、、SM_Drive_Virtual_1.fSetPosition
SMC_ControlAxisByPosVel (FB) //跟随速度和位置
SMC_ControlAxisByVel (FB)    //跟随速度
注:iStatus 用 IPO_ACCEL 
    bEnable 为 True

SMC_INT_STATUS (ENUM)
0 IPO_UNKNOWN:SMC_Interpolator完全通过后可能不会出现的内部状态。
1 IPO_INIT:初始化状态;运动尚未开始
2 IPO_ACCEL:插值正在进行;当前正在加速
3 IPO_CONSTANT:以恒定速度进行插值
4 IPO_DECEL:插值正在进行;当前正在减速
5 IPO_FINISHED:插值完成
6 IPO_WAIT:插值正在进行;当前正在等待,例如通过停止输入或M命令
7 IPO_INCREASING_ACCEL:插值正在进行;目前正在加速
8 IPO_DECREASING_ACCEL:插值正在进行;当前正在降低加速度
9 IPO_INCREASING_DECEL:插值正在进行;目前正在加速减速
10IPO_DECREASING_DECEL:插值正在进行;目前正在减速

//========================================
【robotic库函数】

轴组中断        GroupInterrupt
轴组中断条件    SMC_GroupInterruptAt (FB)
轴组中断位置    SMC_GroupInterruptPosition (UNION)
                    SMC_GroupInterruptPositionMvtRel (STRUCT)
轴组继续        MC_GroupContinue (FB)
轴组暂停        MC_GroupHalt (FB)
轴组中断        MC_GroupInterrupt (FB)
轴组停止        MC_GroupStop (FB)
循环绝对运动    MC_MoveCircularAbsolute (FB)
循环相对运动    MC_MoveCircularRelative (FB)
直接绝对运动    MC_MoveDirectAbsolute (FB)
直接相对运动    MC_MoveDirectRelative (FB)
线性绝对运动    MC_MoveLinearAbsolute (FB)
线性相对运动    MC_MoveLinearRelative (FB)
错误恢复        SMC_GroupEnableResumeAfterError (FB)
//SMC_GroupJog (FB)
点动            SMC_GroupJog2 (FB)
更新数据        SMC_GroupUpdateContinueData (FB)
等待            SMC_GroupWait (FB)
//=============================================
MC_AddAxisToGroup (FB)
轴组关闭        MC_GroupDisable (FB)
轴组使能        MC_GroupEnable (FB)        【第2步】
轴组复位        MC_GroupReset (FB)
轴组设置位置    MC_GroupSetPosition (FB)
MC_RemoveAxisFromGroup (FB)
MC_UngroupAllAxes (FB)
SMC_DynLoad (STRUCT)
轴组上电        SMC_GroupPower (FB)        【第1步】
SMC_GroupReadTool (FB)
SMC_GroupSaveContinueData (FB)
SMC_GroupSetLoad (FB)
SMC_GroupSetPathTolerance (FB)
SMC_GroupSetTool (FB)
SMC_GroupSetUnits (FB)
SMC_GroupUnits (STRUCT)

调试:

 

第一个是显示数字的长度。

第二个是显示字符的长度。 

注:点动等功能块必须运行在ECAT线程下。

 

 圆盘的加载方法:  【可视化工具箱】》【基本的】》【Frame】

添加其他可视化控件也是如此。          vc: VisuStruct3DControl;

常用块: 

重新启动轴:    SMC3_ReinitDrive
读电机位置:  MC_ReadActualPosition
绝对定位:    MC_MoveAbsolute
编码器清零:    HC_PresetValue
编码器设位置:    HC_Counter
编码器虚轴.diEncoderPosition



速度:

Velocity:= 131072 * 2000 / 60, 

速度设定值 = 单圈脉冲数  x  转速  /  60秒 

速度:60FF
加速:6083
减速:6084
最大速度:607F
到速阀值:606D
到时阀值:606E //达到速度时间
零速阀值:606F
到时阀值:6070 // 零速时间
最大加速:60C5
最大减速:60C6


编码器:6063
齿轮比:6091 【汇川】
当前坐标:6064
当前速度:606C

//6040-b8停止   0x10F 》0x0F  //电机使能后,Bit8下降沿再触发一次即可开始运行

【转速】一个导程值,为1秒1圈。
每分钟转数【/】60【x】导程

定位:

目标位置:607A
起跳速度:6081
加速:6083
减速:6084

编码器位置:6063
齿轮比:6091
当前坐标:6064

//6040-b4触发  b5立即 b6绝对相对  b8停止
b5:0非立即:  0x4F--0x5F(相对位置)/0xF--0x1F(绝对位置)
    1立即:    0x6F--0x7f(相对位置)/0x2F--0x3F(绝对位置)

b6:0绝对,1相对

b8:上升沿   0x10F

力矩:

<think>嗯,用户之前问过GD32F4连接LAN9253使用LocalBus的问题,现在又问HC32F4A0用EXCA总线连接LAN9253。看来他们在开发基于不同MCU的EtherCAT从站,可能是在做工业控制相关的项目,需要实现EtherCAT通信。 首先,我需要确认EXCA总线是什么。华大的HC32F4A0的EXCA应该是类似FSMC的外部存储器控制器,用于连接外部设备,比如LAN9253这样的EtherCAT芯片。用户可能对华大的EXCA不太熟悉,所以需要详细说明配置步骤。 然后,用户之前已经了解了GD32F4的LocalBus连接,现在切换到HC32F4A0,可能需要对比两者的不同,但重点还是在如何配置EXCA。需要查证HC32F4A0的手册,确认EXCA的寄存器配置、时序设置等。 接下来,硬件连接部分。需要确定EXCA支持的接口类型,数据宽度,地址线分配。LAN9253通常使用16位异步并行接口,所以需要配置EXCA为16位数据总线,并正确连接地址线和控制信号,如CS、WR、RD等。 软件配置方面,要初始化EXCA控制器,设置时序参数,如地址建立时间、数据保持时间等,确保满足LAN9253的时序要求。然后实现寄存器的读写函数,可能需要通过指针访问映射的地址。 此外,LAN9253的初始化流程也很重要,包括复位、验证设备ID、配置工作模式等。需要确保中断配置正确,以便处理LAN9253的中断事件。 用户可能需要具体的代码示例,特别是针对华大芯片的EXCA配置,因为不同厂商的库函数可能不同。需要参考华大的例程和手册,提供正确的寄存器配置代码。 调试部分,用户可能会遇到时序问题或连接错误,建议使用逻辑分析仪检查信号,并先读取设备ID验证通信是否正常。可能还需要注意地址对齐和字节序的问题。 总之,用户需要一个详细的步骤指南,涵盖硬件连接、EXCA配置、初始化代码和调试技巧,确保他们能够顺利实现HC32F4A0与LAN9253的通信。同时需要指出华大和海思芯片在配置上的不同点,避免混淆。</think>在HC32F4A0微控制器通过EXCA总线连接LAN9253 EtherCAT从站控制器的实现中,需重点关注**总线接口配置**、**时序匹配**和**中断处理机制**。以下是具体实施方案: --- ### 一、硬件设计要点 #### 1. EXCA总线特性 - HC32F4A0的EXCA(External Controller Interface)支持8/16位异步并行总线 - 典型应用模式:SRAM/NOR Flash接口模式 - **关键信号对接**: ```markdown EXCA信号 LAN9253信号 EXCA_D0-D15 -> HD0-HD15 (16-bit模式) EXCA_A0-Ax -> HA0-HAx (地址线数量由寻址空间决定) EXCA_nRD -> HRD# (读使能) EXCA_nWR -> HWR#/HDS# (写使能) EXCA_nCS -> HCS# (片选) EXCA_WAIT -> HWAIT# (等待信号,可选) ``` #### 2. 物理层连接示例 ```c /* HC32F4A0引脚分配示例(Port E配置)*/ // 数据总线:PE0-PE15 -> HD0-HD15 // 地址总线:PF0-PF5 -> HA0-HA5 // 控制信号: // EXCA_CS0 (PG8) -> HCS# // EXCA_nRD (PG9) -> HRD# // EXCA_nWR (PG10) -> HWR# // 中断信号:LAN9253_INT# -> PH2 (EXTI2) ``` --- ### 二、EXCA控制器配置 #### 1. 总线模式配置(16-bit异步模式) ```c void EXCA_Config(void) { stc_exca_async_sram_init_t sramInit; // 通用配置 sramInit.enDataWidth = EXCA_DATAWIDTH_16BIT; // 16位总线 sramInit.enAddrMode = EXCA_ADDR_MODE_ADDRDATA_MUX; // 非复用模式 sramInit.enWaitSignal = EXCA_WAIT_SIGNAL_DISABLE; // 不使用等待信号 // 时序参数(单位:HCLK周期) sramInit.stcTimingConfig.u8AddrSetupTime = 2; // tAS sramInit.stcTimingConfig.u8AddrHoldTime = 1; // tAH sramInit.stcTimingConfig.u8DataSetupTime = 3; // tDS sramInit.stcTimingConfig.u8DataHoldTime = 1; // tDH EXCA_AsyncSramInit(EXCA_CH0, &sramInit); // 初始化通道0 EXCA_Cmd(EXCA_CH0, ENABLE); // 使能EXCA } ``` #### 2. 地址映射设置 ```c // EXCA存储区域配置 #define LAN9253_BASE_ADDR (0x68000000) // EXCA Bank0起始地址 #define REG_ADDR(offset) (*(volatile uint16_t*)(LAN9253_BASE_ADDR + (offset << 1))) ``` --- ### 三、寄存器访问驱动 #### 1. 基础读写函数 ```c // 写寄存器(16位) void LAN9253_WriteReg(uint16_t u16RegAddr, uint16_t u16Data) { REG_ADDR(u16RegAddr) = u16Data; __DSB(); // 内存屏障保证写入完成 } // 读寄存器(16位) uint16_t LAN9253_ReadReg(uint16_t u16RegAddr) { return REG_ADDR(u16RegAddr); } ``` #### 2. 32位寄存器操作 ```c uint32_t LAN9253_ReadReg32(uint16_t u16RegAddr) { uint32_t u32Data; u32Data = LAN9253_ReadReg(u16RegAddr); u32Data |= (uint32_t)LAN9253_ReadReg(u16RegAddr + 1) << 16; return u32Data; } ``` --- ### 四、初始化流程 #### 1. 硬件复位序列 ```c void LAN9253_HW_Reset(void) { // 控制复位引脚 GPIO_WritePin(LAN9253_RST_PORT, LAN9253_RST_PIN, PIN_LOW); DDL_DelayMS(10); GPIO_WritePin(LAN9253_RST_PORT, LAN9253_RST_PIN, PIN_HIGH); DDL_DelayMS(100); // 等待稳定 } ``` #### 2. 总线接口验证 ```c bool LAN9253_CheckID(void) { uint32_t u32ChipID = LAN9253_ReadReg32(0x30); return (u32ChipID == 0x92533003); // 验证芯片ID } ``` --- ### 五、中断配置 #### 1. EXTI中断初始化 ```c void EXTI_Config(void) { stc_exti_config_t stcExtiConf; // 配置PH2为下降沿触发 EXTI_StructInit(&stcExtiConf); stcExtiConf.enExitCh = EXTI_CH02; stcExtiConf.enExtiLvl = EXTI_FALLING_EDGE; EXTI_Init(&stcExtiConf); // NVIC配置 NVIC_ClearPendingIRQ(EXTI02_IRQn); NVIC_SetPriority(EXTI02_IRQn, 0); NVIC_EnableIRQ(EXTI02_IRQn); } ``` #### 2. 中断服务例程 ```c void EXTI02_IRQHandler(void) { if(EXTI_GetIntStatus(EXTI_CH02)) { // 处理LAN9253中断 uint16_t u16IrqStatus = LAN9253_ReadReg(ECAT_IRQ_STATUS); /* 清除中断标志 */ EXTI_ClearIntStatus(EXTI_CH02); } } ``` --- ### 六、调试建议 1. **示波器检查点**: - 测量HCS#下降沿与HWR#/HRD#的时序关系 - 验证地址建立时间(tAS > 15ns)和数据保持时间(tDH > 5ns) 2. **典型问题处理**: - **数据错位**:检查地址线偏移量(16位模式下HA0对应EXCA_A1) - **总线冲突**:确认未访问时数据总线处于高阻态 - **中断不触发**:检查LAN9253的INT#引脚上拉电阻配置 --- ### 七、关键文档 1. 《HC32F4A0用户手册》EXCA控制器章节 2. 《LAN9253 Technical Reference Manual》Section 5.2 Host Bus Timing 3. 华大官方应用笔记:AN0821 - EXCA接口配置指南 实际开发时建议通过`__attribute__((section(".exca")))`将LAN9253访问代码定位到紧耦合内存(TCM)以提高时序稳定性。建议先使用示波器捕获总线波形,确认满足LAN9253的时序参数要求后再进行协议栈集成。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值