3、加速踏板信号解析
加速踏板,说白了就是驾驶员和VCU之间最直接的沟通桥梁。你踩多深,VCU就理解你想要多少动力。但这个“理解”的过程,远比想象中复杂。
我个人习惯把加速踏板信号解析分成四个层面来看:传感器原理、信号采集与滤波、开度到扭矩的映射、以及故障处理。咱们一个一个聊。
3.1 加速踏板位置传感器原理(双路冗余设计)
先问一个问题:为什么加速踏板要用双路冗余?
你想啊,如果单路信号断了,VCU读到的是0%,那车就突然没动力了。高速上突然没动力,这可不是闹着玩的。所以,必须用两路独立的传感器,互相校验。
常见的踏板传感器有两种:
- 电位计式:结构简单,成本低。但容易磨损,寿命有限。
- 霍尔式:非接触式,寿命长,精度高。现在主流方案。
双路冗余设计,通常有两种实现方式:
- 反向输出:一路输出0.5V~4.5V,另一路输出4.5V~0.5V。两路电压之和恒为5V。这种方案校验起来非常方便。
- 同向输出:两路都输出0.5V~4.5V,但斜率不同。比如一路是1:1,另一路是2:1。这样也能互相校验。
关键点:双路信号必须实时校验。一旦偏差超过阈值(比如0.3V),VCU必须立刻进入故障模式。
我在项目中遇到过一个问题:某款车的踏板,两路信号在中间位置总是有0.1V的偏差。查了很久,发现是传感器安装支架的振动导致。后来加了橡胶垫片才解决。嗯,这种机械耦合的问题,有时候比电气问题更隐蔽。
3.2 信号采集与滤波
传感器信号进了VCU的ADC引脚,但你不能直接用。为什么?因为信号太“脏”了。
发动机的振动、电磁干扰、电源纹波……这些都会叠加在信号上。你想想看,如果VCU读到的是抖动的信号,那扭矩输出也会跟着抖,驾驶体验会非常差。
所以,滤波是必须的。我一般分两步走:
- 硬件滤波:在ADC引脚前加一个RC低通滤波器。截止频率通常设在100Hz左右。这能滤掉大部分高频噪声。
- 软件滤波:在代码里再做一次数字滤波。我常用的方法是滑动平均滤波。
下面是我常用的滑动平均滤波代码片段:
/* 滑动平均滤波,窗口大小设为8 */
#define FILTER_WINDOW_SIZE 8
static uint16_t filter_buffer[FILTER_WINDOW_SIZE];
static uint8_t filter_index = 0;
uint16_t pedal_filter(uint16_t raw_value)
{
uint32_t sum = 0;
uint8_t i;
filter_buffer[filter_index] = raw_value;
filter_index = (filter_index + 1) % FILTER_WINDOW_SIZE;
for(i = 0; i < FILTER_WINDOW_SIZE; i++)
{
sum += filter_buffer[i];
}
return (uint16_t)(sum / FILTER_WINDOW_SIZE);
}
我的经验:窗口大小选8比较合适。太小了滤波效果不好,太大了响应延迟。我曾经试过16,结果踩下踏板后动力要等100ms才上来,驾驶员会感觉“肉”。
3.3 踏板开度与扭矩百分比映射关系
滤波后的信号,要转换成百分比。这个映射关系,直接决定了车辆的驾驶感受。
最基本的映射是线性映射:
/* 线性映射 */
pedal_percent = (filtered_value - pedal_min) * 100 / (pedal_max - pedal_min);
但说实话,纯线性映射并不好用。为什么?因为人的脚对踏板深度的感知不是线性的。你想想看,在0%~20%这个区间,驾驶员希望动力响应柔和一点,方便低速跟车。而在80%~100%这个区间,驾驶员希望动力响应更激进。
所以,实际项目中会用分段映射或者查表映射。下面是一个典型的分段映射表:
| 踏板开度(%) | 扭矩百分比(%) | 说明 |
|---|---|---|
| 0 ~ 5 | 0 | 死区,防止误触发 |
| 5 ~ 20 | 0 ~ 15 | 低速区,响应柔和 |
| 20 ~ 70 | 15 ~ 70 | 线性区,正常驾驶 |
| 70 ~ 95 | 70 ~ 95 | 加速区,响应增强 |
| 95 ~ 100 | 95 ~ 100 | 强制降档区(Kick-down) |
注意:死区(0%~5%)非常重要。如果没有死区,踏板稍微松动一下,VCU就会输出扭矩,车辆会“窜动”。我曾经见过一个案例,就是因为死区设置太小,导致车辆在颠簸路面时动力忽大忽小。
另外,扭矩百分比还要和车速做联合标定。同样的踏板开度,低速时扭矩百分比要低一些,防止起步太猛;高速时扭矩百分比要高一些,保证超车动力。
3.4 故障诊断与跛行回家策略
这部分是安全的核心。VCU必须能检测到踏板的任何异常,并做出合理响应。
常见的故障类型有:
- 信号超范围:电压低于0.3V或高于4.7V。大概率是线路断路或短路。
- 双路信号不一致:两路信号的偏差超过阈值。可能是传感器内部故障。
- 信号卡滞:信号长时间不变。可能是踏板机械卡住。
- 信号跳变:信号在短时间内剧烈变化。可能是接触不良。
检测到故障后,VCU要执行跛行回家策略。我一般这样设计:
- 轻微故障(如信号轻微偏差):限制最大扭矩为50%,点亮故障灯。
- 严重故障(如一路信号丢失):使用另一路信号,限制最大扭矩为30%,点亮故障灯。
- 致命故障(如两路信号都丢失):直接切断动力,车辆滑行停止。
避坑指南:我曾经遇到过一个问题,车辆在颠簸路面行驶时,踏板信号偶尔会瞬间超范围。如果VCU立刻进入跛行模式,驾驶员会非常困惑。后来我加了一个“去抖计时器”,故障持续200ms以上才确认。这样既保证了安全,又避免了误触发。
跛行回家策略的代码实现,我习惯用状态机:
typedef enum {
PEDAL_NORMAL,
PEDAL_LIMITED,
PEDAL_EMERGENCY,
PEDAL_SHUTDOWN
} PedalState;
PedalState pedal_fault_handler(uint16_t pedal1, uint16_t pedal2)
{
/* 检查双路信号一致性 */
if(abs(pedal1 - pedal2) > FAULT_THRESHOLD)
{
fault_counter++;
if(fault_counter > DEBOUNCE_TIME)
{
return PEDAL_LIMITED;
}
}
else
{
fault_counter = 0;
}
/* 检查信号范围 */
if((pedal1 < MIN_VALID) || (pedal1 > MAX_VALID) ||
(pedal2 < MIN_VALID) || (pedal2 > MAX_VALID))
{
return PEDAL_EMERGENCY;
}
return PEDAL_NORMAL;
}
嗯,到这里,加速踏板信号解析的核心内容就差不多了。记住一句话:踏板信号是VCU的“眼睛”,眼睛出了问题,整个系统都会乱套。
最后一个小技巧:在实车调试时,我习惯用CANoe同时监控踏板原始信号和滤波后的信号。对比着看,能快速定位问题是出在传感器还是滤波算法上。