# 模块设计

CddStp

Capir

版本 \main\0

批准

姓名 职责

已发布

已检查

Zhenxing He

软件开发者

已创建

变更历史

版本 日期 描述 作者

\main\0 2023/3/30 CddStp 模块初始版本 Zhenxing He

2024/12/6 为 HQC100-10 更新 Cddstp 功能 Zhenghao Wang

文件: MDDD_CddStp.md

模板版本 \main\0

目录

1 介绍 3

1.1 概述 3

1.2 本文档的质量保证 3

1.3 参考文献 3

2 模块架构设计 4

2.1 初始化配置 5

2.2 CddStp 接口 6

2.2.1 输入接口 6

2.2.2 输出接口 6

2.2.3 RTE 服务端口 6

2.2.4 非 RTE 接口 6

2.3 周期性任务执行流程 7

2.4 常量和宏 8

图表

图 1 - 架构 4

图 2 - 架构 7

表格

表 1 - 参考文献 3

表 2 - 初始化配置 5

## 介绍

### 概述

本文档描述了 AN1 HL Z01-Hh003 项目中 CddStp 模块的详细设计。它描述了计划的实现内容，并考虑了功能需求以及技术边界条件。

### 本文档的质量保证

本文档在发布前必须经过审查，按照"软件开发过程手册"([SWM])中描述的审查程序进行。

### 参考文献

参考文献 标题 作者

[SWM] 软件开发过程手册 R. Wüstenhagen

[document]

[document]

表 1 - 参考文献

## 模块架构设计

在本节中，描述了软件模块 CddStp 的功能。

各个功能被封装在不同的代码单元中，以促进模块化设计。各个代码单元之间的依赖关系如图 1 - 架构所示。

### 图 1 - 架构

在此架构中，CddStp 模块执行以下任务：

读取 ECU 的状态，如果状态正常则进行下一步操作。

从 IoHwAbUser 读取电压值，如果电压值过低或过高，电机将停止运动。

从 Rsens 读取温度值并从寄存器读取温度错误状态，使用这些信息执行诊断操作。

通过 SPI 从寄存器读取电气错误以进行诊断操作。

如果读取到 RefRun 或 StpON/OFF 请求，CddStp 将使用 IoHwAbUser 的调用函数执行操作。

如果没有错误，则执行从 CtrlStp 发送的操作。

向 CtrlStp 发送状态信息

根据 IoHwAbUser_Set_DIO 控制 DC 步进。

### 初始化配置

CddStp_Init() 的初始化配置通过函数调用"void riCddStpInit()"执行。

此初始化函数在 ECU 启动时调用一次，并执行以下任务：

将所有变量初始化为默认值。

获取编码和 EFT 的状态，获取 ECU 的状态。

初始化步进硬件，设置 LWR 步进驱动器的方向引脚

总共定义和实现了以下初始化项：

函数调用 含义

CddStp88XX_Init() 将 CddStp 模块的所有变量初始化为默认值。

CddStp88XX_GetState() 使用 CddStp88XX_aStpState[ucIx] 更新 CddStp_ActAll 并获取编码和 EFT 的状态。

CddStp_Write2RTE() 将 'CddStp_ActAll' 写入 RTE - 在函数 'CddStp88XX_GetState' 中更新（通过使用 CddStp88XX_aStpState[]）

CddStpVolt_IoHwAbUser_GetECUSupply 从 IoHwAbUser 模块获取电压。

IoHwAbUser_SetDirLwr() 设置 LWR 步进驱动器的方向引脚

IoHwAbUser_SetDIO_S2_PTD05() 设置 IO PD5 用于 DC 步进控制

IoHwAbUser_SetDIO_S1_PTD06() 设置 IO PD6 用于 DC 步进控制

IoHwAbUser_SetDIO_S3_PTD11() 设置 IO PD11 用于 DC 步进控制

表 2 - 初始化配置

### CddStp 接口

#### 输入接口

模块使用的输入在头文件"Rte_ctadCddStp.h"中声明。

Rte_Read_ppareRSensPcbTemperature0_lActual

使用以下 RTE 端口原型获取 PCB 温度。

Rte_Read_ppareCtrlStpTarget0_StpTargetValues

从 CtrlStp 获取步进电机的目标位置。

Rte_Read_ppareCodMCodingDataStatus0_eCompleteCodingDataStatus.

获取编码参数的实际状态。

#### 输出接口

对其他模块的输出在"Rte_ctadCddStp.h"中声明。

Rte_Write_ppaseCddStpActual0_sStpActualValues

将步进电机的实际状态、速度和位置传递给 CtrlStp。

#### RTE 服务端口

Rte_Call_ppaclCddStpRefRunReq_StartRefRun

