结论:Mazda MX-5 NC(2005–2015)的公开 CAN 笔记给出 10 个可用 ID 与配套 RaceChrono 公式,但覆盖面有硬边界:0x081 转向角、0x085 制动压力、0x090 疑似加速度三帧只在带 DSC 模块的车型(2007 年起)上出现;10 秒怠速直方图里 20 个 ID 中只有 8 个达到 100 Hz,真正被写清解码的不超过 10 个。
先分清哪些 ID 依赖 DSC
这份笔记面向第三代 MX-5(NC / NCFL / NCFLFL,即 MK3 / MK3.5 / MK3.75),按 CAN ID 组织,每个 ID 给出字节含义表与 RaceChrono 通道公式。使用时第一个判断不是「这个 ID 有没有」,而是「这辆车有没有 DSC 模块」——转向角、制动压力、疑似加速度三组信号都只在配备 DSC 的车型上存在,也就是 2007 年之后的车。
| CAN ID | 更新频率 | 关键字节 | 公式 | 前提条件 |
|---|---|---|---|---|
0x201 |
100 Hz | 0–1 转速、4–5 车速、6 油门、7 恒为 FF | 转速 = bytestouint(raw,0,2)/4.00;车速 = ((bytestoint(raw,4,2)/100.00)−100)/3.6;油门 = bytestoint(raw,6,1)*2.00 | 全系 |
0x4B0 |
100 Hz | 0–1 左前、2–3 右前、4–5 左后、6–7 右后 | 四角统一为 ((bytestoint(raw,N,2)/100.00)−100)/3.6 | 全系,独立承担轮速 |
0x200 |
100 Hz | 6 制动开关、7 节气门位置 | 制动 = data[6] 与 0x1 按位与;节气门 = bytestouint(raw,7,1)*100/255.00 | 全系;byte7 与 0x215 byte6 同源 |
0x215 |
100 Hz | 6 节气门位置,其余多为故障码 | bytestouint(raw,6,1)*100/255.00 | 全系;byte0 与 byte2 互为镜像,byte1 与 byte3 互为镜像 |
0x231 |
40 Hz | 1 的 bit3 空挡、bit1 离合 | 空挡 = data[1] 与 0x4 按位与;离合 = data[1] 与 0x2 按位与 | 手动挡其余字节恒为 FF 或 00 |
0x240 |
10 Hz | 0 计算负载、1 水温、4 进气温度 | 水温 = bytestouint(raw,1,1)−40;进气 = bytestouint(raw,4,1)−40 | 全系;水温与 0x420 byte0 同源 |
0x081 |
100 Hz | 2–3 有符号转向角,仅 4 字节 | bytesToInt(raw,2,2),正值向右 | 需 DSC 模块,2007 年起 |
0x085 |
100 Hz | 0–1 制动压力、2 的 bit0 制动开关 | 压力 = (3.4518689053*bytesToInt(raw,0,2)−327.27)/1000.00,单位 kPa | 需 DSC;系数源自 miata.net 用户数据,作者标注可能错误 |
表里最该被记住的不是公式本身,而是最后一列。0x081 与 0x085 一旦用在 2006 年及以前的车上,会表现为「完全没有该 ID」,而不是数值为零。
车速公式里那两个魔数的来历
0x201 与 0x4B0 共用同一套换算:原始值以 km/h 为单位但带 100 km/h 偏移,因此先除以 100 再减 100;末尾的 3.6 是把 km/h 换成 m/s,因为 RaceChrono 内部以 m/s 计算,之后由软件按用户选择的单位再乘回去。自己写解析器时若直接用 m/s 之外的单位,就要把这一级换算还原。
油门通道的公式是 bytestoint(raw,6,1)*2.00,对应 0.5% 的步进;0x201 的 byte2 与 byte3 虽跟随转速变化,但笔记标注它疑似带 0x7fff 偏移且与发动机扭矩无关,属未完成解析项。
10 秒直方图:用帧数反推频率
笔记给了一张停车场怠速状态下 10 秒窗口的报文计数直方图,共 20 个 ID。把帧数除以 10 就得到各 ID 的实际频率,这张表可以直接用来判断采样与总线负载。
| 10 秒帧数 | 换算频率 | CAN ID(十六进制) | 说明 |
|---|---|---|---|
| 1000 | 100 Hz | 081、085、090、200、201、211、215、4B0 | 含全部已解析的动态信号 |
| 500 | 50 Hz | 204、21A | 未解析 |
| 400 | 40 Hz | 231、4EC | 231 为变速箱,与笔记标注的 40 Hz 一致 |
| 100 | 10 Hz | 212、240、39A、420、430、4FF | 240 为发动机数据,与标注的 10 Hz 一致 |
| 10 | 1 Hz | 4F0、4F1 | 低频,疑似诊断或状态帧 |
这张表的实用价值在于排错:如果某台设备上 0x4B0 的计数明显低于 1000,先查总线负载与过滤规则,再去怀疑解码;如果它和 0x240 一起掉,问题多半在总线本身而非解析。
恒值与未完成项要单独标记
笔记里有几类条目不能当信号使用。0x211 全为 0xFF;0x212 恒为 80 00 20 40 00 00 00 00,原文用问号表示这只是观察结果;0x090 整帧标记为 WIP,只推测与加速度有关;0x430 的 byte2–7 恒为 0x00,且笔记提示 0x430 在 ND 上才是油量。把它们写进解析配置只会产生恒零通道。
0x240 这一帧同样混着可用与不可用项:byte0 的计算负载公式为 100*(bytestouint(raw,0,1)/255.00,笔记说明作者在 RaceChrono 的通道列表里找不到对应的 Engine Load 通道;byte3 的节气门位置被标注为绝对开度(计入怠速开度),但作者实测怠速值偏高(约 11%),提示缩放仍需调整;byte2 疑似点火提前角,未给出公式。
常见问题
这份 MX-5 NC 的 CAN 笔记覆盖哪些年款?
笔记标题写明覆盖 2005–2015 的第三代车型(NC / NCFL / NCFLFL,即 MK3 / MK3.5 / MK3.75)。但转向角 0x081、制动压力 0x085 与疑似加速度 0x090 只在带 DSC 模块的车型上存在,也就是 2007 年起;更早的车上这些 ID 根本不会出现。
0x085 的制动压力公式能直接用吗?
需谨慎。笔记给出的公式是 (3.4518689053*bytesToInt(raw,0,2)−327.27)/1000.00,单位为 kPa,但作者明确标注系数来自 miata.net 用户数据、可能有误。作为替代,笔记还给出百分比算法 min(0.2*(bytesToInt(raw,0,2)−102),100),未踩时基准值为 102,松开后短暂降到 99 会出现轻微负值。
车速公式里为什么既要减 100 又要除以 3.6?
两级换算是两件事。原始车速以 km/h 为单位但带 100 km/h 偏移,所以先除以 100 再减 100 还原真实 km/h;再除以 3.6 是换成 m/s,因为 RaceChrono 内部以 m/s 计算,最终按用户选择的单位自动乘回。自建解析器时若不需要 m/s,应去掉这一级。
离合与空挡信号在自动挡车上也能用吗?
不能直接套用。0x231 的 byte1 中 bit3 表示空挡、bit1 表示离合,笔记说明该字节的解读基于手动挡车:手动挡时 byte0、byte2、byte3 恒为 FF,byte4–byte7 恒为 00。笔记也提到该帧对自动挡车可能有更多有意义的数据,但并未给出自动挡下的解析。
延伸阅读
- Mazda MX-5 ND2:HS-CAN 开放字段与逐字节标定 —— 同车系后一代的总线档案,可对照 ID 继承关系
- 2022 GR86 / BRZ 的 CAN 数据地图:ASC 与 DCM 口 —— 同为后驱轻量平台的赛道取数实践
- 车载信号为什么会说谎:TTL、源时间与 500 ms 新鲜度阈值 —— 100 Hz 与 10 Hz 混采时如何处理时间戳
- OBD 零百计时的链路标定:轮询周期、往返延迟与丢包率怎么测 —— 用帧计数反推频率的标定方法
参考资料
- 项目 01 ——
public-can-dbc-datasets/additional/hatsunearu-mx5-nc-notes/mazda_mx5_nc.md(10 个 CAN ID 的字节表、RaceChrono 公式、更新频率与 10 秒怠速直方图)
免责声明
本文内容整理自公开开源笔记,其中公式、系数与频率均为原作者基于自车观察给出的结果,部分条目被作者本人标注为未完成或可能错误,未经独立实车验证。不同年款、市场、ECU 版本与是否带 DSC 模块均会导致差异,请以实际抓包与官方资料为准。
更新记录
- 2026-10-14 初稿
发表回复