← 文章列表 / 用单片机给车做个外置码表:原理、流程和几个坑 返回

目录

用单片机给车做个外置码表:原理、流程和几个坑

老车没有水温表,仪表盘上只有一根油量针和一个速度表。想知道转速、水温、电瓶电够不够,只能靠自己装一个。

市面上卖的 OBD 表两三百,但自己做一个更有意思:一块单片机、一个 CAN 收发器、一块屏,成本不到五十。

这篇只讲三件事:怎么读到数据、程序怎么写、坑在哪里。

一、OBD 就是车上留的一个「问诊口」

方向盘下面那块塑料板里,有一个 16 针的梯形接口,就是 OBD-II。

它本来是国家强制要求的排放检测口,但里面什么都能读:转速、车速、水温、进气温度、节气门开度、电瓶电压。

用法非常像点菜:

  1. 你发一句:「01 0C」
  2. 车回一句:「41 0C 1A F8」
  3. 你算出:转速 1726 转

01 是服务号,意思是「读当前数据」;0C 是 PID,意思是「发动机转速」。就这么简单。

物理上,现在绝大多数车走 CAN 总线:接 6 脚(CAN_H)和 14 脚(CAN_L),速率 500k,差分信号。

二、硬件就五块

部件 选型 说明
单片机 STM32F103 / ESP32 带 CAN 控制器的直接接,不带的加 MCP2515
CAN 收发器 TJA1050 / SN65HVD230 把 3.3V 逻辑电平转成总线差分信号
电源 宽压 DCDC(9–36V) 车上的 12V 一点都不干净
屏幕 0.96 OLED / 1.8 TFT 小屏反而不刺眼
接口 OBD 公头 + 杜邦线 直接插,不用剪线

一个很多人忽略的点:供电比通信难。车子启动那一瞬电压能掉到 6V,发电机抛负载能冲到 60V,接反了直接烧。TVS、防反接二极管、共模电感,一样都不能省。

三、程序就一个循环

拆开看就四步:

1. 探测:发一帧 01 00 这是在问「你支持哪些 PID」。有回复说明通了,没回复就换协议或换波特率重试。

2. 记下清单 回复是 4 个字节的位图,每一位代表一个 PID 支不支持。先知道能问什么,后面才不会白问。

3. 主循环:每 100ms 问一组 不要一个一个问,可以把几个 PID 揁在一起发,一次拿回四五个数。转速、水温、车速、电压,一轮就够了。

4. 解析、滤波、刷屏 拿到字节按公式换算,做一次滑动平均去掉毛刺,再推给屏幕。

四、几张公式,背下来就行

PID 含义 公式
0C 发动机转速 ((A×256)+B) ÷ 4
0D 车速 A
05 冷却液温度 A − 40
11 节气门开度 A × 100 ÷ 255
2F 燃油液位 A × 100 ÷ 255
42 模块电压 ((A×256)+B) ÷ 1000

A、B 就是回复里第 3、第 4 个字节。就这几个,已经能把仪表盘填满。

五、难点,提前知道少踩坑

  1. 协议不止一种。 老车可能是 K-line,新车是 CAN,进口车还有 29 位 ID。没回复不一定是接错线,可能只是说错话。
  2. 多帧传输。 读 VIN 这种长数据,一帧装不下,要按 ISO-TP 拆首帧、连续帧,还得回流控帧。新手最容易卡在这里。
  3. 总线不能太热闹。 请求发得太密会拖慢整车网络,间隔至少 20ms,我一般用 100ms。
  4. 数据会跳。 转速本身就在抖,屏幕上数字疯跳很难看,必须做滤波。
  5. 不是每个 PID 都有。 同一辆车,有的 PID 支持,有的直接不回。程序里要能容忍超时,不能死等。
  6. 熄火后不能耗电。 一直通电,一周就能把电瓶吸干。要么检测电压休眠,要么接 ACC。
  7. 接线和干扰。 CAN 两根线要双绞,终端电阻 120Ω,线不要太长。点火线圈的干扰很容易把帧打坏。
  8. 别挡规线。 屏幕装在方向盘上方会遮视线,装太低又要低头看,装之前先坐进去试位置。

六、想动手的话

三句话:

  • 先花三十块买个 ELM327 插上,确认你的车到底能读到什么
  • 再用 USB-CAN 接到电脑,把报文打印出来看一遍,比看文档快十倍
  • 屏幕宁小勿大,晚上真的很扉眼

做到最后你会发现,真正难的不是写代码,是让它在零下十度的早上、在颠簸的土路上、在电压跌到 9V 的时候,还能安静地把那个数字显示对。