联合汽车电子嵌入式软件一面:FOC 时序、死区补偿与 FreeRTOS
- 轮次
- 一面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 电驱项目里电流环和速度环一般怎么分层?各层周期怎么定,接口怎么切?
- FOC 里为什么常把三相电流采样点卡在 PWM 中点附近?采样时机偏了会出现什么现象?
- 永磁同步电机怎么从编码器原始计数得到电角度?磁极对数起什么作用?
- SVPWM 为什么要加死区?死区会带来哪些电流畸变,软件上怎么补?
- 电机控制里 PWM 更新、ADC 完成、电流环计算,这三者的时序和优先级通常怎么排?
- FreeRTOS 里时间片轮转和抢占式优先级调度差在哪?Tick 中断里发生了什么,才可能让更高优先级任务马上跑起来?
- 为什么低优先级任务有时会比高优先级任务先跑?优先级反转怎么用互斥量协议缓解?
《参考解析》
环路分层与周期。 电流环贴近功率级,放在 PWM 周期中断或最高优先级任务里,典型周期是 PWM 周期(几十到一百微秒);速度/位置环在毫秒级,由电流环输出的转矩电流指令驱动。模块切分按信号流:采样与坐标变换(Clarke/Park)、电流调节器与反变换、SVPWM 与死区、观测器/编码器解算、速度环与限幅保护。接口要用结构化量(电角度、Id/Iq 反馈与指令、母线电压、故障位图),禁止上层直接改底层寄存器。周期由物理时间常数决定:电流环要远快于电气动态(通常带宽 1~2 kHz),速度环要覆盖机械惯性,且与任务调度、CAN 指令更新周期兼容。限幅、弱磁、过流保护应靠近电流环出口,避免上层算完被底层「悄悄削掉」导致环路失配。标定参数(Kp/Ki、电流限幅、死区补偿)集中到一张表,运行时只读。
为什么在 PWM 中点采样。 中心对齐 PWM 下,中点附近上下管占空相对稳定,相电流接近平均值;开关边沿附近有尖峰、振铃和二极管反向恢复,采样窗贴边会采到噪声,表现为 Iq 抖动、噪声啸叫、低速转矩波动。低占空或高占空时有效采样窗口变窄,需要最小脉宽限制,或改用两电阻重构、单电阻移相采样。工程上用定时器比较通道触发 ADC,与 PWM 中心对齐;必要时加采样延迟补偿,抵消 ADC 转换与 DMA 完成的相位滞后。只采两相时第三相由基尔霍夫求出,中性点漂移或漏电流大会引入误差,需要一致性校验。调试时用示波器同时看 PWM 与 ADC TRIG,确认触发落在平坦区。
编码器到电角度。 机械角由计数换算:θ_m = 2π × count / CPR(CPR 是考虑四倍频后的每转有效脉冲数);电角度 θ_e = p × θ_m,p 是极对数。FOC 的 Park/逆 Park 必须用电角度,用错极对数会失步或堵转发热。上电要找零:对齐索引脉冲(Z 信号)、强制拖到已知相位、或用高频注入/开环起动后再锁相,把机械零点映射到电角度零点。还要处理计数溢出、方向位、滤波与丢脉冲检测,否则高速时角度跳变会直接打坏电流环。用绝对式磁编码器(SPI/SSI)也要做安装偏置标定,并校验 CRC/超时,超时切安全力矩或停机。分辨率不足表现为低速转矩纹波,可结合观测器或插补,但要在带宽与噪声之间折中。
死区与补偿。 上下管不能同时导通,死区防止桥臂直通;硬件死区由定时器 BDTR 或栅极驱动产生。死区使实际电压矢量相对指令缩短或偏移,表现为零电流附近交叉畸变、低速转矩波动、谐波增大。补偿思路:按相电流极性判断续流二极管方向,把丢失的伏秒积加回占空比;电流过零附近要做死区或渐变,避免补偿方向抖振。补偿量与母线电压、死区时间、器件压降有关,常做成随 Vbus 缩放的表。死区过大安全但效率与线性度变差,过小在温升与器件离散下有直通风险,要按最坏传播延迟留裕量。验证看相电流 THD、低速转矩波动、以及补偿前后的温升对比。
PWM/ADC/电流环的时序。 典型链路:PWM 周期事件触发采样 → ADC/DMA 完成进中断 → 电流环计算 → 写下一周期比较寄存器(影子寄存器,下周期生效)。电流环 ISR 优先级应高于通信与日志,但要短;重计算可以拆到高优先级任务,ISR 只做采样交付与寄存器更新。若 ADC 完成晚于允许的计算窗口,会出现「算完赶不上本次更新」,表现为一拍延迟,需要降算法复杂度或提高主频/优化浮点。写比较值必须在更新事件前完成,并确认中心对齐模式下的加载点;错半拍会引入相位滞后,降低环路相位裕度。与 RTOS 共存时,关中断临界区要极短;用 GPIO 翻转或 trace 量 ISR 最坏执行时间,留足余量。
FreeRTOS 调度与 Tick。 抢占式优先级调度:就绪队列里永远跑当前最高优先级任务,同优先级才可能时间片轮转;时间片只解决同优先级的公平性,不同优先级之间仍是严格优先级。SysTick(或 tickless 补偿后的 tick)里处理延时到期、定时器回调、更新就绪位图;如果发现更高优先级就绪,置切换标志。真正的上下文切换发生在退出中断时的 PendSV:保存当前任务栈、恢复目标任务栈,保证中断尾部切换的原子性。任务调用 xQueueSend/vTaskDelay 等 API 也可能在退出临界区后触发调度,不必等下一个 tick;中断里要用 FromISR 接口并正确传出 pxHigherPriorityTaskWoken,否则会出现「信号已发但任务晚一拍」。
优先级反转与优先级继承。 高优先级任务在等一个被低优先级任务持有的互斥量,而中优先级任务抢占了持锁者,导致高优先级被间接阻塞,看起来像低优先级先跑。优先级继承:持锁任务临时提升到等待者中的最高优先级,放锁后恢复;FreeRTOS 的 Mutex 默认支持优先级继承(xSemaphoreCreateMutex),二值信号量不支持。优先级天花板是另一种解法:把锁的优先级设为其所有使用者的最高优先级。还要注意:中断里不能拿 Mutex(会阻塞),用临界区或 FromISR 版本;以及避免在持锁期间做长耗时操作,否则继承也救不了。