首页 > 其他分享 >51c嵌入式~电路~合集7

51c嵌入式~电路~合集7

时间:2024-10-02 16:50:07浏览次数:8  
标签:Pre 跳变 51c 嵌入式 Adc 电压 合集 以太网 ADC

一、借助示波器看以太网传输机制

本文以双绞线以太网为分析对象,以混合信号示波器为分析工具,深入探秘了两类常见的双绞线以太网的编码,且实地查看并验证了以太网在物理层的信号传输情况。

最后,通过一个实战例子对比了实际网络中软件接收的数据和示波器捕获信号之间的一致性。

本文打通软硬件之间的隔阂,从物理层揭示了以太网数据传输的机制,也充分发挥了现代化混合信号示波器的总线解码能力。

1 以太网概述 

以太网(Ethernet)是一种常见的计算机组网技术,其技术标准在IEEE 802.3中规定 [1]。

目前广泛使用的以太网通过双绞线(俗称网线)交换信息,其技术标准主要在TIA/EIA-568中规定 [2]。

本文以最常见的以太网标准为例,利用混合信号示波器的协议解码功能,揭秘以太网上的信号是如何传输的。

通常对于网络数据的分析都在软件上进行,例如著名的Wireshark工具可以对指定网卡上传输的数据进行捕获并解析 [3]。

但这样的操作屏蔽了物理层的差异,本文将更进一步揭秘物理层上数据具体是如何转变成电信号并传输的。

以太网(10 Base-T)和快速以太网(100 Base-TX)可以使用同一种双绞线进行数据传输,其引脚定义如下图所示。

51c嵌入式~电路~合集7_嵌入式硬件

以T568B为例,其中用到了4根线,构成2个差分对(TX和RX)。不失一般性,我们取其中一对(TX)作为分析对象。因此需要引出Pin 1和Pin 2,用于连接示波器探头来抓取信号。这里剪开一根网线,在Pin 1和2上分别引出一根导线,做成分析用的专用跳线,如下图所示。

51c嵌入式~电路~合集7_嵌入式硬件_02

这一对线上传输的是差分信号,因此最好用差分探头(例如TDP1500)。当然这里用到的跳线比较短,用普通的无源探头也可以,只是信号质量会受到一定的影响。

2 10 Base-T以太网 

10 Base-T的传输速率是10Mbps,使用曼彻斯特编码(相位编码)数据。“0”用下降沿表示,“1”用上升沿表示。如下图所示,这是一段由示波器抓取到的差分波形。在确认最小脉宽后,可以通过判断周期性的边沿方向来辨识“0”或“1”。

51c嵌入式~电路~合集7_嵌入式硬件_03

接下来,需要将二进制序列组装成数据帧,由于包含多个协议的堆叠(MAC、IP、TCP等),手动解码会比较复杂,可以直接使用示波器的总线解码工具进行解码并显示。如下图所示,将总线设为“Ethernet”,速度设为“10 Base-T”,信号类型设为“差分”,其它选项根据实际情况选择或保持默认就可以了。

51c嵌入式~电路~合集7_嵌入式硬件_04

解码结果如下图所示,可以看到这是一个IPv4的数据帧,放大后可以看到MAC地址等数据包内的具体内容。

51c嵌入式~电路~合集7_嵌入式硬件_05

3 100 Base-TX以太网 

相比10 Base-T,100 Base-TX带来了10倍的速度提升,达到100Mbps。它的编码协议也变得复杂得多,主要涉及3个关键词:4B5B、MLT-3和NRZ-I。

3.1 4B5B

4B5B表示使用5位二进制编码来表示1组4 bits数据 [4]。这样做的原因是使得传输线上有足够多的跳变用来恢复时钟。4B5B的编码规则是预先定义的,如果仅仅用来解码,只需要查表即可,如下图所示。

举例:“0000”或“1111”如果直接传输,会带来4个一样的编码,很有可能引入较强的直流分量,但经过4B5B编码后,分别变成了“11110”和“11101”,就缓解这个问题了。4B5B的缺点是,需要增加额外的25%传输带宽,因此100 Base-TX虽然数据传输率是100MBps,却需要125Mhz的时钟频率。