提供特定类型的 RTE 服务端口原型以接受参考运行请求。

Rte_Call_ppaclCddStpOnOffReq_StpOff

Rte_Call_ppaclCddStpOnOffReq_StpOn

提供特定类型的 RTE 服务端口原型以接受开关请求。

#### 非 RTE 接口

CDDSTP_EftDataValid

此接口用于获取 EFT 信息是否有效。

CDDSTP_ECUVARCFG_ucDrvType

此接口用于获取 EFT 信息。

IoHwAbUser_GetMountingSide

此接口用于获取安装侧信息。

IoHwAbUser_GetECUSupply

此接口用于获取 KL30 电压以确定电压过压和欠压。

### 周期性任务执行流程

CddStp 周期性任务每 10ms 调用一次（调用："rpCddStp_Cycle0()"）。

周期由操作系统执行。

在周期性任务期间执行的操作如下。图 2 - 架构

### 图 2 - 架构

更新图片，增加 IO 控制，调整 Cddstp 内描述内容

当 8.6V<ECUSupplyVoltage <19.7V 时，步进电压状态正常

当 ECUSupplyVoltage<8.6V 时，步进电压状态为欠压，步进将被冻结直到电压恢复正常

（如果电压<7.6V，当电压恢复正常时步进应该进行参考运行）

当 ECUSupplyVoltage >19.7V 时，步进电压状态为过压，步进将被冻结直到电压恢复正常

此函数从 RTE 读取每个步进的请求位置和参考请求。它计算它们并存储在数据镜像中。

当 CddStp 从 CtrlStp 获取步进开关/关闭请求时，CddStp 将调用 IoHwAbUser 进行开关操作。

CddStp 从数据镜像读取通过 SPI 最后接收的状态并将状态写入 RTE。

当与 LWR 步进驱动器的 SPI 通信存在缺陷时，应用程序应向 CtrlStp 发送 CddStp_ActAll.sLwrActual.sStatusError.bfStpFaultStatus = 1。

当 OTS 位（DIAG 状态 2 寄存器的第 5 位）被设置时，应用程序应向 CtrlStp 发送 CddStp_ActAll.sLwrActual.sStatusError.bfStpFaultStatus = 64。

当 OCP 位被设置时，应用程序应向 CtrlStp 发送 CddStp_ActAll.sLwrActual.sStatusError.bfStpFaultStatus = 16。

当 OL 位被设置至少 COD_LWR_FEHLERZAEHLER * 10 ms 时，应用程序应向 CtrlStp 发送 CddStp_ActAll.sLwrActual.sStatusError.bfStpFaultStatus = 8。

当电气错误被清除时，CddStp 还将通过 SPI 清除寄存器中的错误位。

### 常量和宏

CddStp 模块中使用的常量和宏。

CddStp88XX_eDemEType_OL                  = 0,    - 开路 (ErrElecOL)

CddStp88XX_eDemEType_SC,                 = 1     - 短路 (pIsSCCntMax & ErrElecSC)

CddStp88XX_eDemEType_Driver,             = 2     - 步进驱动器缺陷

CddStp88XX_eDemEType_Pos,                = 3     - 位置错误

CddStp88XX_eDemEType_TempSD,        = 4     - 热关断 (OTS / ErrTherm)

CddStp88XX_eDemEType_TempWarn,    = 5     - 热警告信息

CddStp88XX_eDemEType_RefUVolt,       = 6     - 欠压 (SysVoltOff)参考运行时

CddStp88XX_eDemEType_MoveUVolt,    = 7     - 欠压 (SysVoltUnder)移动时

CddStp88XX_eDemEType_MoveOvVolt,  = 8     - 因过压中断运行 (SysVoltOver)

CddStp88XX_eMaxDemEType                  = 9

CddStp 的运行状态：

CddStp88XX_eStateInit              = 0,  // 必须为 0 (初始值)

CddStp88XX_eStateOff,             = 1

CddStp88XX_eStateStby,          = 2

CddStp88XX_eStateIdle,           =3

CddStp88XX_eStateMove,        = 4

CddStp88XX_eStateRef1,         = 5

CddStp88XX_eStateRef2,         = 6

CddStp88XX_eStateRefWait,    = 7

CddStp88XX_eStateTestStep,  = 8

CddStp88XX_eStateErr,           = 9

CddStp88XX_eMaxStates        = 10 // 状态数量 = 状态机表的结束状态

CddStp 的温度状态：

CddStp88XX_eStateTempInit         = 0,  // 必须为 0 (初始值)

CddStp88XX_eStateTempNorm,    = 1

CddStp88XX_eStateTempLow,      = 2

CddStp88XX_eStateTempHigh,     = 3

