ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

电动方程式VCU整车控制算法初探:从踏板解析到扭矩控制

电动方程式VCU整车控制算法初探:从踏板解析到扭矩控制 不用刻意“从零开始”得像是重新发明轮子。大学生电动方程式大赛FSEC的“算法”听起来像是很高深的自动驾驶或者AI但实际上对于一支刚刚组建、或者想系统化提升的车队来说我们第一年要做的事情就是把整车的控制逻辑理清楚把从“拧油门”到“车轮转了”这条路上的每一个环节都用代码精确地、安全地管起来。这篇文章是系列的第一篇我想先把最核心的骨架——整车控制算法的框架、输入信号处理和驾驶员意图解析——讲透。先说个我的切身体会很多新队员一上来就追着“神经网络”、“轨迹规划”跑结果连踏板信号都抖得没法用第一年直接白给。电动方程式的算法本质是一门“确定性的工程学”不是玄学。你要做的不是拥抱不确定性而是剔除不确定性。1. 项目整体架构与算法模块拆解先解决“有哪些”和“凭什么”在写第一行代码之前必须对着整车电气架构图把算法所在的“VCU整车控制器”应该干哪些活分清楚。FSEC赛车的算法不是一个单独的“大算法”而是一组有明确优先级和时序关系的控制逻辑集合。1.1 按功能域拆解算法模块我会把整车算法分为四个逻辑域输入解析域、整车状态域、执行决策域和诊断保护域。这套分法不是教科书里抄的是我对着实际线束图和CAN报文一点点捋出来的。功能域核心模块要解决的工程问题输入解析域踏板传感器解析与标定、方向盘转角/制动压力采集如何把ADC电压变成驾驶员“意图”整车状态域车速估算、SOC估算、温度状态监测如何知道车现在“累不累”、“跑多快”执行决策域扭矩解析、驱动防滑TCS、能量回收策略如何让电机听话且高效地出力诊断保护域故障等级划分、安全限功率、继电器控制如何确保“坏的时候”车是安全的第一篇文章里我重点展开的是输入解析域里的踏板算法因为这是整个控制链路的源头。源头要是抖一下后面所有算法全是放大错误的放大器。1.2 为什么第一版算法必须“朴素”我知道你们肯定在知乎上看过有人用粒子群算法优化电机参数、用深度学习做扭矩预估看起来很酷。但我的建议是第一版算法必须用最朴素、最直接、最没有数学技巧的方案。用PID和查表不用MPC和神经网络。逻辑很简单FSEC的第一优先级是“完赛”第二优先级是“效率”第三才是“圈速”。朴素算法的好处在于可解释性强出了问题你能在十分钟内通过示波器和CAN日志定位到是哪一行逻辑判断错了。快速迭代写一个线性插值扭矩表半小时搞定不需要训练时间。稳定性压倒一切几十年工业验证过的PID和故障树思想比你在GitHub上下的魔改强化学习代码可靠得多。所以我给车队的开发路线是第一步建立基于规则(rules-based)的解析算法第二步刷写标定参数第三步才考虑加噪声滤波和高级控制。2. 核心细节解析踏板信号处理——别让“手抖”毁了你的比赛电动方程式的“油门踏板”本质上是一个角度传感器霍尔式居多它的输出经过整车线束进入VCU的ADC引脚。你踩下踏板的深度就是算法需要“翻译”给电机的“扭矩请求”。2.1 双通道踏板信号校验冗余设计这是规则里要求的也是保命的底线。我们用的是双电位计踏板两路信号的电压V_A和V_B是随踏板行程递增的且V_A 2 x V_B即A路斜率是B路的两倍具体斜率看选型。这一步相当于主刹车位置传感器和踏板位置传感器的互检防止单一传感器失效导致全油门。VCU会实时判断两路信号的合理性一旦发现偏差过大立刻断开主接触器并置故障标志进入跛行模式。我个人在实际操作中比较看重这个信号的低速抖动问题。就在第一年测试时我们遇到了很头疼的现象踩下踏板在20%开度附近电机扭矩输出有非常明显的“抽搐感”车子在起步阶段一耸一耸的。后来用示波器抓了CAN报文里的扭矩请求值才发现问题就出在ADC采样值的抖动上。踏板传感器输出本身是带几毫伏波纹的主板ADC采样后直接换算成百分比就会出现±1%到±2%的跳变。这些跳变在扭矩较小的起步工况下比例感就被放大了自然就耸动。问题定位到之后处理方式其实不复杂核心思路是软件滤波辅助硬件采样。我在算法里加了两层防护第一是在输入端做中值滤波窗口取5滤掉毛刺第二是加变化率限制计算相邻五十毫秒的踏板变化量单周期变化率超过每毫秒百分之零点五的就强制拉平输出。这两步处理之后踏板信号平滑度提升得非常明显起步耸动问题几乎彻底消掉了。以前老队员总说“慢速跟车难开”最终根因就在这里其实跟电机响应快慢关系不大而是你的“手”在抖让算法“以为”你在反复加减油。2.2 标定与归一化处理拿到两路ADC原始值后算法第一件事是做归一化。这个过程本质上就是把ADC的原始计数范围映射到半开度百分比。配合双通道校验这里要分三步走获取零点车辆处于Ready状态、整车低压正常时记录踏板未踩下时的ADC值。获取满点手动踩到底记录满开度的ADC值。线性映射 公式里ADC_Value是当前读到的值ADC_Zero是零点值ADC_Full是满点值。里面加了一个MIN限制是为了防止拟合结果超过100%。因为踩到底时传感器可能有一点过冲导致计算值112%这在逻辑上是不合理的。踩坑提示千万不要在主程序循环里用浮点运算去反复除以(ADC_Full - ADC_Zero)。这个差值在初始化时算好存起来就行。浮点除法在MCU上非常耗时会严重影响控制周期。3. 实操过程从Simulink模型到嵌入式C代码的无缝落地任何停留在PPT上的算法都是零分。既然说“从零开发”那就要经历一个“手撸代码”的过程。我用的是基于模型的开发MBD流程但我不推荐一上来就全用Simulink自动生成代码。第一年我强烈建议手写C代码。等你们对控制逻辑彻底吃透了再用工具链自动化提升效率。3.1 搭建最小工程框架我在底层基础架构里把控制逻辑按“任务节拍”划分。FSEC整车算法常见节拍是10ms控制任务扭矩控制和100ms状态任务故障检测。这个节奏是老外车队传下来的经验值和整车控制器的算力分配密切相关。/* vcu_task.c */ void VCU_Init(void) { Adc_Init(); // 初始化ADC模块 Can_Init(); // 初始化CAN模块 (500kbps) GPIO_Init(); // 继电器控制引脚 FaultManager_Init(); // 故障管理器初始化 Pedal_Calibrate(); // 执行踏板标定程序 eVehicleState VEHICLE_STATE_READY; // 初始化为待机状态 } void VCU_Task_10ms(void) { // 最低优先级采集与解析 Input_ReadPedal(); // 读取两路踏板ADC原始值 Input_ParsePedal(); // 校验、滤波、归一化、计算踏板开度 // 中间优先级状态估算 VehicleState_EstimateSpeed(); // 粗略车速计算基于轮速传感器脉冲 // 最高优先级执行决策 Control_CalculateTorque(); // 扭矩查表并叠加PID闭环调节 // 安全如果无论什么情况安全裁减在最后 Safety_CheckAndLimit(); // 最终扭矩限制与故障爬坡 }3.2 扭矩PID闭环示例电机响应慢半拍的克星在纯扭矩控制模式下我们踩踏板是给VCU一个“目标扭矩”。但电机不是立即响应的而且电机温度升高后磁钢退磁会导致输出偏小。所以在低速爬坡或扭矩微调工况下引入一个简单的增量式PID来修正。增量式PID的好处在于输出是对上一次输出的增量不会因为积分饱和而飞车。在FSEC的扭矩控制中我一般只用P和ID项因为会放大转速测量噪声直接禁用整定。/* pid_controller.c */ typedef struct { float Kp; float Ki; float Kd; float Target; float Integral_Err; float Last_Err; } IncPID_TypeDef; float IncPID_Calc(IncPID_TypeDef *pid, float Feedback) { float Err pid-Target - Feedback; float POut pid-Kp * (Err - pid-Last_Err); float IOut pid-Ki * Err; // float DOut pid-Kd * (Err - 2*pid-Last_Err pid-Last_Last_Err); // 我们在电控上禁用微分项避免噪声放大 float Inc POut IOut; pid-Last_Err Err; pid-Integral_Err Err; return Inc; }注意这里的Ki系数一定要做积分分离当误差超过某个阈值比如300Nm目标扭矩与反馈扭矩误差超过50Nm时积分项直接清零防止在电机非线性和饱和区里积分累积。实操小心的是我发现有些车队还直接用连续域PID公式去调参数结果离散化周期不对同样的系数整定效果完全不对。这里要提醒你的PID采样间隔是固定的10ms离散化参数和连续域参数之间要换算别直接抄别人连续域的整定值。3.3 整车标定表格与策略查表标定表格是VCU算法的灵魂。不要写死电机100Nm对应油门50%。更好的做法是建立“踏板开度百分比—电机扭矩”二维Map并在不同车速下做加权修正。踏板开度车速 5km/h 扭矩输出车速 20km/h 扭矩输出车速 80km/h 扭矩输出0%0 Nm0 Nm0 Nm10%20 Nm15 Nm10 Nm30%60 Nm55 Nm40 Nm60%120 Nm110 Nm80 Nm100%180 Nm220 Nm150 Nm这个表格的含义是低速时油门窜天高速时功率防超转。低速工况出弯、起步电机的永磁磁链可以承受大扭矩但高速时电机反电动势接近母线电压就不允许再输出大扭矩了。同时这个查表过程其实可以写成一个二维线性插值函数不用搞ML那个是杀鸡用牛刀。这里有个非常关键的工程点查表前必须做边界钳位。如果车速跑到85km/h还按MaxSpeed100km/h表的最后一行去查就会导致高速时的过流。所以需要在查表前根据当前转速动态限幅这一步最好用流图把逻辑理清楚再写。4. 常见问题与排查实测中踩过的那些“看似玄学”的坑这一部分写给即将上车调试的新队员。算法在电脑上仿真跑得再好上了真车一定会有各种诡异问题出现。这不是算法不行是工程化的时候缺了“手感”。4.1 问题一上电后踩油门没反应CAN上又看不到故障码这种问题往往不是算法逻辑而是状态机没进入驱动状态。FSEC整车算法里常见的几大状态是上电自检、待机、预充电、驱动行驶、故障停机。很多新手主循环里忘了“踩刹车读Ready状态”这一废话逻辑。排查心法先在连接状态下踩住刹车直到待机状态指示点亮再用CAN分析仪看节点报文。别上来就刷程序。大概率是状态机标志位没置位。4.2 问题二急加速时电机断断续续像是被“切油”这个是典型的过流保护误触发。电机在急加速时相电流会瞬间飙高如果限流阈值设得太低或者电流环AD采样没做低通滤波硬件过流保护就会不断重启逆变器。现象就是车速越猛切得越频繁。排查思路是看故障记录中最频繁出现的故障码是不是OC过流然后用电流钳抓母线波形。我处理过最夸张的一次是采样电阻的PCB铜皮太细大电流下压降居然导致ADC误判换了采样方式就好了。4.3 问题三扭矩响应总是慢半拍开着像刹车卡滞我实测下来最有用的技巧是给扭矩请求加一个“预充电前馈”当踏板开度变化率超过某个大阈值急踩时把第一帧扭矩直接乘以1.2的补偿系数强行克服逆变器内部的死区延迟。同时在PID里把“前馈项”加上而不是完全靠反馈调。加了前馈驾驶员主观评价的加速响应会直接上一个台阶实测至少提升50ms响应。4.4 问题四电池SOC显示不准导致限功率误触这也是FSEC赛场上几乎每支车队都会遇到的问题。SOC估算用安时积分误差会一直累积。我现在的方案是低速停车时用电池静置电压完成一次SOC的在线修正把估算值向开路电压表拟合。这一点有点接近所谓的“mppt算法”或“能源管理”。不过不要迷信什么深度神经网络SOC预测你传感器精度达不到就是在噪音里跳舞。独家心得请一定要在代码里加上“故障快照”功能。故障触发时把前后各200ms的关键变量踏板开度、电机转速、三相电流、母线电压、SOC全部写进Flash。这比什么调试器都管用。5. 总结与下一章预告这仅仅是长跑的第一步电动方程式算法是个系列工程这一篇只讲了最核心的踏板解析、扭矩控制初版和PID修正。你会发现我根本没提“赛车线”、“AI”这些花哨概念。因为在给电机通电之前你得先证明你的算法能让电机稳定地、可预测地转动起来。下一章我会重点拆解能量回收算法与制动能量管理。这年头光靠踩踏板就能得分但真正拉开圈速差距的是你敢不敢在制动区压着电池的充电功率极限跑以及如何用算法让“松油门”、“踩刹车”、“机械制动介入”这三者之间做到无缝切换。那才是真正检验车队算法功力的分水岭。先回去把代码里的踏板信号滤波看一下再看一下你的标定表低速起步是不是还有喘振。搞明白了我们再聊下一层。
返回列表