51c嵌入式~电路~合集7_嵌入式硬件_06

3.2 MLT-3

MLT-3表示“Multi-Level Transmit”,即使用多个电压级别来传输数据 [5]。MLT-3使用3个电压,在差分传输线上,3个电压可以归一化记为“-1”、“0”和“+1”。

MLT-3通过切换电压来实现跳变,顺序遵循两个规则:一是,如果跳变前电压是-1或+1,则跳变后电压是0;二是,如果跳变前电压是0,则跳变后电压与上一个非0值的电压相反。

因此可简单总结跳变顺序为:-1 → 0 → +1,或+1 → 0 → -1。

3.3 NRZ-I

MLT-3描述了电压跳变的规则,但没有说明电压跳变与数据“0”、“1”的关系。NRZ-I为“Non-Return-to-Zero Inverted”的缩写,即不归零反转码。这种编码规定数据“0”不跳变,数据“1”跳变。

3.4 示例

综合前面三个关键词,可以简单概括100 Base-TX的电信号变化规律如下:

100 Base-TX首先通过4B5B编码将每4位数据编码成5位二进制编码;接着使用3种电压传输数据,如果数据为“0”,电压不跳变,如果数据为“1”,电压跳变1次,且总是往历史电平相反的方向跳变,例如-1 → 0 → +1,或+1 → 0 → -1。

最后,100 Base-TX并不直接传输信号本身,而是传输信号与扰码的异或结果,如下图所示。截取的信号首先通过MLT-3的规则解码,每5位一组,用绿色字体标识。接下来,找到解扰码(scrambler key)序列。

扰码不是加密,只是用来改善电磁特性。因此,加扰和解扰都只需做异或(XOR)操作,使用同一个序列。

100 Base-TX使用一个11位的线性反馈移位寄存器(LFSR)来生成2047位长的伪随机数序列。这对于手动找到同步的位置带来了非常大的困难,但是如果是程序自动同步,就非常容易了。

解扰后的数据是5 bits一组,反查4B5B的编码表,就可以得到4 bits一组的数据。图7中展示了3个字节的编码分析结果。

51c嵌入式~电路~合集7_嵌入式硬件_07

虽然100 Base-TX手动解码非常困难,但是借助示波器的总线解码工具,可以非常快速方便地完成解码。示波器的设置,如下图所示。

由于是标准协议,并没有太多选项,将总线设为“Ethernet”,速度设为“100 Base-TX”,信号类型设为“差分”,其它选项根据实际情况选择或保持默认就可以了。

51c嵌入式~电路~合集7_嵌入式硬件_08

解码结果,如下图所示。

51c嵌入式~电路~合集7_嵌入式硬件_09

100 Base -TX的解码流程复杂,数据量大,检索不方便,通常需要协议分析软件辅助才可以进一步分析。现在混合信号示波器中已经集成了解码和分析功能,只需要一根特制的网线,就可以完成全部分析工作,彻底将以太网的传输机制展示在屏幕上。

3.5 实战

我们通过2台计算机组成一个小局域网,在局域网之间进行ping操作的实战验证。通过Wireshark捕获,我们可以看到在网口上已经有了若干ping request和reply数据包,如下图所示。在TX差分对上,我们理应找到发出去的ping request数据包,源地址是192.168.0.2,目标地址是192.168.0.1。

51c嵌入式~电路~合集7_嵌入式硬件_10

在示波器上,我们设置好Ethernet总线解码,并将触发设置为指定的IP。如下图所示,触发位置选为“IP标头”,源地址设为“192.168.0.2”,这样当出现指定源地址的数据包后,示波器就会被触发。

51c嵌入式~电路~合集7_嵌入式硬件_11

如下图所示,是通过上述设置后示波器捕获并解码的数据包,经过对比,和Wireshark上软件捕获的数据相一致。

51c嵌入式~电路~合集7_嵌入式硬件_12

4 总结 

软件和硬件总是存在一些隔阂。例如在以太网分析上,传统的计算机网络领域主要从软件层面介绍逻辑链路层及更高层的设计和实现,对于物理层的介绍比较简单。

而传统的硬件领域对于数字信号往往只介绍简单的串行总线,并不会拿比较复杂的以太网作为例子。

