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