CddStp88XX_eMaxStatesTemp     = 4 // 状态数量 = 状态机表的结束状态

CddStp 的电压状态：

eInit   = 0,                   电压的初始状态

eLow3   = 1,               电压小于 7.6V 时的状态

eLow2   = 2,               电压小于 8.6V 时的状态

eLow1   = 3,               电压小于 7.6V 时的状态

eNormal = 4,              电压在 9.6V 和 18.7V 之间时的状态

eHigh1  = 5,               电压大于 18.7V 时的状态

eHigh2  = 6                电压大于 19.7V 时的状态

#define CDDSTP88XX_WaitVoltage_FTimer     FT_MSEC(300u) 

// 电压超出范围变化或电压过低/过高时电压切换消抖的时间 [ms]

#define CDDSTP88XX_WaitStabilize_FTimer   FT_MSEC(39u)  

// 从 OffState 或 StandbyState 转换到 IdleState 时稳定步进转子所需的时间 [ms]

#define CDDSTP88XX_WaitErrInh_FTimer      FT_MSEC(50u)  

// ErrInh 状态消息位负斜沿后设定的时间持续时间 [ms]

#define CDDSTP88XX_WaitSRegAll_FTimer     FT_MSEC(15u)  

// 检查所有状态寄存器以检测 OL 或 SC 错误的时间

#define CDDSTP88XX_WaitOLCheck_FTimer     FT_MSEC(35u)  

// 检测 OL 错误的时间

#define CDDSTP88XX_PosIgnoreMissingPsensP (256)         

// Sref 参考运行失败后的实际位置 // * Sref 参考运行使用 Psens *

#define CDDSTP88XX_PosIgnoreMissingPsensN (-512)       

// Sref 参考运行失败后的实际位置 // * Sref 参考运行使用 Psens *

#define CDDSTP88XX_ErrVoltHiLimitSCCntMax (3u)          

// 移动过程中出现 ErrVoltHiLimit 和 SC 时 StateOff 连续变化的最大计数

#define CDDSTP88XX_TickMax                (0x7000FFFFu) 

// 最大快速计时器 FTimer 滴答数以避免计算溢出（值小于 0x7FFFFFFF）

#define CDDSTP88XX_SReg3MspHsMask         (0x70u)       

// DRV8899 状态寄存器 RX 内容 (MSP) 的掩码，用于抑制校验位，TestStep 的 MSP 偏移以仅使用半步值（MSP 复位值 0x10 +/- TestStep 0x04 = 0 HS 时为 0x14/0x0C，1 HS 时为 0x24/0x1C，2 HS 时为 0x34/0x2C，3 HS 时为 0x44/0x3C，4 HS 时为 0x54/0x4C，5 HS 时为 0x64/0x5C，6 HS 时为 0x74/0x6C，7 HS 时为 0x04/0x7C）

#define CDDSTP88XX_SReg3Msp2MsCnt         (0x08u)      

// 从 DRV8899 状态寄存器 RX 内容 (MSP) 减去的 2 微步计数，以在两个编码方向 (biRichtung = 0/1) 中获得相同的 HS 值：复位值 0 HS 时为 0x0C/0x04，1 HS 时为 0x1C/0x14，2 HS 时为 0x2C/0x24，3 HS 时为 0x3C/0x34，4 HS 时为 0x4C/0x44，5 HS 时为 0x5C/0x54，6 HS 时为 0x6C/0x64，7 HS 时为 0x7C/0x74

#define CDDSTP88XX_HsPerCycleMask         (0x0007)      

// 获取每周期模 8 HS 计数的掩码

#define CDDSTP88XX_NegRefCntMask          (0xFFF8)      

// 在负参考 HS 计数情况下获取模 8 HS 计数更大的掩码，因为每周期 8 个 HS

#define CDDSTP88XX_ACTPOSMEMCNT_MAX       (30u) /*10u*/ 

// 在状态 Move、Ref1、Ref2 中任务调用 (CDDSTP_SamplingTime) 的最大计数，实际位置无变化以避免挂起，以防 CddStp8899_HalStp 状态机在 StateStep 中挂起，因为计时器 INT 不匹配是 Move、Ref1、Ref2 的一部分（注意 Cod_LwrVorbestZeit()、Cod_LwrHsZeitUmkehr()、Cod_NachbestZeit() 的最大值）！CddStp_HalStp 被重置，如果是 Ref1/2：CddStpDyn 被初始化！

#define CDDSTP88XX_REF1ERRPSENS_MAX       (1u)          

// Ref1 伪 ErrPsens 的最大计数

#define CDDSTP88XX_WRONGREF1POSBEFORE     (10)          

// Ref1 阶段完成前 10 HS 以避免伪 ErrPsens