硬件电路设计之51单片机(2)
声明:绘制原理图和PCB的软件为嘉立创EDA。根据B站尚硅谷嵌入式之原理图&PCB设计教程学习所作个人用笔记。
目录
一、原理图详解
1、TypeC接口
(1)TypeC接口介绍
(2)TypeC原理图
2、5V转3.3V
3、单片机电源开关
4、单片机
5、排针
6、晶振电路
7、复位按键
8、MCU供电指示灯
9、程序下载模块
10、 通信指示灯
11、P0上拉电阻
(1)推挽输出
(2)开漏输出
12、自动冷启动
二、PCB布局
1、板框尺寸
2、排针布局
3、 模块布局规划
4、位号丝印调整
5、程序下载模块布局
6、单片机与晶振布局
三、PCB布线
1、TypeC接口和5V转3.3V模块布线
2、差分信号的布线
3、VIN_5V到VCC的布线
4、P1口的布线
5、制作铜箔LOGO
6、铺铜
7、检测DRC
8、遇到的问题
一、原理图详解
51核心板原理图
1、TypeC接口
(1)TypeC接口介绍
TypeC接口引脚分布
TypeC接口上下两排引脚功能都是关于中心点对称的,因此TypeC接口正插还是反插,都不影响引脚的接触顺序,所以大大简化了使用过程。
A1,A12,B1,B12:接地;
A2,A3,A10,A11,B2,B3,B10,B11:分别是两个差分信号对,它们是为了高速数据传输所准备的,这个项目不需要高速数据传输,了解即可;
A4,A9,B4,B9:VBUS相当于电源正极;
A5,B5:两个CC引脚,是在TypeC协议中用来协商充电协议的,还可以协商设备身份(判断主从设备,靠CC引脚上的电阻来判断);
A6,A7,B6,B7:USB2.0数据传输;
A8,B8:用来传输视频或者音频信号,有些扩展屏幕就是TypeC一线通,一根线就可以完成充电、控制和视频传输,否则有些扩展屏幕就得单独接视频线,单独接电源线。
实物照片
由于有些引进在实际项目中不需要用到,而且两排引脚不方便焊接,因此实际项目中我们采用16Pin引脚的TypeC接口。
这里把GND和VBUS都焊在一起了,因此从外面数只有12个引脚,但是还是按实际内部16引脚来称呼。具体实物也只有一排引脚,更方便实物焊接了。
(2)TypeC原理图
具体元器件的参数和型号,可以通过查看数据手册,和之前介绍的引脚相对应,即可拿来使用。
引脚1,12:直接接地;
引脚2,11:连接到电源总线上VIN_5V上,中间的F1是一个自恢复保险丝,电容C2和C5一端接地,另一端接电源VIN_5V,这样是为了让电源电压更加平稳,它们有过滤杂波(滤波)的作用。
引脚3,9:SBU1-2用来传输视频或者音频信号,这里用不到,加上非连接标识。
引脚4,10:CC1和CC2连接5.1kΩ的厚膜贴片电阻后,接地。
引脚5,6,7,8:接到网络标签USB_D+和USB_D-上,这样其他模块就可以通过同名网络标签直接连接到这里。
外壳引脚13,14:也接地,为了防止手上的静电影响USB的数据传输,损坏后面的元件;
自恢复保险丝的工作原理
传统保险丝经过熔断后,就需要更换保险丝,但是自恢复保险丝是由聚合物和导电颗粒组成,当产生高温时,聚合物会膨胀,导致导电颗粒间的距离增加,从而断开了导电路径;当温度降低时,聚合物会收缩,又使得导电颗粒重新接近,重建导电路径。
充电协议:
当一个充电设备(上游设备,如快充头)连接到一个受电设备(下游设备,如手机)时,充电头首先通过CC引脚检测连接的设备类型和方向。
如果检测到下游设备符合规范(例如CC引脚上有5.1k欧姆的电阻值到接地),充电头才会把这个设备识别成需要充电的设备,会默认提供5V的初始电压进行供电。这是所有USB充电协议的基础行为,以确保设备可以安全启动和进行初步通信。
当5V的供电开始一段时间后,如果CC引脚连接的是快充协议的一些其他芯片,这时候才会跟充电头进行快充的协商。
2、5V转3.3V
之所以需要5V转3.3V,是因为在以后的嵌入式开发中,有很多传感器或者芯片的工作电压是3.3V。
这里采用的芯片是低压差线性稳压器(LDO),如果我们选择了一个固定输出为3.3V的LDO,无论输入电压是5V、6V还是8V,它都能稳定输出3.3V。它只能降压,无法升压。
3、单片机电源开关
这个开关是一个自锁开关,用来控制单片机的供电,右边的VCC是给单片机供电的电源网络。
前面的电源模块能提供5V和3.3V的供电,自锁开关又控制着一个新的电源网络VCC,后面会把MCU(单片机芯片)挂在VCC下面,这样就可以通过自锁开关,控制VIN_5V和VCC两个电源之间的导通,来控制单片机的电源。
4、单片机
芯片选型
芯片选用STC公司生产的89C52RC,这个芯片拥有丰富的网络学习资源,适合新手学习单片机。封装类型选择QFP封装,适合在PCB上安装。
批量导出芯片引脚为网络标签步骤
将pinName内容,复制到netname中,然后再用查找替换功能,去掉小数点,再把其他多余的名字去掉,最后将文件保存,再导入到立创EDA即可。
5、排针
排针主要是用来引出单片机引脚,方便接入一些外部设备。
6、晶振电路
中间矩形就是晶振元件,它在特定的电路接法下,可以产生机械振动,然后在它的输出引脚产生一定波动的电压波,如下所示。
现代CPU的运作需要依靠时序波动的电压信号来捕捉上升沿,并在这些上升沿到达时推动芯片内部指令的执行,即每次来临一次上升沿,代码就会继续往下执行一步。
1MHz意味着每秒钟,晶振震动次数为一百万次。
晶振一般分为无源晶振和有源晶振。
无源晶振:必须依赖外部电路的支持才能进行稳定的震动,无源晶振和外部组成的让它可以震动的电路我们称为时钟电路。这里电路设计使用的是无源晶振,因此需要在原理图上再接两个电容。
有源晶振:元件内部自成一个时钟电路,我们只需给它的VCC引脚,GND引脚做相应的连接,就可以从第3个引脚上捕获震荡信号。
7、复位按键
复位按键的作用就是通过单片机的RST引脚,来做一个状态重置(复位)的操作。
单片机的复位引脚(RST)需要一个持续一定时间长度的高电平信号才能识别并执行复位操作。
在上电的瞬间,电容处于充电状态,此时电容相当于一根导线,RST引脚得到高电平。
在上电一段时间后,电容充满,此时电容相当于短路,这个时候RST将得到低电平。
按下开关后,RST引脚相当于直接接到VCC,此时RST引脚将是高电平,这个状态维持几十us,MCU就会清空当前状态,重新回到第一行代码开始执行。
电容的作用:电容在默认情况下是充电状态,当按下开关后,RST会短暂的和VCC直连,但是开关会很快弹起来,这时候的RST就会和VCC断开,为了保证有充足的高电平的维持时间来激活复位状态,就需要开关断开后,仍有一个电容能给RST继续供电。
电阻的作用:防止按下开关后,VCC和GND直连,导致电源短路。
8、MCU供电指示灯
这个指示灯也是VCC供电,和MCU芯片一致,只有当MCU芯片有电时,这个指示灯才会亮。
9、程序下载模块
其中RXD就是接收数据的引脚,TXD是发送数据的引脚。
当给芯片5V供电时,需要给V3引脚接一个电容,然后接地。VCC为3.3V时V3需短接到VCC。
RTS引脚和后面的自动冷启动电路相关。
TypeC接口有两个网络USB_D+和USB_D-,这两个接口主要是电脑通过USB接口用来传输数据的。
USB主要是通过一种差分信号的方式来进行传输数据,但是STC89C52RC这个芯片不支持差分协议,所以需要通过CH340N这个芯片将差分信号转化成STC89C52RC芯片可以支持的TTL信号。这样电脑才可以和芯片传输数据。
同理,芯片也可以通过TTL信号传送数据到CH340N,再转成差分信号的形式将数据发送给电脑。
TTL信号(单端信号):所谓单端信号,指的是只用一根导线来发送信号。这种发送信号的方式非常简便。如果A芯片要给B芯片发送数据,那么它只需要将导线上的电平一会儿置高,一会儿置低就可以了。
单端信号传输方式主要适用于短距离的板上通信,而不宜用于线缆通信。这主要是因为单端信号的抗干扰能力较弱。
例如,如果我们使用一根导线将电脑和单片机连接起来传输数据,而在此过程中如果不小心触碰了这根导线,可能会导致身上的静电释放到导线上。这种静电干扰可能会改变导线上的电平,从而导致接收端接收到错误的数据。
差分信号:为了克服单端信号易受干扰的问题,我们可以采用差分信号传输技术。这种技术涉及将发送端的原始信号转变为两个信号:D+ 和 D-。这两个信号通过两根导线传输,其中D+ 的波形与原始信号几乎相同,而 D- 是 D+ 的反相。这种方式可以显著增强信号的抗干扰能力。
在接收端,信号的还原过程非常直接。系统通过比较 D+ 和 D- 两条线上的电压差来确定原始信号的状态。如果 D+ 的电压高于 D-,则认定为数字信号 "1";相反,如果 D+ 的电压低于 D-,则认定为数字信号 "0"。
我们再将D+和D-两根导线绞在一起,这样它们就组成了双绞线。
在这种情况下,如果外部环境产生静电干扰,两根导线D+和D-会受到几乎相同的影响。这种干扰对两条线的影响是对称的,因此不会改变D+与D-之间的相对电压差。结果是,尽管存在干扰,接收端仍然能够准确地还原出发送端的原始信号。这展示了差分信号传输在保持数据完整性方面的强大能力,即使在高干扰的环境中也能维持信号的准确传输。
通过CH340N芯片的数据手册,能够查找到CH340N芯片连接到单片机的参考电路。通过参考电路,可以大致知道芯片的接法。
由于MCU的引脚RXD和TXD已经备注了P30和P31的网络标签,因此这里需要给这个引脚再弄一个网络标签,使得两个不同名字的网络标签可以连接到同一根引脚上。
在放置中,找到短接标识,然后将这个标识放置到两个引脚上。
然后再短接标识的另一端再延长导线,插入两个新的网络标签,这样就可以实现上面要求。
10、 通信指示灯
二极管右端接电源,左端接数据传输引脚,由于数据传输是一系列的高低电平,所以当RXD或者TXD为低电平时,两个二极管就会发光,当RXD或者TXD为高电平时,两个二极管就会熄灭。
因此可以通过二极管是否快速的闪烁来判断是否正在进行数据传输。
11、P0上拉电阻
在MCU芯片中,以P开头的引脚,都是有输出功能的,也就是芯片内部能够控制引脚是高电平还是低电平,一般分为两种控制方式:推挽输出和开漏输出。
(1)推挽输出
通过控制上下两个MOS管的导通和断开,来使得输出引脚是高电平或低电平,还是高阻态。
推挽输出又叫推拉输出,当引脚为高电平时,电流像是被从芯片中推出来一样;当引脚为低电平时,电流像是被从拉进电流中,因此得名。
(2)开漏输出
开漏输出只控制一个接地的MOS管,当MOS管断开,引脚为高阻态;当MOS管闭合,引脚为低电平。
这个开关在没有芯片干预情况下,默认是开路状态,且电流一定从MOS管的漏极流入的,因此这种控制输出方式就称呼为开漏输出。
之前的电路是无法通过引脚输出高电平的,因此这里增加一个上拉电阻连接到VCC来输出高电平。
当MOS管闭合时,跟之前电路一样,引脚是低电平状态;
当MOS管断开时,外设就会直接通过电阻拉到了VCC,因此外设收到的电平就是高电平。
开漏输出的优点:当芯片是5V供电时,像推挽输出,就只能通过引脚输出5V的高电平,但是开漏输出可以通过上拉电阻连接到一个3.3V的电源,因此开漏输出可以不局限于芯片供电电压。
在数据手册中显示P0引脚都是开漏输出模式的引脚,因此需要上拉电阻连接到高电平,来使得引脚能够输出高电平。
12、自动冷启动
单片机烧录软件过程中,必须要先把单片机断电后,再重新给电源,在开机启动中,单片机的P3.0\RXD引脚会检测是否有别的芯片传输过来的下载命令,只有检测到下载命令才会开始下载程序,如果下载成功,就会直接执行新的代码,如果在开机后没有检测到新的代码,它就会执行上次烧录进单片机的程序。
这种强行断电,再上电的开机方式,就被称为冷启动。如果按照上面的方法,每次都要按下两次开关,一次给单片机断电,一次给单片机上电,就会非常麻烦。
因此通过设计自动冷启动电路去检测CH340N芯片,如果检测到了下载程序的信号,它就会自动完成单片机掉电再上电的过程,这样每次下载程序就不需要按动开关了。
RTS(Request To Send,发送请求)引脚的作用是向其他设备发出“我有数据要发送,请准备接收”的信号,这种操作称为硬件控制流,它的作用是为了让下游接收数据的对象,能够把正在工作的内容停下来,做好接收数据的准备。
当芯片准备好发送数据时,RTS引脚会进入激活状态。如果在RTS旁边有一个#(即RTS#),或者名字上方有一个横杠,这通常表示它是以低电平激活的。
默认情况下RTS是高电平,当有数据要发送时,RTS会变成低电平,当数据发送完成后,RTS又会变回高电平。
当电脑点击下载程序按钮时, 开始跟CH340N芯片进行通讯时,这个RTS引脚就会被拉到低电平,MCU只有在上电时,才会响应CH340N。如果说MCU一直不断电,不重新上电,则RTS引脚会一直是低电平。
自动冷启动电路原理分析:
P沟道MOS管导通条件:源极接VIN_5V,栅极接RTS,剩下的就是漏极。
当RTS为5V时,MOS管的源极和漏极不会导通;
当RTS为0V时,源极和漏极电流就会导通。
(1)当RTS为高电平时,左边MOS管不会导通,右边MOS管会导通,此时灯泡(MCU)处于上电状态,电流如上图所示。
(2)当RTS为0V时,左边MOS管会导通,刚开始电容会处于充电状态,相当于一根导线,这时可以认为右边MOS管的栅极也是5V,因此右边MOS管在此时是截止状态,右边灯泡(MCU)就会被断电。
(3)当RTS为0V,电容充满电后,此时的电容相当于一个断路,后面的10欧姆可忽略,两个10kΩ并联相当于5k欧姆,与47kΩ串联,通过计算可得到右边MOS管的栅极电压为0.4V左右,因此这个MOS管会被导通,此时的灯泡又重新处于上电状态。
(4)当RTS恢复到5V时,右边MOS管仍处于导通状态,灯泡不会受到影响,左边的MOS管会瞬间截止,电容会对并联47kΩ的电阻一直放电,直到放空为止。
这个电路的缺陷在于不能短时间的连续下载程序,不然的话电容电还没有放完,又重新充电的话,右边的MOS管也就不会截止,自动冷启动电路就会失效,因此这个时候就需要电源开关,来手动给MCU断电和上电。
MOS管栅极连接10Ω电阻的作用:
MOS管的栅极具有一定的寄生电容,连接线和MOS管自身也会有一定的寄生电感。如果栅极的连接上没有任何的阻尼,这些寄生的电气效应可能会组成一个LC震荡电路,从而引起振铃现象。
在MOS管的栅极去串联一个电阻,以此来削弱振铃效应。
寄生电容:是电路中非设计意图的电容效应,由导体间电场耦合形成,常见于高频电路,可能导致信号干扰或性能下降。
寄生电感:是指在电路设计中未刻意引入,但由于导体布局或物理特性而自然产生的电感。
也是因为MOS管上的寄生电容,MOS管的栅极在电平拉高或拉低时,会遇到一个平台期,这个现象与米勒效应有关,因此也被称为米勒平台。它导致MOS管从开启转到闭合时的时间间隔延长。
也不能串联太大的电阻,这是因为随着我们串联电阻的阻值的升高,米勒平台会相应地延长。
通常,在栅极上串联10到100Ω的电阻是一种常见做法,这不仅可以有效抑制振铃效应,还能防止过长的米勒平台导致的开关延迟。在实践中,通常可以首选10Ω的电阻。
二、PCB布局
PCB的完整设计之前已经有详细介绍过了完整流程,因此本篇文章只写之前没有出现的一些问题。
1、板框尺寸
3个角小圆弧尺寸
大圆弧尺寸
板框整体尺寸
2、排针布局
排针方位需要跟上图保持一致,同时放置底层。
选中两排针,垂直指定中心间距分布为29mm,同时需要按上面排针中心左右居中。
同时对两个排针进行锁定功能,这样后面拖动其他元器件时,就不会影响这两个排针。
3、 模块布局规划
4、位号丝印调整
选中位号,然后按Ctrl+F,就会出现查找栏,点击查找全部,就能够实现对所有位号的选中。
将字体线宽和高度修改到上图所示,单位为mil,这样就能够让位号变得更小,更方便布局。
5、程序下载模块布局
这是布局完成后的芯片CH340N内部的VIN_5V线,它的背面会有一些蓝色信号线经过它,信号线的电压是会在0V和5V直接来回变化的,就有可能产生一些电磁感应在5V导线上,会让VIN_5V有一个上下波动,所以这个模块的供电尽管之前就用了电容滤波处理,但是这里还是继续得用电容滤波处理。
滤波电容离芯片越近越好,防止线太长,中间被其他信号线得电磁感应影响。
电源线一定要先经过电容,再到达芯片的电源引脚,这样可以让电容滤波效果达到最优。
6、单片机与晶振布局
原则上是两个连接的引脚越近越好,但是这里上面芯片需要流出位置来引出线,因此C12位置需要靠下一些。
所有的GND引脚都是通过一个铜皮来进行连接的,但是晶振下方是最好不要做铺铜处理的,目的是为了防止晶振和GND网络互相干扰。所以需要对晶振区域做一个禁止铺铜的设置。
用多边形工具将晶振区域围住,然后将该区域选择为禁止区域,然后将铺铜勾选上,既可以将晶振区域设置为禁止铺铜区域。
同时,选中图层,然后将属性中的图层改成多层,这样底层也能称为禁止铺铜区域。
三、PCB布线
1、TypeC接口和5V转3.3V模块布线
首先可以将GND的飞线隐藏,防止干扰到其他飞线的布线。
电流最早是从TypeC接口流入的,因此先从TypeC模块开始布线(快捷键Alt+W)。
从原理图可知,所有的电流都将从Type模块流向F1自恢复保险丝和它所在的这段导线,因此需要充分考虑这段导线的线宽和最大能承载的电流。
F1自恢复保险丝跳闸电流为1A,通过PCB走线载流计算器可以计算得到线宽最好要大于11.83mil,又因为要流出冗余,因此这段导线的线宽设置为20mil。
电源线一般都是先经过大电容滤波,再经过小电容滤波,先过滤低频噪音,再过滤高频噪音。
Type接口为了实现能正反插,有两个电源入口,因此需要将另外一个电源入口的导线连接到第一个电源入口处,但是这里明显需要绕弯,因此通过过孔(Alt+V)方式来连接。
同样的,过孔也需要考虑最大承载电流,通过PCB过孔载流计算器,可计算得到12mil孔径、18um厚度的孔壁铜厚,在10摄氏度下能承载的最大电流为1.462A,但是为了给实际施工有更大的冗余,通过经验判断,这里的孔径(过孔内径)可设置为20mil。
但是内孔径和外孔径的差值需要大于5mil,因此这里设置外孔径为30mil。
2、差分信号的布线
差分信号的布线与平时的导线布线有所不同。
两条差分导线的长短误差需要在合理的范围内。
如果布线完成后,上图提示没有显示符合规则的绿色,需要通过等长调节去调节它们之间的长度误差。
3、VIN_5V到VCC的布线
电源模块通过Type接口引入VIN_5V供电,通过自动冷启动电路变成VCC_SW,然后再通过电源开关变成VCC,最后的VCC才是给MCU供电的电源。
4、P1口的布线
P1口的飞线这里已经完全拧在了一起,所以需要先把线拧回来,再把导线接过去。
如上图所示,可以通过过孔和绕线的方式,将它们的排序给拧回来。
其他飞线难处理的,可以通过两个过孔穿过其他线来布线,这里就不多加说明了。布线完如下所示。
5、制作铜箔LOGO
插入文本,然后放置顶层。
然后复制一个放到边上。将边上这个文字切换到顶层阻焊层。
然后将当前工作图层,也切换到顶层阻焊层,然后将两部分文字重合。
将这部分文字区域设置为禁止铺铜区域,且该区域的圆角半径设置为1mm。
最后将该区域复制一份,将复制后的区域翻面。
将工作区设置为底层,然后将复制后的区域和复制前的区域重合,最后在铺铜以后就能得到文字的铜箔LOGO了。
6、铺铜
当对正反面铺铜完之后,还有GND飞线残留就可以在飞线的源头铺铜上,放置过孔的GND。
当放置了GND的过孔后,飞线就会自然消失。
晶振区域,禁止铺铜的部分,也可以通过在旁边的铜板上加一个GND的过孔,然后将晶振中需要连接GND的部分,连接到过孔上,这样飞线就可以完成了。
7、放置缝合孔
当觉得有些铜皮上的狭窄处难以通过大电流时,就可以在对应的铜皮上添加GND过孔,来增加它的载流能力。
设置完成后,框选整个板子。
板子上就会增加很多GND过孔,来增加铜皮的载流能力,尤其是上下两层铜皮,它们之间的载流能力。
7、检测DRC
完成所有的步骤后,最后记得再检测以下DRC,以防出现问题。
8、遇到的问题
CH340N灌电问题
当闭合自锁开关后,MCU供电指示灯亮,但是断开开关后,供电指示灯还是亮着的,因此通过排查故障,发现问题产生原因是CH340N充上电空闲时,RXD和TXD引脚都维持着5V电压,然后连接到MCU就会给芯片供电,让芯片的VCC引脚产生了3.3V电压。
通过查阅数据手册,可以找到解决问题的电路,将CH340N原理图转化成下图所示。
然后是PCB增加三个元件进去后,需要重新调整。
首先,将之前的顶层和底层的铺铜区隐藏,然后再开始布线。
CH340N的RXD和TXD引脚这里连接都需要删除,重新布线。
布线完成后,记得重新铺铜和DRC检查。
第二版本完成后,将核心板插上开发板后又遇到了第二个问题。
在自锁开关断开后,将核心板子插上开发板上,结果电源灯还是亮了,并且给开发板供电上了。
5V排针是一直有电源的,当MCU某个引脚为低电平时,就可能和5V排针形成下面的电路,导致5V能直接通过这个电路给MCU供电。
解决办法也很简单,只需要将5V排针接到自锁开关控制的VCC,而不是由TypeC接口供电的VIN_5V。同时,3.3V的排针也需要连接到由VCC控制的电源。
原理图的解决办法:只需要将5V转3.3V模块和排针模块的5V电压来源,由VIN_5V改成自锁开关控制的VCC。
PCB重新布线即可,然后需要重新来一遍泪滴,铺铜操作。
相关文章:
硬件电路设计之51单片机(2)
声明:绘制原理图和PCB的软件为嘉立创EDA。根据B站尚硅谷嵌入式之原理图&PCB设计教程学习所作个人用笔记。 目录 一、原理图详解 1、TypeC接口 (1)TypeC接口介绍 (2)TypeC原理图 2、5V转3.3V 3、单片机电源开…...
Deeplizard 深度学习课程(一)—— Pytorch 和 Tensor 简介
前言 该pytorch笔记参考deeplizard官方网站课程,有相应视频和博客,链接如下: deeplizardhttps://deeplizard.com/learn/video/v5cngxo4mIg 1.Pytorch 简介 PyTorch 是一个深度学习框架和一个科学计算包。PyTorch 的科学计算方面主要是 PyTo…...
Delphi HMAC算法
1. 前言 今天做一个三方接口,接口文档描述签名采用MD5,但是实际测试过程中,始终校验不通过,经过和三方沟通,才知道采用的是HMAC-MD5。由于Delphi7没有对HMAC的支持,则采用XE版本来支持。本次使用Delphi XE …...
Ubuntu服务器性能调优指南:从基础工具到系统稳定性提升
一、性能监控工具的三维应用 1.1 监控矩阵构建 通过组合工具搭建立体监控体系: # 实时进程监控 htop --sort-keyPERCENT_CPU# 存储性能采集 iostat -dx 2# 内存分析组合拳 vmstat -SM 1 | awk NR>2 {print "Active:"$5"MB Swpd:"$3"…...
深度解析C++开源OCR引擎:架构、编译优化与工业级部署指南
1. 引言:OCR技术演进与现状分析 光学字符识别(OCR)技术经历了从传统模式识别到深度学习的三代发展: 第一代:基于模板匹配(1970s-1990s) 第二代:特征提取+分类器(1990s-2010s) 第三代:端到端深度学习(2010s-至今) 当前工业界主流方案呈现"双轨制"发展态势…...
关于Newtonsoft.Json
历史 Newtonsoft.Json(也称为 Json.NET)是由 James Newton - King 开发的一个开源的 JSON 处理库,它于 2007 年首次发布。在早期,.NET 平台缺乏一个强大且灵活的 JSON 处理工具,Newtonsoft.Json 应运而生,…...
Spark-Sql编程(三)
一、数据加载与保存 通用方式:使用spark.read.load和df.write.save,通过format指定数据格式(如csv、jdbc、json等),option设置特定参数(jdbc格式下的url、user等),load和save指定路…...
CTF--好像需要管理员
一、原网页: 二、步骤: 1.扫描: 发现:robots.txt 2.打开robots.txt: 3.打开resul.php: 4.代码解析: if ($_GET[x]$password) //检查通过 URL 参数 x 传递的值是否等于变量 $password 的值 详…...
耀圣控制设备有限公司总经理李雨蔓的创业之路
破浪者李雨蔓:从零到行业标杆的铿锵之路 在浙江永嘉这片被誉为“中国泵阀之乡”的热土上,一位86年出生的女性企业家,用十年光阴书写了一段白手起家的传奇。她,是一曲关于勇气、智慧与匠心的赞歌。从技术员到行业标杆的缔造者&…...
Spring Boot JPA 开发之Not an entity血案
项目状况介绍 项目环境 JDK 21Spring Boot 3.4.3Hibernate: 6.6.13.Final项目描述 因为是微服务架构,项目层级如下 project-parent project-com project-A … project-X 其中: project-parent定义依赖库的版本project-com 定义了一些公用的方法和配置,包括持久层的配置。…...
什么是车规级MCU?STM32也能上车规级场景?
一、车规级MCU的定义 车规级MCU(Microcontroller Unit)是专为汽车电子系统设计的微控制器芯片,集成CPU、存储器、外设接口等功能模块,用于实现车辆控制、数据处理和实时响应。其核心特点包括: 高可靠性:需在…...
vue3.2 + element-plus 实现跟随input输入框的弹框,弹框里可以分组或tab形式显示选项
效果 基础用法(分组选项) 高级用法(带Tab栏) <!-- 弹窗跟随通用组件 SmartSelector.vue --> <template><div class"smart-selector-container"><el-popover :visible"visible" :w…...
go 指针接收者和值接收者的区别
go 指针接收者和值接收者的区别 指针接收者和值接收者的区别主要有两点: Go 中函数传参是传值,因此指针接收者传递的是接收者的指针拷贝,值接收者传递的是接收者的拷贝---在方法中指针接收者的变量会被修改,而值接收者的成员变量…...
部署qwen2.5-VL-7B
简单串行执行 from transformers import Qwen2_5_VLForConditionalGeneration, AutoProcessor from qwen_vl_utils import process_vision_info import torch, time, threadingdef llm(model_path,promptNone,imageNone,videoNone,imagesNone,videosNone,max_new_tokens2048,t…...
Go:测试
go test 工具 go test是 Go 语言包的测试驱动程序 ,包依据特定约定组织 。包目录中以_test.go结尾的文件是go test编译对象,而非go build的编译目标 。 特殊测试函数 在*_test.go文件中有三种特殊函数 : 功能测试函数:以Test为…...
用微信小程序制作一个性行为同意协议系统
用微信小程序制作一个性行为同意协议系统 用微信小程序制作一个性行为同意协议系统,具备查询、修改、增加和演示的Web功能。首先,我需要明确这个系统的核心功能和法律合规性。性同意是一个敏感且法律相关的话题,必须确保系统的设计符合法律法…...
leetcode 122. Best Time to Buy and Sell Stock II
题目描述 这道题可以用贪心思想解决。 本文介绍用动态规划解决。本题分析方法与第121题一样,详见leetcode 121. Best Time to Buy and Sell Stock 只有一点区别。第121题全程只能买入1次,因此如果第i天买入股票,买之前的金额肯定是初始金额…...
FairyGUI图标文字合批失败的原因
1)FairyGUI图标文字合批失败的原因 2)为什么Cubemap的内存占用超高 3)如何找到网格某个切面的中心点 4)为什么SafeZone在倒屏后方向相反 这是第428篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了…...
C/C++ 通用代码模板
✅ C 语言代码模板(main.c) 适用于基础项目、算法竞赛或刷题: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> #include <math.h>// 宏定义区 #define MAX_N 1000 #defi…...
void MainWindow::on_btnOutput_clicked()为什么我在QT里面没有connect,也能触发点击效果
在 Qt 中,即使你没有显式调用 connect 函数,某些信号(如按钮的 clicked() 信号)仍然可以触发槽函数。这是因为 Qt 提供了一种自动连接机制,称为 自动连接(Auto-Connection)。以下是可能的原因和…...
基于YOLO11的车牌识别分析系统
【包含内容】 【一】项目提供完整源代码及详细注释 【二】系统设计思路与实现说明 【三】系统数据统计与可视化分析支持 【技术栈】 ①:系统环境:Windows/macOS/Linux ②:开发环境:Python 3.8 ③:技术栈&#x…...
openwebui搭建mcp
1、升级ollama https://github.com/ollama/ollama/blob/main/docs/faq.md curl -fsSL https://ollama.com/install.sh | shOllama 启动后,设置外网访问_ollama 外部访问-CSDN博客 ubuntu安装deepseek-CSDN博客 sudo vim /etc/systemd/system/ollama.serviceEnvi…...
邀请函 | 知从科技邀您共赴2025上海车展
2025上海车展将于4月23日至5月2日在国家会展中心(上海)盛大举行。本届车展以 “科技智驾未来”为主题,共同展示新能源汽车、智能驾驶等领域的最新技术与成果。 知从科技将携行业领先的软件产品与技术服务亮相于本次展览会,全方位…...
ESP32开发工具链选择指南:ESP-IDF vs PlatformIO vs Arduino
1. 引言 ESP32作为乐鑫(Espressif)推出的一款高性能Wi-Fi & Bluetooth双模芯片,凭借其强大的性能和丰富的生态,在物联网(IoT)领域广受欢迎。然而,开发ESP32时面临的一个关键问题是…...
【JAVA】bat文件启动jar场景获取bat文件路径的方法
一、推荐方案:参数传递法 步骤1:修改BAT脚本 echo off java -jar -Dbat.file"%~f0" your-app.jar %*关键参数说明: %~f0:获取BAT文件的完整路径%*:传递所有原始参数 步骤2:Java代码获取参数 …...
OpenLayers:extent与view extent 介绍
一、范围的概念 1.什么是范围? 在Openlayers中范围(Extent)是用于表示地理空间区域的一种概念。它通常由一个数字数组构成,数组中的内容为:[最小x坐标,最小y坐标,最大x坐标,最大y坐…...
Python开发一个简单的软件系统
用Python语言实现,具备录入学生成绩、查询成绩和显示所有成绩等基本功能。以下是代码: # 用于存储学生成绩的字典,键是学生姓名,值是成绩 student_scores {} # 录入学生成绩的函数 def input_scores(): name input("…...
小草GrassRouter多5G聚合路由设备在应急公安消防行业的解决方案及重要作用
小草GrassRouter多5G聚合路由设备在应急、公安、消防等行业的解决方案及重要作用主要体现在以下几个方面,这些领域对通信的高可靠性、高带宽、低时延需求尤为突出,尤其在复杂环境或突发事件中需要保障指挥调度的实时性和稳定性: ** 一、行业…...
冒泡排序、插入排序、快速排序、堆排序、希尔排序、归并排序
目录 冒泡排序插入排序快速排序(未优化版本)快速排序(优化版本)堆排序希尔排序归并排序各排序时间消耗对比 冒泡排序 冒泡排序核心逻辑就是对数组从第一个位置开始进行遍历,如果发现该元素比下一个元素大,则交换位置,如果不大,就…...
JVM知识
JVM 内存模型 JVM的内存模型介绍一下 根据 JVM8 规范,JVM 运行时内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。 JVM的内存结构主要分为以下几个部分: 方法区:存放类对象 Java 虚拟机栈:存放方法之间的调…...
Docker 中多个容器之间的通信
在 Docker 中,多个容器之间的通信可以通过以下几种主要方式实现,具体选择取决于网络需求、隔离性及管理复杂度: 一、自定义 Bridge 网络(推荐) 通过创建自定义的 Docker 网络,容器可以加入同一网络并通过容…...
docker desktop for windows 登录国内镜像仓库
在使用 Docker Desktop for Windows 时,如果你希望连接到国内的 Docker 镜像仓库(例如阿里云、腾讯云等),你可以通过配置 Docker 镜像加速器来实现。以下是一些步骤和示例,帮助你设置 Docker Desktop for Windows 以使…...
【blender小技巧】使用blender的Cats Blender Plugin插件将3D人物模型快速绑定或者修复为标准的人形骨骼
文章目录 前言绑定或者修复人形骨骼1、下载模型2、导入模型到blender中3、删除无用的相机和灯光3、导出模型并在unity中使用 专栏推荐完结 前言 有时候我们下载的3D人物模型,可能不带骨骼信息,或者带一些错乱的骨骼信息。这时候我们就可以使用blender将…...
视频压缩技术学习(不高明版本)
1. 压缩的本质与核心目标 视频压缩的核心在于去除冗余信息,包括空间冗余(相邻像素相关性)、时间冗余(连续帧相似性)以及视觉冗余(人眼感知特性)。通过算法优化,在保持可…...
在Vue项目中查询所有版本号为 1.1.9 的依赖包名 的具体方法,支持 npm/yarn/pnpm 等主流工具
以下是 在Vue项目中查询所有版本号为 1.1.9 的依赖包名 的具体方法,支持 npm/yarn/pnpm 等主流工具: 一、使用 npm 1. 直接过滤依赖树 npm ls --depth0 | grep "1.1.9"说明: npm ls --depth0:仅显示直接依赖…...
【Web前端技术】第一节—HTML简介
做出一个属于自己的网站! 云边有个稻草人-个人主页 为你,千千万万遍 ——哈桑 目录 一、网页 1.什么是网页? 2. 什么是 HTML? 3. 网页的形成 二、常用浏览器 1. 常用浏览器 2. 浏览器内核 三、Web标准(重点&…...
LINUX 416 路由转发1
那干脆先配置一下 boot目录必然是标准分区 配路由转发实验 路由器 计划新建3个虚拟机,分别是主机、节点a、节点b,都时间仅主机模式 路由器网卡IP: 节点a路由表 这次装载了附件,桌面安装模式,不用像 最小化安装模式那样折…...
【音视频开发】第四章 SDL音视频渲染
【音视频开发】第四章 SDL音视频渲染 文章目录 【音视频开发】第四章 SDL音视频渲染一、简介1.什么是 SDL 二、Windows 环境搭建三、SDL 子系统四、Window 显示1.SDL 视频显示函数简介2.窗口渲染结构体 五、SDL 事件1.通用事件结构体 SDL_Event2.事件类型 六、SDL 线程1.常用线…...
音频基础概念
声音 物体在一定的振动频率下产生了声音。声音可以被分解为不同频率不同强度正弦波的叠加。 声音三要素 声调 音调: 由发声体振动的频率决定,频率越高(振动越快)则音调越高,听起来就越“刺耳”,反之音调越低、听起…...
rust编程学习(二):复合数据类型
复合数据类型是由其他类型组合而成的类型。Rust的复合数据类型有元组、数组、结构体、枚举等, 通过一些简单的例子帮助大家快速了解Rust复合类型。 1 元组类型 元组类型是由一个或多个类型的元素组合成的复合类型,使用小括号“()”把所有元素放在一起。…...
学习笔记十四——一文看懂 Rust 迭代器
🌀 一文看懂 Rust 迭代器 📚 目录导航 什么是迭代器?为什么 Rust 到处都在用它?Rust 迭代器的底层逻辑是什么?适配器 vs 消费者:谁是主角?常见适配器:加工数据的全能工厂常见消费者…...
H.265硬件视频编码器xk265代码阅读 - 帧内预测
源代码地址: https://github.com/openasic-org/xk265 帧内预测具体逻辑包含在代码xk265\rtl\rec\rec_intra\intra_pred.v 文件中。 module intra_pred() 看起来是每次计算某个4x4块的预测像素值。 以下代码用来算每个pred_angle的具体数值,每个mode_i对应…...
贪心算法学习C++
1,跳跃游戏II 题目连接:45. 跳跃游戏 II - 力扣(LeetCode) 【题目描述】 在给定的一个nums数组中,nums[i]表示从当前i位置最多可以向后跳跃nums[i]个位置。问跳跃到最后 数组最后一个元素的最少跳跃次数?…...
Go 语言实现的简单 CMS Web
Go 语言实现的简单 CMS Web 以下是一个使用 Go 语言实现的简单 CMS Web 演示代码示例, 包含基本的内容管理功能: 项目结构 ### 项目结构 cms-demo/ ├── main.go ├── handlers/ ├── models/ ├── views/ │ ├── home.html │ ├─…...
Zookeeper选举机制
一、选举机制的核心原理 ZooKeeper的选举机制基于ZAB协议(ZooKeeper Atomic Broadcast),这是一种为分布式系统设计的原子广播协议。其核心目标是快速选举出Leader节点,并确保数据一致性。以下为关键原理: 1. 选举触发…...
安卓自定义build的apk文件名
android studio打包应用默认生成的apk名称是:app-release.apk 。 如果我们想修改生成的apk文件名,比如想放入版本号,比如想放入渠道号,又比如和打包时间有关联,那我们就需要能自动化生成可自定义的apk文件名ÿ…...
【Web APIs】JavaScript 操作多个元素 ④ ( 表格全选复选框案例 )
文章目录 一、核心要点解析 - 表格全选复选框案例1、案例需求2、复选框设置3、获取 全选复选框 和 普通复选框4、设置 全选复选框 逻辑5、设置 普通复选框 逻辑 二、完整代码示例1、代码示例2、执行结果 一、核心要点解析 - 表格全选复选框案例 1、案例需求 在表格中 , 设置 多…...
Lua 第6部分 函数
在 Lua 语言中,函数( Function )是对语句和表达式进行抽象的主要方式。 函数既可以用 于完成某种特定任务(有时在其他语言中也称为过程 ( procedure )或子例程 ( s ubroutine) ), 也可以只是进行…...
OpenCv高阶(五)——SIFT特征提取
目录 SIFT特征提取 一、原理核心步骤 1. 尺度空间极值检测 2. 关键点定位 3. 方向分配 4. 描述子生成 二、SIFT算法具有的特点 三、SIFT特征提取器的简单使用 1、特征检测器的创建 2、 检测图像中的关键点 3、绘制关键点 4、计算关键点描述符 四、SIFT 算法的优缺点…...
基于Spring MVC的客户端真实IP获取方案解析
文章目录 基于Spring MVC的客户端真实IP获取方案解析概述核心方法解析代码实现工作流程 IP获取优先级策略IP有效性验证异常处理与日志使用场景注意事项扩展建议 基于Spring MVC的客户端真实IP获取方案解析 概述 在Web应用开发中,准确获取客户端真实IP地址是常见的…...