TIM采集PWM信号时100%和0%占空比检测方案探讨
一、背景在汽车电子领域GTMGeneric Timer Module的TIMTimer Input Module模块被广泛用于PWM信号的采集。TIM模块功能分为输入选择、输入滤波、信号处理、信号输出四个部分其核心功能可概括为两件事一是通过可配置的滤波机制滤除信号中的毛刺二是通过超时检测单元TDU监控信号是否在预期时间内出现。在实际应用中不可避免地需要检测PWM信号的100%占空比常高和0%占空比常低这两种极端情况。二、问题来源2.1 AUTOSAR规范的局限在AUTOSAR规范中TIM采集到的数据可以通过在中断内读取或者使用DMA传输出来。然而如果信号出现常高或常低的情况边沿触发中断不会进入DMA也不会传输数据因此无法根据采样值直接判断当前是100%还是0%占空比。AUTOSAR规范中没有对100%和0%占空比的处理规则这主要是因为AUTOSAR需要满足普遍性和可一致性——很多ICUInput Capture Unit硬件本身不包含100%和0%的检测单元。所以规范层面不强制要求是合理的设计选择。2.2 GTM TIM的优势英飞凌AURIX系列GTM的TIM模块内置了超时检测单元TDUTimeout Detection Unit可以用于检测信号边沿丢失即常高或常低的情况。但国芯的MCAL中全部使用的是标准代码默认没有启用这个功能需要在MCAL层面进行扩展开发。三、TDU超时检测方案3.1 核心寄存器说明TDU超时检测涉及以下几个关键寄存器寄存器功能说明TDUV设置超时寄存器的数值、对应的寄存器位数以及时钟源等TDUC超时计时器记录当前计数值ECTRL配置TDU的启动TDU_START、停止TDU_STOP和计数器复位TDU_RESYNCCTRL.TOCTRL使能超时检测配置触发边沿TDU的计数器最多可达24位由3个8位的slice级联而成。TDU slice0通过TCS时钟源进行递增计数slice1通过slice0的carry信号递加slice2通过slice1的carry信号递加。3.2 TDU_START启动模式TDU_START有多种配置模式其中最简单的一种是配置为0b000TDU_START_000_EVENT的定义每次向TIM[i]_CH[x]_CTRL.TOCTRL写入非0值无论当前TOCTRL为何值且TDU处于停止状态初始状态或被TDU_STOP事件停止时触发。该事件持续1个系统时钟周期。简单理解就是只要在停止状态设置了TOCTRLTDU就会启动而且只要TOCTRL ! 0TDU就一直运行。当然也可以配置为0b011等模式——只有先检测到特定边沿后才启动。但这种模式的问题是如果上电时就处于断线状态无信号TDU不会启动也就无法报出超时错误。3.3 TDU事件选择建议根据不同的超时检测需求TDU_START事件选择如下需求推荐配置理由PWM信号丢失/停止切换常规超时检测0b00(TDU_TIMEOUT_EVT)硬件自动根据24位级联配置决定超时点最通用需要产生周期极短微秒级的定时中断0b01(TDU_WORD_EVT)低8位计数最快可提供最高中断频率需要产生中等周期毫秒级的定时中断0b10(TDU_FRAME_EVT)利用中间8位无需额外配置预分频器需要产生长周期百毫秒/秒级的定时中断0b11(TDU_SAMPLE_EVT)高8位溢出最慢适合周期性采样任务3.4 代码实现示例以下代码在正常开启ICU采集之后添加亲测有效// 配置超时阈值24位可根据实际需求调整 GTM4.GLS[0].TIM.CH[1].TDUV.R 0x00FFFF; // 清除TDU_START、TDU_STOP、TDU_RESYNC配置位 GTM4.GLS[0].TIM.CH[1].ECTRL.R ~((0x7 8) | (0x7 12) | (0xF 16)); // 配置TOCTRL0b11使用F_OUT的下降沿触发超时检测 GTM4.GLS[0].TIM.CH[1].CTRL.R | (0x3UL 30); // 使能超时中断TODET_IRQ GTM4.GLS[0].TIM.CH[1].IRQ_EN.R | (1UL 4);超时中断使能后当信号长时间无有效边沿时会进入超时中断处理函数。3.5 100%与0%的区分方法需要注意的是TIM的中断处理函数中默认没有超时的处理逻辑仅有对标志位的清零操作。需要在超时中断中自行添加判断逻辑区分当前是100%还是0%占空比。主要有以下三种方法方法一通过Icu_GetInputLevel接口获取引脚电平状态这是最直接的方式通过MCAL的标准接口读取当前引脚电平高电平为100%低电平为0%。方法二读取TIM的INP_VAL寄存器直接读取硬件寄存器的当前输入电平值。不过MCAL没有对应的接口需要自行封装。方法三通过ECNT最低位判断最后一个边沿类型ECNT边沿计数器统计每个传入的滤波边沿上升沿和下降沿。可以通过ECNT的Bit 0来判断最后一次检测到的边沿类型ECNT Bit 0含义奇数最后一次检测到的是上升沿→ 当前电平为高100%占空比偶数最后一次检测到的是下降沿→ 当前电平为低0%占空比注意当下降沿计数为偶数而上升沿计数为奇数时ECNT从偶数变为奇数。利用这一特性可以准确判断最后一个边沿的类型。此外当前的MCAL配置无法配置出TDU的callback也无法在callback中进行处理。这种方式确实能节省MCU资源各有优劣。四、中断阻塞导致的数据错位问题4.1 问题现象在使用TIM采集PWM时如果中断被长时间阻塞例如被更高优先级的中断抢占可能会出现GPR0和GPR1的数据不匹配的情况。TIM模块中GPR0和GPR1的高8位是ECNT边沿计数器。ECNT用于检查GPR0和GPR1的数据一致性。只有GPRx中ECNT值相同时才表示两个寄存器之间的值是一致的。但在实际调试中可能会观察到ECNT差值远大于1的情况——这恰恰说明两个寄存器并非来自同一个完整的PWM周期而是发生了跨周期的数据混叠。但在实际使用中不会遇到这种问题因为周期和占空比是由硬件自动计算的而且GPR0和GPR1是同步更新的所以中断阻塞使占空比和周期不匹配的情况不成立。五、软件超时检测方案替代方案如果不采用TDU硬件方案也可以通过软件方式实现超时检测设置一个计数器可以是软件计数器也可以是STM定时器每次成功采集到有效边沿数据后将计数器清零当发现计数值大于1.5个信号周期时判定为超时此时根据上一次进入中断时的边沿类型判断当前是100%还是0%占空比5.1 两种方案对比对比项TDU硬件方案软件超时方案CPU负载低硬件自动处理较高需要定时查询或中断实时性高硬件级响应取决于软件轮询周期代码复杂度需要扩展MCAL应用层即可实现可维护性需修改底层代码应用层代码易于维护移植性依赖GTM硬件依赖通用定时器六、关于可变周期信号的思考一个值得探讨的问题如果采集的信号是可变周期如发动机转速信号超时阈值应当如何设置如果按照最大周期的1.5倍来设置超时阈值在信号频率变化范围较大时可能不太合适——周期短的信号需要更快的超时响应而周期长的信号则需要更长的容忍时间。一种可行的思路是动态更新TDUV的超时阈值根据最近几次测量的周期值自适应调整或者采用分级超时策略短超时用于快速检测长超时作为兜底这需要根据具体应用场景权衡设计。七、总结AUTOSAR规范未定义100%/0%占空比的处理规则这是由硬件差异性和规范普遍性决定的合理设计。英飞凌GTM TIM的TDU单元提供了硬件级超时检测能力可用于检测信号边沿丢失常高/常低但国芯MCAL默认未启用此功能。TDU方案的实现需要配置TDUV、ECTRL、CTRL.TOCTRL等寄存器并在超时中断中添加100%与0%的判别逻辑可通过Icu_GetInputLevel、INP_VAL寄存器或ECNT最低位判断。中断阻塞可能导致GPR0/GPR1数据错位需要通过ECNT一致性校验来识别并丢弃无效数据。硬件TDU方案与软件超时方案各有优劣前者CPU负载低但需修改MCAL后者实现简单但占用软件资源需根据项目需求权衡选择。可变周期信号的超时阈值设置是一个值得进一步研究的课题可能需要动态自适应策略。