1. LIN总线物理层波形观测与电平判定

LIN总线物理层波形观测与电平判定 学习卡片

任务说明

本案例使用示波器测量LIN总线物理层信号,验证显性/隐性电平是否符合LIN规范阈值。LIN总线为单线12V总线,显性电平(逻辑0)接近0V,隐性电平(逻辑1)接近电源电压(通常12V)。依据LIN规范2.x,接收端阈值要求:隐性输入电压高于0.6×VBAT,显性输入电压低于0.4×VBAT。

测量拓扑与连接

搭建如下测量环境:LIN主节点(或信号发生器)与从节点通过1kΩ终端电阻连接至LIN总线,示波器探头连接至总线节点处。示波器通道1测量LIN总线电压,通道2(可选)测量主节点TXD引脚以同步触发。

LIN主节点 TXD → LIN收发器 VBAT = 12V LIN从节点 LIN收发器 VBAT = 12V LIN 总线(单线) 1 kΩ GND(参考地) 示波器 CH1: LIN总线 CH2: TXD(触发) 探头 隐性≈12V 显性≈0V

测量步骤

  1. 配置示波器:通道1设为DC耦合,垂直刻度2V/div,水平刻度根据波特率设置(19.2kbps时每bit约52μs,建议100μs/div);触发电平设为6V(约0.5×VBAT),下降沿触发。
  2. 发送测试帧:主节点发送LIN帧(如0x3C诊断帧或任意唤醒帧),确保总线上出现连续的显性/隐性跳变。
  3. 捕获波形:触发后捕获至少一个完整字节场(含起始位和8个数据位)。
  4. 测量电平:使用示波器光标分别测量隐性电平(总线空闲或发送1时的电压)和显性电平(发送0时的电压)。

判定标准

依据LIN规范2.x接收端阈值,在VBAT=12V时:

  • 隐性电平应高于0.6×VBAT = 7.2V(通常实测接近12V);
  • 显性电平应低于0.4×VBAT = 4.8V(通常实测接近0V);
  • 显性/隐性跳变沿应陡峭(上升/下降时间通常小于波形位时间的1/4,即约13μs@19.2kbps)。

若实测隐性电平低于7.2V或显性电平高于4.8V,说明总线负载过大、终端电阻配置错误或收发器故障,需检查总线节点数量和线路阻抗。

预期观测结果

在正常12V系统中,示波器应观察到:总线空闲或发送逻辑1时电压约为11.5~12V(隐性),发送逻辑0时电压约为0~0.5V(显性)。起始位为显性(0V),随后数据位按帧内容在两种电平间切换。若使用差分探头或隔离通道,注意共地连接以避免地环路干扰。

import numpy as np
import matplotlib.pyplot as plt

# 模拟LIN总线物理层信号(显性0V,隐性12V,实际LIN为显性0V/隐性Vbat)
fs = 1e6  # 采样率1MHz
t = np.arange(0, 0.01, 1/fs)  # 10ms

# 生成一个简单的LIN帧波形(模拟:隐性12V,显性0V)
signal = np.full_like(t, 12.0)  # 默认隐性
# 模拟显性脉冲(例如同步间隔+同步场+数据)
dominant_start = int(0.002 * fs)
dominant_end = int(0.004 * fs)
signal[dominant_start:dominant_end] = 0.0  # 显性

# 添加噪声
noise = np.random.normal(0, 0.3, t.shape)
measured = signal + noise

# 绘制波形
plt.figure(figsize=(10, 4))
plt.plot(t*1000, measured, label='LIN Bus Signal')
plt.axhline(y=12.0, color='r', linestyle='--', label='隐性电平 (≈Vbat)')
plt.axhline(y=0.0, color='g', linestyle='--', label='显性电平 (≈0V)')
plt.axhline(y=0.6*12, color='orange', linestyle=':', label='隐性阈值 (0.6*Vbat)')
plt.axhline(y=0.4*12, color='purple', linestyle=':', label='显性阈值 (0.4*Vbat)')
plt.xlabel('时间 (ms)')
plt.ylabel('电压 (V)')
plt.title('LIN总线物理层信号测量')
plt.legend()
plt.grid(True)
plt.show()

# 输出测量结果
print(f"测量到显性电平: {np.min(measured):.2f} V")
print(f"测量到隐性电平: {np.max(measured):.2f} V")
print(f"显性阈值(0.4*Vbat): {0.4*12:.2f} V")
print(f"隐性阈值(0.6*Vbat): {0.6*12:.2f} V")