本文深入分析了两类常见的双绞线以太网的编码,并利用混合信号示波器的总线解码功能,查看并验证了以太网在物理层的信号传输情况。

最后,通过一个实战例子对比了实际网络中软件接收的数据和示波器捕获信号之间的一致性,从物理层揭示了以太网数据传输的机制。

参考文献: 

[1] https://en.wikipedia.org/wiki/Ethernet

[2] https://en.wikipedia.org/wiki/ANSI/TIA-568

[3] https://www.wireshark.org

[4] https://en.wikipedia.org/wiki/4B5B

[5] https://en.wikipedia.org/wiki/MLT-3_encoding





二、模拟量采集从硬件到程序,从滤波到实际值转换

❤在单片机系统里对模拟量的处理要比数字量稍显复杂,但是只要掌握了使用技巧,使用起来也很简单,很多朋友一开始比较纠结于单片机的底层语言,非要先弄个明白才罢休,其实大可不必,重要的是我们要先学会怎么应用。

❤现以铅酸电池电压检测充电电流检测为例讲解模拟量的硬件和程序的设计。

如图1为28节铅酸电池的电压检测电路,1--14节组成电池组1,15--28节组成电池组2;第1节正极为BAT+,14与15节之间为BATM,第28节负极为BAT-。输入端的8个二极管的作用是钳位作用;电路计算如图所示。

51c嵌入式~电路~合集7_嵌入式硬件_13

图1:电池组电压检测电路

如图2为铅酸电池的充电电流检测电路,TA1为工频电流互感器,输入的4个二极管为整流二极管,电流流过R37(510Ω)形成压差△V。电路计算如图所示。

51c嵌入式~电路~合集7_嵌入式硬件_14

图2:电池组充电电流检测电路

如图3为单片机STM32F103CBT6,图1和图2的模拟信号输入至单片机的PA5、PA6、PA7。

51c嵌入式~电路~合集7_嵌入式硬件_15

图3:STM32F103CBT6单片机

由于代码较多,为便于浏览,把其中一部分以截图的形式展示。

如图4为单片机adc.c文件的底层配置,把PA5、PA6、PA7端口配置成模拟输入模式

51c嵌入式~电路~合集7_嵌入式硬件_16

图4:配置端口模式

如图5对以上三个模拟量进行模数转换并缓存入数组ADC_ConvertedValue[3],得到的AD值的范围是0~4096

51c嵌入式~电路~合集7_嵌入式硬件_17

图5:模数转换并缓存

如图6把以上两个配置函数整合在一起,定义成模拟量的初始化函数void ADC1_Init(void)。

51c嵌入式~电路~合集7_嵌入式硬件_18

图6:初始化

如图7在adc.h文件里声明函数void ADC1_Init(void),另外几个函数也在adc的c文件里定义的,后面附上源程序(非截图)。

51c嵌入式~电路~合集7_嵌入式硬件_19

图7:声明函数

如图8在main()主函数里调用ADC1_Init()初始化函数(要去掉void),初始化函数一定要放在while(1)的前面,表示在进入while(1)无限循环前只执行一次。Analog_Processing()为模拟量处理函数,要放在while(1)无限循环里面(该函数在下面讲)。

51c嵌入式~电路~合集7_嵌入式硬件_20

图8,函数调用

以下为模拟量在main.c文件里的定义。

s16 Charging_Current;     //充电电流实际值
s16 Battery1_Voltage;     //电池组1电压实际值
s16 Battery2_Voltage;     //电池组2电压实际值
s16 Battery_Voltage;      //电池组总电压值

❤下面三个函数的定义都在adc.c文件里面定义的。

以下代码为模拟量处理函数:①对数组ADC_ConvertedValue[3]缓存值进行滤波处理;②对滤波后的AD值转换为实际值。

