一文了解基于AUTOSAR的ECU传感器信号处理全流程
汽车ECU的功能可以简单描述为:感知、控制和执行,即采集传感器信号、与其他ECU交互信息、通过一系列控制策略和算法,最终决策出如何控制执行器。当然这个过程是非常复杂,以采集传感器信号来说,会涉及软件与硬件的复杂处理,就如下图示意。
本文就以传感器模拟信号采集到应用层最终使用为例,来介绍基于AUTOSAR的ECU软件采集信号过程,即先后需要经历 硬件信号处理 → 底层软件驱动配置 → RTE接口配置 → 应用层逻辑处理与应用这几个步骤。
下面我们就开始详细介绍:
1 硬件处理阶段:从物理信号到数字量
1)ECU硬件电路的处理
对于大多数输入给微控制器的传感器信号,首先都需要进行信号调理。传感器感知到物理环境的变化,传感器会产生模拟量的原始信号,比如电压。通常需要进行放大和滤波。
-
放大:传感器输出的模拟信号通常较微弱,需要通过放大电路将其放大到适合微控制器处理的幅度。比如压力传感器输出的信号可能只有几毫伏,通过放大电路可以将其放大到几伏的范围。
-
滤波:传感器输出的模拟信号中可能包含噪声和干扰,需要通过滤波电路去除这些不需要的成分,提高信号的质量。常见的滤波电路有低通滤波器和高通滤波器等,比如RC低通滤波。
source: https://www.gkket.com/html/gkwk/cgq/202111/00000085.html
另外也需要考虑硬件保护,比如:
-
过压保护:传感器信号线可能受到过压冲击,需要通过过压保护电路来保护微控制器的输入引脚,比如采用齐纳二极管和瞬态电压抑制二极管(TVS)等。
-
过流保护:当传感器信号线发生短路或过载时,可能会产生过大的电流,需要通过过流保护电路来限制电流,保护微控制器和传感器。
除此之外,还需要考虑EMC(电磁兼容性)和EMI(电磁干扰)问题,因为一方面ECU和传感器本身可能受到外部电磁干扰的影响,出现导号失真或数据错误;另一方面ECU和传感器在工作过程中可能会产生电磁干扰,这些干扰可能通过传导或辐射的方式影响其他设备,比如开关电源和电机驱动等设备可能会产生电磁噪声,对传感器信号造成干扰。因此硬件电路设计需要充分考虑EMC和EMI问题,通过采用合理的布局、屏蔽、滤波等措施来降低设备产生的电磁辐射,提高抗干扰能力。
2) ADC(模数转换)
经过硬件电路处理好的模拟信号,将会输入给微控制器MCU,然后MCU的ADC模块将进行ADC转换,将模拟信号转换成数字信号,其过程包括采样、保持、量化和编码。
其具体过程是:
-
先信号采样,ADC模块会根据预设的采样频率对输入的模拟信号进行周期性的采样。
-
然后信号保持,为确保在模数转换过程中信号的稳定性,ADC模块具备采样保持电路,使得在采样瞬间将信号的瞬时值保持在一个稳定的电平上。
-
接着信号量化,ADC模块将采样得到的模拟信号幅度划分为多个量化间隔,每个量化间隔对应一个特定的数值范围。比如在一个8位ADC中,量化间隔的数量为256个,每个间隔的宽度约为满量程输入电压除以255。
-
最后信号编码,ADC模块将量化后的信号按照一定的编码规则转换为二进制数字信号,最终输出的数字信号通常是16位或32位的数字值,具体取决于ADC模块的分辨率,这些数字值可以表示为二进制形式,也可以转换其他数制形式,以方便后续的数据处理和存储。
经过这个转换过程,那么模拟信号就转换为数字信号,再根据信号的转换关系,就可以将数字信号转换为实际的物理信号,供应用层软件使用。原理上听起来很简单,但是实际上,ADC模块要准确完成这个转换过程,其实与底层软件息息相关。
2 底层软件配置
ADC模块的转换过程可以是由微控制器内部的指令触发,也可以由外部硬件信号(如定时器中断或外部中断等)触发。不管是哪种方式触发,都需要底层软件进行配置,其配置原理是根据微控制器的ADC模块,如下图示意:
source: https://blog.csdn.net/qq_20066069/article/details
基于AUTOSAR架构来介绍大致的ADC模块配置内容,即:
1)MCAL层配置(Microcontroller Abstraction Layer)
使用工具(如EB Tresos、DaVinci Configurator)配置ADC通道、采样时间、触发源(周期触发/事件触发),具体来说,包括:
1)通用ADC模块配置
-
首先模块使能与基础参数配置,包括启用/禁用ADC硬件单元(如ADCx Inx),设置转换模式(单次、连续和扫描模式等),配置分辨率(如12位、10位或8位),参考电压选择(如内部VREF、外部引脚电压)。
-
然后是时钟配置,包括选择ADC时钟源(如PLL或系统时钟),以及设置分频系数以满足采样率需求(比如英飞凌TC3xx的ADC时钟通常限制在80MHz以下)。
-
2)ADC通道配置
-
首先是通道参数,包括分配物理引脚(通过Port模块配置模拟输入功能),设置采样时间(如采样周期数),校准偏移(针对每个通道的硬件偏移补偿)。
然后是通道组(Group)划分,包括定义通道组(如Group0用于关键传感器,Group1用于常规输入),以及指定组内通道的优先级(抢占式或非抢占式)等。
3)触发源与转换控制
首先是触发方式,包括软件触发(比如通过API启动转换),硬件触发(如定时器PWM同步、GTM模块触发),外部事件触发(如GPIO边沿信号)。
然后是触发优先级,可以配置多个触发源的优先级(如紧急信号优先处理)。
4)转换模式与数据处理
首先是转换模式,包括单次模式(单次触发完成所有组内通道转换)和连续模式(循环转换,适用于实时监控);
然后是数据存储,包括配置结果寄存器地址,设置数据对齐方式(左对齐或右对齐),以及滤波与平均(启用硬件平均功能,如4次、8次采样取平均)。
5)中断与DMA配置
首先中断通知,使能转换完成中断,配置中断优先级,以及错误中断(如溢出、超时)。再配置DMA传输,配置DMA通道将转换结果直接传输至内存(减少CPU负载)。
当然除此之外,可能还包括其他一些配置项,比如校准、自检和安全特性等。考虑这块内容还是好久之前接触过,无法详述,如果想要详细了解推荐:
https://geekli.blog.csdn.net/article/details/140948270,【MCAL】TC397+EB-tresos之ADC配置实战 - (模数转换)
source: https://blog.csdn.net/geek_liyang/article/details/140948270
当配置好了,将会生成对应的.c和.h代码文件,下面示意下代码。
#include "stm32f10x.h" // 假设使用STM32F103微控制器
#define ADC_CHANNEL 0 // 定义要使用的ADC通道
// 配置ADC模块
void ADC_Config() {
// 使能ADC和GPIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);
// 配置ADC引脚为模拟输入
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 假设使用PA0作为ADC输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 初始化ADC
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
// 配置ADC通道
ADC_RegularChannelConfig(ADC1, ADC_CHANNEL, 1, ADC_SampleTime_55Cycles5);
// 启用ADC
ADC_Cmd(ADC1, ENABLE);
// 开启ADC中断
ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);
NVIC_EnableIRQ(ADC1_IRQn);
}
2)复杂驱动(CDD)或IO抽象(IO Hardware Abstraction)
当MCAL配置好之后,那么原始的模拟信号将转换为原始的数字信号,再通过一定的转换关系就可以获取到物理信号,其具体过程是:
-
读取ADC数据:当ADC转换完成后,底层软件从ADC的数据寄存器中读取转换后的数字信号。读取的数据通常是原始的数字码,需要进一步处理才能得到实际的物理量。
-
数据滤波:对读取的ADC数据进行滤波处理,以去除噪声和干扰。可以采用软件滤波算法,如平均滤波、中值滤波等。
-
数据转换和标度:将滤波后的数据转换为实际的物理量,如电压、电流、温度等。
如果这部分内容被划分到底层软件来实现,那么可以在CDD或IoHw中实现。比如将ADC原始值(0~4095)转为物理量(如温度值-40°C~150°C)。
// 标定公式:物理值 = (ADC_raw * gain) + offset
float Temp_Value = (adc_raw * 0.1) - 40.0;
另外,更严谨地来说,通常在原始的数字信号转换为物理信号之前,要进行信号的诊断,比如进行信号合理性检查,包括是否有短路故障(对电源短路,对地短路),开路故障和范围检查。
当然这部分内容也可以放到应用软件去做,取决不同软件团队的分工,就本人经验这两种方式都经历过。
3 RTE(Runtime Environment)通信:信号传递到应用层
在RTE层进行接口定义(SWC接口),比如在AUTOSAR工具(如DaVinci Developer)中定义Sender-Receiver(SR)接口或Client-Server(CS)接口
,例如TempSensor_SR_If,如果传递已转换成物理值的
数据,其数据类型可以定义为float32
(温度值);如果直接传递原始的ADC值,则可以定义为uint16等数据类型,如下示意:
// RTE自动生成代码(应用层SWC获取数据)
Rte_Read_TempSensor_Value(&temperature);
这里对于RTE配置,涉及底层软件和应用层的AUTOSAR配置,用ARXML文件最终实现RTE接口配置。
一种方式是使用Simulink的AUTOSAR软件组件模板来创建模型,在模型中定义软件组件(SWC)的输入输出接口,这些接口应与RTE接口的定义相匹配,并且在Simulink中设置模型的参数,确保其符合AUTOSAR标准。
然后生成ARXML文件,输入给底层软件导入AUTOSAR工具生成SWC的RTE接口文件,比如Rte_xxx.h文件,以此将底层的信号传递到应用层。
4 应用层(Application Layer)处理
就如上面所举例的温度信号,对于应用层软件来说,如果获取的原始的数字信号(ADC信号),那么需要该信号进行信号合理性检查,即故障诊断,然后再转换为物理值,最后应用于需要的该信号使用场景和控制逻辑,比如发动机控制根据温度调整喷油量。
// 应用层逻辑示例
if (temperature > 100.0) {
EnterEngineProtectionMode();
}
或者与其他SWC交互,比如将温度值传递给PID控制器SWC,又或者输出到执行器,比如控制风扇转速的PWM信号。
这里补充一点,针对在应用层做故障诊断的情况,一方面需要故障诊断,包括故障使能条件,确认条件,Debouce时间以及恢复条件和时间等,另一方面还需要故障的后处理,包括信号出现故障是否要设置替换值,以及DTC存储等内容。
就应用这块内容,单独写一个ADC的应用软件模型开发来详细介绍,敬请关注。
5 小结与回顾
以上硬件信号处理 → 底层软件驱动配置 → RTE接口配置 → 应用层逻辑处理与应用介绍一个传感器的模拟信号从硬件采集与软件应用的全过程。
最后再以一个汽车的右门状态信号处理的例子强化并结束本文内容,希望对你有所启发:
-
硬件:门状态传感器输出0~200mV → 信号调理 → 0~5V;
-
微控制器:ADC转换(模拟量0~5V→ 数字量(比如原始值0~4095))。
-
BSW:MCAL层配置ADC通道和DMA传输等;ECU抽象层滤波处理,并转换成门状态信号(开或关)。
-
RTE:通过
CS接口
将右门状态信号传递给应用层。 -
应用层:诊断SWC监控信号合理性;VCU根据控制右门状态信号决策车辆的行驶状态,比如门没关,车不能驱动,门关了,车才能驱动。