你好
我需要执行驱动程序,以根据曲柄和凸轮信号相位启动喷油和点火装置。
我需要了解实施该驱动程序的最佳解决方案是什么。
我的疑问是
1) AN4907SW.zip 提供的 API 是否与 S32K3xx 中的 eTPU 兼容?
2)如果不是,那么将此 API 用于 S32K3xx 是一个好的解决方案,还是使用 ConfigTool 才是最佳解决方案?
S32K3xx 有关于此应用的示例吗?
敬请期待,弗朗切斯科。
将数据从大端转换为小端序涉及通过根据数据类型大小调整位移和掩码来反转字节顺序。
GCC 提供了内置函数来简化这个过程,例如:uint32_t __builtin_bswap32 (uint32_t x)。你可以在 GCC 文档中找到更多细节:7.2.3 字节交换内置函数
你好@VaneB、
如果我理解得不错,汽车功能(CRANK、SPARK......)是为大位微控制器设计的。
要在 S32K364(小二进制)上使用带有汽车功能的 eTPU,我需要下载一个功能集,选择 .NET 和 .NET:
francescovico_0-1761136257258.pngfrancescovico_0-1761136257258.png
并更改功能:
uint32_t *fs_memcpy32(uint32_t *dest,uint32_t *source,uint32_t size);
void fs_memset32(uint32_t *start,uint32_t value,int32_t size);
交换每个 32 位的值,以读取/写入小端代码和参数,是这样吗?
敬请期待,弗朗切斯科。
用于电气化应用的 S32K39/37/36 微控制器包括 eTPU。但是,目前没有适用于这些设备的与 MPC5634 的 AN4907 相似的专用文档或演示。
也就是说,AN4907 文档、演示和微码适用于 S32K39/37/36 系列,但请注意,这些设备使用小端架构。因此,您需要修改内存访问 API。
您可以参考 CodeWarrior eTPU 功能选择器 中与电机控制相关的模块,该功能 选择器 已更新为 little-endian。
BR、VaneB
感谢您指出这一点!
这是个endianity转换问题。因此,缺齿掩模的配置不正确,每转 350 度,每周期 700 度。
现在,原帖中的演示程序已经修复。
你好@MilanBrejl、
现在,我正在尝试使用 Fuel Cyl 1 etpu 驱动程序。
驱动程序似乎使用 s24AngleNormalEnd 作为"的起始角度" ,并在 s24AngleStop 停止注入。
u24InjectionTime 的持续时间永远不会被遵守。
有可能吗?
附件中有一个 .rar 文件该文件包含"燃料缸 1" 的 picoscope 采集信息,其中喷油器参数为:
Etpu_Fuel_Ip_ConfigType fuel_1_config =
{
.s24AngleNormalEnd= DEG2TCR2(-180),
.s24AngleStop= DEG2TCR2(-360),
.s24AngleOffsetRecalc= DEG2TCR2(-30),
.u24InjectionTime= USEC2TCR1(1200),
.u24CompensationTime= USEC2TCR1(0),
.u24InjectionTimeMinimum= USEC2TCR1(0),
.u24OffTimeMinimum= USEC2TCR1(0),
.eGenerationDisable= etpu_fuel_generation_allowed
};
在 picoscope 采集器中,可以看到注入开始点正好是 180°,注入停止点是 360°,注入持续时间为 30 毫秒(应为 1.2 毫秒)。
敬请期待,弗朗切斯科。
你好@MilanBrejl、
现在,我正在尝试使用 Fuel Cyl 1 etpu 驱动程序。
驱动程序似乎使用s24AngleNormalEnd 作为"的起始角度" ,并在 s24AngleStop 停止所有注入。
u24InjectionTime 的持续时间永远不会被遵守。
有可能吗?
附件中有一个 .rar 文件文件,其中包含喷油器参数所在的"燃油 1 缸" 的 picoscope 采集结果:
Etpu_Fuel_Ip_ConfigType fuel_1_config =
{
.s24AngleNormalEnd= DEG2TCR2(-180),
.s24AngleStop= DEG2TCR2(-360),
.s24AngleOffsetRecalc= DEG2TCR2(-30),
.u24InjectionTime= USEC2TCR1(1200),
.u24CompensationTime= USEC2TCR1(0),
.u24InjectionTimeMinimum= USEC2TCR1(0),
.u24OffTimeMinimum= USEC2TCR1(0),
.eGenerationDisable= etpu_fuel_generation_allowed
};
在 picoscope 采集器中,可以看到注入开始点正好是 180°,注入停止点是 360°,注入持续时间为 30 毫秒(应为 1.2 毫秒)。
敬请期待,弗朗切斯科。
你好@MilanBrejl、
你说得没错,s24AngleOffsetRecalc 必须是正数,但要把它放进去:
s24AngleOffsetRecalc = DEG2TCR2(30)
结果还是一样(......)。
我使用的 S32K364 有 2 个 ETPU(A 和 B),共 16 个通道。
在 ETPUA 上使用燃料驱动程序,驱动程序工作正常,但我需要使用 ETPUB 通道 0。
我需要使用 STAC 寄存器将 TCR1 和 TCR2 从 ETPUA 共享到 ETPUB。
可能是 STAC 寄存器没有正确初始化?
敬请期待,弗朗切斯科。
你好@francescovico,
这是如何配置 STAC_ENG1 和 STAC_ENG2 寄存器,以便从 eTPU1 到 eTPU2 共享 TCR1 和 TCR2:
MilanBrejl_0-1770199430269.pngMilanBrejl_0-1770199430269.png
如果有帮助,请告诉我。
致:
Milan
你好@MilanBrejl、
我的注册表与您的建议完全相同:
ETPU_A_B_REGISTER.pngETPU_A_B_REGISTER.png
但问题依然存在。
在所附的皮镜采集中,您可以看到 ETPU A 产生的火花为蓝色,ETPU B 产生的火花为红色。
两个火花的端角都是 180 度,停留时间都是 8000 秒。
敬请期待,弗朗切斯科。
你好,@francescovico、
我在我的网站上复制了你的问题,并找到了根本原因。在两个 eTPU 引擎之间共享 TCR1/TCR2 时间/角度总线是不够的。火花和燃油功能根据发动机的实际转速进行时间到角度的转换。它使用 TRR(跳动速率寄存器)。该寄存器是角度时钟逻辑的一部分,由运行在 eTPU A 上的 Crank eTPU 功能维护。然后,使用 eTPU B TRR 对 eTPU B 进行时间到角度的变换会返回错误的结果。
这是最基本的问题,我可能从未见过有人同时在两个 eTPU 引擎上运行引擎控制,因此这个问题一直没有得到解决。尤其是在新的 S32K3 设备仅限于 16+16 个通道的情况下,这一点变得很重要。感谢您提出这个用例,也感谢您的耐心。
所附的演示程序以之前的程序(在本主题中)为基础,并增加了以下改动:
其中MilanBrejl_3-1770673103441.pngMilanBrejl_3-1770673103441.png
希望对您有所帮助。
致:
Milan
你好@MilanBrejl、
现在它工作得很好。
非常感谢你们的支持!
敬请期待,弗朗切斯科。
您好,我也在研究k396的板子,也想将etpu用于曲轴凸轮轴和喷油,我们可以交流一下嘛
我目前正在开发基于S32K396芯片的V12 ECU项目。
第一个原型我将使用 lqfp176 封装,很高兴看到这个项目也是用这种封装编写的。我想请问一下,是否有办法为 crank_instance 添加更多链接通道?
Etpu_Crank_Ip_InstanceType 曲柄实例=
{
.u8ChanNum = ETPU_CRANK_CHAN ,
.u8OtherEngChanNum = ETPU_CRANK_OTHER_ENG_CHAN ,
. ePriority = ETPU_PRIORITY_HIGH ,
. ePolarity = ETPU_CRANK_IP_POLARITY_FALLING ,
.u8TeethTillGap = TEETH_TILL_GAP ,
.u8TeethInGap = TEETH_IN_GAP ,
.u8TeethPerCycle = TEETH_PER_CYCLE ,
. u24Tcr2TicksPerTooth = TCR2_TICKS_PER_TOOTH ,
.u24Tcr2TicksPerAddTooth = 0 ,
.eLogToothPeriods = ETPU_CRANK_IP_LOG_TOOTH_PERIODS_ON ,
.u32LinkCam = ( ( ETPU_IP_CHANNEL_TO_LINK ( ETPU_CAM_CHAN ) << 0 ) +
( ETPU_IP_CHANNEL_TO_LINK ( ETPU_CAM_CHAN ) << 8 ) +
( ETPU_IP_CHANNEL_TO_LINK ( ETPU_CAM_CHAN ) << 16 ) +
( ETPU_IP_CHANNEL_TO_LINK ( ETPU_CAM_CHAN ) << 24 ) )
.u32Link1 = ( ( ETPU_IP_CHANNEL_TO_LINK ( ETPU_SPARK_1_CHAN ) << 0 ) +
( ETPU_IP_CHANNEL_TO_LINK ( ETPU_SPARK_2_CHAN ) << 8 ) +
( ETPU_IP_CHANNEL_TO_LINK ( ETPU_SPARK_3_CHAN ) << 16 ) +
( ETPU_IP_CHANNEL_TO_LINK ( ETPU_SPARK_4_CHAN ) << 24 )) ,
.u32Link2 = ( ( ETPU_IP_CHANNEL_TO_LINK ( ETPU_FUEL_1_CHAN ) << 0 ) +
( ETPU_IP_CHANNEL_TO_LINK ( ETPU_FUEL_2_CHAN ) << 8 ) +
( ETPU_IP_CHANNEL_TO_LINK ( ETPU_FUEL_3_CHAN ) << 16 ) +
( ETPU_IP_CHANNEL_TO_LINK ( ETPU_FUEL_4_CHAN ) << 24 )) ,
.u32Link3 = ( ( ETPU_IP_CHANNEL_TO_LINK ( ETPU_KNOCK_1_CHAN ) << 0 ) +
( ETPU_IP_CHANNEL_TO_LINK ( ETPU_KNOCK_2_CHAN ) << 8 ) +
( ETPU_IP_CHANNEL_TO_LINK ( ETPU_INJ_BANK_1_CHAN ) << 16 ) +
( ETPU_IP_CHANNEL_TO_LINK ( ETPU_INJ_BANK_2_CHAN ) << 24 )) ,
.u32Link4 = ( ( ETPU_IP_CHANNEL_TO_LINK ( ETPU_INJ_1_CHAN ) << 0 ) +
( ETPU_IP_CHANNEL_TO_LINK ( ETPU_INJ_2_CHAN ) << 8 ) +
( ETPU_IP_CHANNEL_TO_LINK ( ETPU_INJ_3_CHAN ) << 16 ) +
( ETPU_IP_CHANNEL_TO_LINK ( ETPU_INJ_4_CHAN ) << 24 ) )
.pCpba = NULL_PTR ,
. pCpbaToothPeriodLog = NULL_PTR
} ;
我想使用 eTPU 发动机 A 来实现 12 缸 DI、12 缸点火和曲轴、右侧进气凸轮轴、右侧排气凸轮轴,使用 eTPU 发动机 B 来实现 12 缸 PI 喷射和左侧凸轮轴。
或者 eTPU 发动机 A 适用于 6DI、6Ignition、6PI、Knock、RH CAMx2,eTPU 发动机 B 适用于 6DI、6Ignition、6PI、Knock、LH CAMx2。
但为此我还需要另外两个链接条目。我还没算上我可能还需要的其他东西呢。我需要WMI,也需要Nitro。我知道这是个大工程,但我真的非常感谢大家的帮助。
我是 eTPU 编程新手,对整个 NXP 生态系统也不熟悉。
感谢您的解答。
理查德