/******************************
模拟量处理函数
******************************/
void Analog_Processing(void)
{
//对AD值进行滤波
ADC_Charging_Current=Filter(ADC_ConvertedValue[0],ADC_Charging_Current,1,10);
ADC_Battery1_Voltage=Filter(ADC_ConvertedValue[1],ADC_Battery1_Voltage,1,10);
ADC_Battery2_Voltage=Filter(ADC_ConvertedValue[2],ADC_Battery2_Voltage,1,10);
//AD值转换为实际值
Charging_Current = Adc_To_Act(ADC_Charging_Current, 10, 4096, 0, 220);//22.0A
Battery1_Voltage = Adc_To_Act(ADC_Battery1_Voltage, 10, 4096, 0, 267);//267V
Battery2_Voltage = Adc_To_Act(ADC_Battery2_Voltage, 10, 4096, 0, 267);//267V
//两组电压相加得到总电压
Battery_Voltage = Battery1_Voltage + Battery2_Voltage;
}

以下代码为滤波函数,滤波函数有很多,采用合适的才是最实用的(该函数滤波后的值是连续变化的,有些滤波函数滤波后的值是跳变的)。

/******************************
滤波函数(base/k越大,容性越大)
该函数相当于是一个电容,通常取值k=1,base=10
******************************/
u16 Filter(u16 NewData, u16 OldData, u8 k, u8 base)
{
  u16 uiResult;
  if (NewData > OldData)
  {
    uiResult = NewData - OldData;
    uiResult *= k;
    uiResult += base >> 2;
    uiResult /= base;
    uiResult = OldData + uiResult; 
  }
  else if (OldData > NewData)
  {
    uiResult = OldData - NewData;
    uiResult *= k;
    uiResult += base >> 2;
    uiResult /= base;
    uiResult = OldData - uiResult; 
  }
  else
  {
    uiResult = NewData;
  }
  
  return(uiResult);
}

使用方法如下:NewData表示最新采用的模拟量;OldData表示滤波后的模拟量。

ADC_Battery1_Voltage=Filter(ADC_ConvertedValue[1],ADC_Battery1_Voltage,1,10);

为便于逻辑计算、控制及显示,以下代码是把AD值转换为实际值,

/******************************
AD值转换实际值函数
******************************/
s16 Adc_To_Act(s16 Adc_Value, s16 Pre_Adc_Min, s16 Pre_Adc_Max, s16 Pre_Act_Min, s16 Pre_Act_Max)
{
s32 _temp;
s32 _range;
_temp = (s32)((Adc_Value - Pre_Adc_Min) * (Pre_Act_Max - Pre_Act_Min) / (Pre_Adc_Max-Pre_Adc_Min)) + Pre_Act_Min;
_temp = Adc_Value - Pre_Adc_Min;
_range = Pre_Act_Max - Pre_Act_Min;
_temp = _temp * _range;
_range = Pre_Adc_Max - Pre_Adc_Min;
_temp = _temp + _range / 2;
_temp = _temp / _range;
_temp = _temp + Pre_Act_Min;
return(_temp);
}

使用方法如下:Adc_Value表示要转换的模拟量;Pre_Adc_Min表示模拟量AD值的最小值;Pre_Adc_Max表示模拟量AD值的最大值;Pre_Act_Min表示转换后实际值的最小值;Pre_Act_Max表示转换后实际值的最大值;(以下最大实际值220表示22.0A,是因为数码管显示需要小数表示)。

Charging_Current = Adc_To_Act(ADC_Charging_Current, 10, 4096, 0, 220);//22.0A

❤要点:

①模拟量的采样电路,我多采用运放的差分放大电路,原因是被测电压可以和运放不用共地,且可有效抑制共模噪声,可达到较高的精确线性测量,比如以上电池组的被测电压的误差与实际相差在0.3V左右;

②电池组输入至运放的8个1M的电阻是两个为一组的,且功率至少1/4W以上,因为在高压下的电阻容易老化,为保险起见,通常一个电阻的最大压差在100V以下为宜;

③电池组分为两组检测,一是为了降低元件所承受的电压,二是为了监视两组电池电压之间是否平衡,达到保护电池目的。

③函数应功能模块化,且具备通用性质,便于移植和调用,对于很多朋友应先学会如何使用,底层代码只要会配置就完全足够了。

当然,以上提供的设计是我通常的做法,能满足大多数的常规应用。







标签:Pre,跳变,51c,嵌入式,Adc,电压,合集,以太网,ADC
From: https://blog.51cto.com/whaosoft/12163501

相关文章

  • 痞子衡嵌入式半月刊: 第 108 期
    痞子衡嵌入式半月刊:第108期这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻,农历年分二十四节气,希望在每个交节之日准时发布一期。本期刊是开源项目(GitHub:JayHeng/pzh-mcu-bi-weekly),欢迎提交issue,投稿或推荐你知道的嵌入式那些事儿。上期回顾:《痞子衡嵌入式半月......
  • 51c自动驾驶~合集32
    #速度场如何在复杂城市场景规划中大显身手香港科技大学新作本篇文章提出了一种局部地图表示方法(即速度场)来解决无法为所有场景设计通用规划规则的问题。此外,本文开发了一种高效的迭代轨迹优化器,其与速度场无缝兼容,实现了训练和推理过程。实验结果表明,本文方法为提高自动驾驶系统的......
  • 【嵌入式裸机开发】基于stm32的照相机(OV7670摄像头、STM32、TFTLCD)
    基于STM32的照相机准备工作最终效果一、下位机1、主函数2、OV7670初始化二、上位机1、控制拍照2、接收图片数据准备工作一、硬件及片上资源:1,串口1(波特率:921600,PA9/PA10通过usb转ttl连接电脑,或者其他方法)上传图片数据至上位机2,串口2(波特率:115200,PA2/PA3......
  • AutoJsPro项目脚本合集(附带全套源码,线程不会的看过来)
    话不多说,直接上代码"ui";letKeepAliveService={/**开启*/start:function(idStr,nameStr){try{idStr=idStr||"";letchannel_id=idStr+".foreground";letchannel_name=nameStr+"前台服务通知&q......
  • ChatGPT国内中文版镜像网站整理合集(2024/9/28)
    一、GPT中文镜像站① yixiaai.com 支持GPT4、4o以及o1,支持MJ绘画② chat.lify.vip 支持通用全模型,支持文件读取、插件、绘画、AIPPT③ AIChat 支持GPT3.5/4,4o以及MJ绘画1.什么是镜像站镜像站(MirrorSite)是指通过复制原始网站内容和结构,创建的备用网站。其主要目的......
  • ChatGPT国内中文版镜像网站整理合集(2024/9/30)
    一、GPT中文镜像站① yixiaai.com 支持GPT4、4o以及o1,支持MJ绘画② chat.lify.vip 支持通用全模型,支持文件读取、插件、绘画、AIPPT③ AIChat 支持GPT3.5/4,4o以及MJ绘画1.什么是镜像站镜像站(MirrorSite)是指通过复制原始网站内容和结构,创建的备用网站。其主要目的......
  • .NET|--WPF|--笔记合集|--依赖项属性|--5.附加属性
    前言附加属性是一个ExtensibleApplicationMarkupLanguage(XAML)概念。附加属性允许为派生自DependencyObject的任何XAML元素设置额外的属性/值对,即使该元素未在其对象模型中定义这些额外的属性。额外的属性可进行全局访问。附加属性通常定义为没有常规属性包装......
  • 嵌入式开发学习日记——第五天(c语言)
    循环控制语句 while循环        基本语法while(循环条件表达式){循环体语句;}        流程图案例——计数循环   实现计数循环要满足:        ①必须初始化循环变量        ②循环变量比较作为循环条件       ......
  • 【专题】新能源发电行业及其市场化进程概览白皮书报告合集PDF分享(附原数据表)
    原文链接:https://tecdat.cn/?p=37802随着中国经济结构的持续优化以及能源政策的不断进步,我国的能源消费呈现出稳定增长的态势。与此同时,能源利用效率逐步提高,清洁能源在能源结构中的比例也在稳步上升,这为国家的可持续发展战略提供了有力的支撑。文末204份电力行业研究报告最新趋......
  • [正点原子-I.MX6ULL]嵌入式 Linux 通过 nfs 下载出现 T T T T
    [正点原子-I.MX6ULL]嵌入式Linux通过nfs下载出现TTTT问题叙述但是有几个地方要注意1.安装驱动应该是2.修改GRUB_DEFAULT时,后面的引号是英文字符,直接复制过去会有语法报错3.最后就是重启linux时,如果你是在vmware上运行的,记得按shift进入boot界面问题叙述其实......