只发PCB电路相关31  随时更新~~

一、关于PCB

印刷电路板(PCB)是人类技术中具有里程碑意义的工具。为什么呢?这是因为当今在每一个电子设备中都隐藏着它的身影。就像其他历史中的伟大发明一样,PCB也是随着历史车轮前进而逐步成熟的,至今已经有130年的发展历史,它是工业革命车轮中最为靓丽的一道风景。

    PCB成为优化电子设备生成工艺的手段,曾经那些使用手工制作的电子设备不得不PCB来替代了,这都是因为电路板上将会集成更多的功能。如下图分别是1968年计算器中的电路板和现代计算机主板。

嵌入式~PCB专辑31_引脚

下文介绍关于PCB十个有趣的事情。

颜 色

    即使对于一些并不了解PCB是干什么的人来说,也大体知道PCB的样子是什么。它们至少看起来给人一种具有一种传统风格,那就是它的绿色。这个绿色实际是阻焊层玻璃油漆透光的颜色。阻焊层虽然名称是阻焊,但它的主要功能还是保护覆盖的线路免受潮湿、灰尘的侵扰。

    至于阻焊层为何选择绿色,主要的原因被认为绿色是军队防护标准,军方设备中PCB最早使用了阻焊层来保护电路在野外的可靠性,绿色是军队里自然保护色。还有人认为最初的阻焊油漆所使用的环氧树脂的颜色本身就呈现绿色,于是一直沿用至今。

    现在阻焊层的颜色已经是多种多样的,有黑色、红色、黄色等等。毕竟绿色并不是工业标准。如下图中五颜六色的PCB。

嵌入式~PCB专辑31_引脚_02

谁先发明了PCB

    如果问谁发明了印刷术,这个殊荣当属中国北宋年间的毕昇。但最早的印刷电路板则需要追踪到奥地利工程师 Charles Ducas在1920年提出了使用墨水导电(在底板上打印黄铜电线)的概念。他借助于电镀技术制作在绝缘体表面直接生成导线,制作出PCB的原型。

    最初电路板上的金属导线是黄铜,一种铜和锌的合金。这种颠覆性的发明消除了电子线路的复杂连线工艺,并保证电路性能的可靠性。这个工艺直到第二次世界大战结束才开始进入实际应用阶段。下图是Charles Ducas和他的印刷电路板专利。

嵌入式~PCB专辑31_引脚_03

标 记

    在绿色电路板还存在着大量白色标记。很多年来,人们弄不明白为何这些白色印刷标记被叫做“丝网层”。它们主要是用来标识电路板上元器件的信息,以及其他与电路板相关的内容。

    这些信息最早是通过丝网印刷的方式打印在电路板上,所以被称为丝网层,现在则使用特殊的喷墨打印机来完成。这些信息可以帮助电路工程师来检查电路板中是否存在故障。

嵌入式~PCB专辑31_G1_04

元器件

    电路板的功能主要通过将元器件按照原理图有效连接起来完成的。每一个元器件都有它们独特的功能。即使在电路板上紧密相邻的两个器件都有可能千差万别。器件的种类基本上包括有电阻、二极管、晶体管、电容、继电器、电池、变压器以及其它的林林总总(比如保险丝、电感、电位器等等)

无处不在

    毫不夸张的说,PCB无处不在。从计算机到数字钟表、从微波炉到电视机以及立体音响系统。只要是电子物品和设备,超过99%的可能性其中包含有PCB。所以我们有可能想当然认为,如果没有PCB可能任何电子设备就无法运行。

美国航空航天局(NASA)

    在美国国家航空航天管理局(NASA)的很多项目中就使用了一些石破天惊的技术,其中在上个世纪60年代,NASA就在阿波罗11号火箭上使用了PCB,这是因为基于PCB的电子设备重量轻、耗电小。那可是人类最伟大的时刻,第一次将宇航员送到了月球上。这其中就有PCB的功劳。

嵌入式~PCB专辑31_嵌入式硬件_05

表面封装焊接技术(SMT)

    表面安装焊接技术使得PCB走进了现代化。相比于以前插孔安装方式,这种表面安装焊接技术则先使用特殊胶水将器件粘贴在PCB上,然后在通过特殊的回流焊将器件与电路板进行电气连接

快速成型PCB

    在对电路进行局部实验过程中,可以借助于面包板、洞洞板以及其他的通用电路板进行测试。随着表面封装元器件增多,也有新型的快速PCB成型技术出现,比如热转印PCB、3D打印多层电路板等。下图是3D打印电路板。

嵌入式~PCB专辑31_电子设备_06

柔软PCB

    PCB并不都是平直坚硬的,还有很多柔软的PCB工作在很多紧密电子设备中,它们往往构成了很多活动关节中的应用电路,或者组成多层立体电路。下图是透明柔软的PCB。

嵌入式~PCB专辑31_G1_07

世界上最大的PCB

    世界上最大的一块PCB来自于英国Johnson电子公司的这条应用在无人太阳能飞机上的柔性多层电路板。它长约28米。是由柔软聚酰亚胺作为基地制作的电路板有着更好的散热、更高的导电密度。这么长的的电路板是通过特殊的生产工艺分段进行腐蚀制作的。最长的柔性电路板如下图所示。

嵌入式~PCB专辑31_G1_08

二、6个实例电路分析雷击浪涌的防护

#电子设备雷击浪涌抗扰度试验标准 

电子设备雷击浪涌抗扰度试验的国家标准为GB/T17626.5(等同于国际标准IEC61000-4-5 )。

标准主要是模拟间接雷击产生的各种情况:

  (1)雷电击中外部线路,有大量电流流入外部线路或接地电阻,因而产生的干扰电压。

  (2)间接雷击(如云层间或云层内的雷击)在外部线路上感应出电压和电流。

  (3)雷电击中线路邻近物体,在其周围建立的强大电磁场,在外部线路上感应出电压。

  (4)雷电击中邻近地面,地电流通过公共接地系统时所引进的干扰。

嵌入式~PCB专辑31_电子设备_09

标准除了模拟雷击外,还模拟变电所等场合,因开关动作而引进的干扰(开关切换时引起电压瞬变),如:

  (1)主电源系统切换时产生的干扰(如电容器组的切换)。

  (2)同一电网,在靠近设备附近的一些较小开关跳动时的干扰。

  (3)切换伴有谐振线路的晶闸管设备。

  (4)各种系统性的故障,如设备接地网络或接地系统间的短路和飞弧故障。

标准描述了两种不同的波形发生器:一种是雷击在电源线上感应生产的波形;另一种是在通信线路上感应产生的波形。

这两种线路都属于空架线,但线路的阻抗各不相同:在电源线上感应产生的浪涌波形比较窄一些(50uS),前沿要陡一些(1.2uS);而在通信线上感应产生的浪涌波形比较宽一些,但前沿要缓一些。后面我们主要以雷击在电源线上感应生产的波形来对电路进行分析,同时也对通信线路的防雷技术进行简单介绍。

#模拟雷击浪涌脉冲生成电路的工作原理 

嵌入式~PCB专辑31_电子设备_10

上图是模拟雷电击到配电设备时,在输电线路中感应产生的浪涌电压,或雷电落地后雷电流通过公共地电阻产生的反击高压的脉冲产生电路。4kV时的单脉冲能量为100焦耳。

图中Cs是储能电容(大约为10uF,相当于雷云电容);Us为高压电源;Rc为充电电阻;Rs为脉冲持续时间形成电阻(放电曲线形成电阻);Rm为阻抗匹配电阻Ls为电流上升形成电感。

雷击浪涌抗扰度试验对不同产品有不同的参数要求,上图中的参数可根据产品标准要求不同,稍有改动。

基本参数要求:

(1)开路输出电压:0.5~6kV,分5等级输出,最后一级由用户与制造商协商确定;

(2)短路输出电流:0.25~2kA,供不同等级试验用;

(3)内阻:2 欧姆,附加电阻10、12、40、42欧姆,供其它不同等级试验用;

(4)浪涌输出极性:正/负;浪涌输出与电源同步时,移相0~360度;

(5)重复频率:至少每分钟一次。

嵌入式~PCB专辑31_G1_11

雷击浪涌抗扰度试验的严酷等级分为5级:

1级:较好保护的环境;

2级:有一定保护的环境;

3级:普通的电磁骚扰环境、对设备未规定特殊安装要求,如工业性的工作场所;

4级:受严重骚扰的环境,如民用空架线、未加保护的高压变电所。

X级:由用户与制造商协商确定。

嵌入式~PCB专辑31_G1_12

图中18uF电容,可根据严酷等级不同,选择数值也可不同,但大到一定值之后,基本上就没有太大意义。

10欧姆电阻以及9uF电容,可根据严酷等级不同,选择数值也不同,电阻最小值可选为0欧姆(美国标准就是这样), 9uF电容也可以选得很大,但大到一定值之后,基本上就没有太大意义。

#共模浪涌抑制电路 

防浪涌设计时,假定共模与差模这两部分是彼此独立的。然而,这两部分并非真正独立,因为共模扼流圈可以提供相当大的差模电感。这部分差模电感可由分立的差模电感来模拟。

为了利用差模电感,在设计过程中,共模与差模不应同时进行,而应该按照一定的顺序来做。首先,应该测量共模噪声并将其滤除掉。采用差模抑制网络(Differential Mode Rejection Network),可以将差模成分消除,因此就可以直接测量共模噪声了。

如果设计的共模滤波器要同时使差模噪声不超过允许范围,那么就应测量共模与差模的混合噪声。因为已知共模成分在噪声容限以下,因此超标的仅是差模成分,可用共模滤波器的差模漏感来衰减。对于低功率电源系统,共模扼流圈的差模电感足以解决差模辐射问题,因为差模辐射的源阻抗较小,因此只有极少量的电感是有效的。

嵌入式~PCB专辑31_引脚_13

对4000Vp以下的浪涌电压进行抑制,一般只需采用LC电路进行限流和平滑滤波,把脉冲信号尽量压低到2~3倍脉冲信号平均值的水平即可。电感很容易饱和,因此,L1、L2一般都采用一种漏感很大的共模电感。

用在交流,直流的都有,通常我们在电源EMI滤波器,开关电源中常见到,而直流侧少见,在汽车电子中能够看到用在直流侧。

加入共模电感是为了消除并行线路上的共模干扰(有两线的,也有多线的)。由于电路上两线阻抗的不平衡,共模干扰最终体现在差模上。用差模滤波方法很难滤除。

共模电感到底需要用在哪。共模干扰通常是电磁辐射,空间耦合过来的,那么无论是交流还是直流,你有长线传输,就涉及到共模滤波就得加共模电感。例如:USB线好多就在线上加磁环。 开关电源入口,交流电是远距离传输过来的就需要加。通常直流侧不需要远传就不需要加了。没有共模干扰,加了就是浪费,对电路没有增益。

电源滤波器的设计通常可从共模和差模两方面来考虑。共模滤波器最重要的部分就是共模扼流圈,与差模扼流圈相比,共模扼流圈的一个显著优点在于它的电感值极高,而且体积又小,设计共模扼流圈时要考虑的一个重要问题是它的漏感,也就是差模电感。通常,计算漏感的办法是假定它为共模电感的1%,实际上漏感为共模电感的0.5% ~4%之间。在设计最优性能的扼流圈时,这个误差的影响可能是不容忽视的。

 漏感的重要性 

漏感是如何形成的呢?紧密绕制,且绕满一周的环形线圈,即使没有磁芯,其所有磁通都集中在线圈“芯”内。但是,如果环形线圈没有绕满一周,或者绕制不紧密,那么磁通就会从芯中泄漏出来。这种效应与线匝间的相对距离和螺旋管芯体的磁导率成正比。

共模扼流圈有两个绕组,这两个绕组被设计成使它们所流过的电流沿线圈芯传导时方向相反,从而使磁场为0。如果为了安全起见,芯体上的线圈不是双线绕制,这样两个绕组之间就有相当大的间隙,自然就引起磁通“泄漏”,这即是说,磁场在所关心的各个点上并非真正为0。共模扼流圈的漏感是差模电感。事实上,与差模有关的磁通必须在某点上离开芯体,换句话说,磁通在芯体外部形成闭合回路,而不仅仅只局限在环形芯体内。

一般CX电容可承受4000Vp的差模浪涌电压冲击,CY电容可承受5000Vp的共模电压冲击。正确选择L1、L2和CX2、CY参数的大小,就可以抑制4000Vp以下的共模和差模浪涌电压。但如果两个CY电容是安装在整机线路之中,其总容量不能超过5000P,如要抑制浪涌电压超过4000Vp,还需选用耐压更高的电容器,以及带限幅功能的浪涌抑制电路。

所谓抑制,只不过是把尖峰脉冲的幅度降低了一些,然后把其转换成另一个脉冲宽度相对比较宽,幅度较为平坦的波形输出,但其能量基本没有改变。

两个CY电容的容量一般都很小,存储的能量有限,其对共模抑制的作用并不很大,因此,对共模浪涌抑制主要靠电感L1和L2,但由于L1、L2的电感量也受到体积和成本的限制,一般也难以做得很大,所以上面电路对雷电共模浪涌电压抑制作用很有限。

嵌入式~PCB专辑31_G1_14

图(a)中L1与CY1、 L2与CY2,分别对两路共模浪涌电压进行抑制,计算时只需计算其中一路即可。Ø对L1进行精确计算,须要求解一组2阶微分方程,结果表明:电容充电是按正弦曲线进行,放电是按余弦曲线进行。但此计算方法比较复杂,这里采用比较简单的方法。

共模信号是一个幅度为Up、宽度为τ的方波,以及CY电容两端的电压为Uc,测流过电感的电流为一宽度等于2τ的锯齿波:

流过电感的电流为:

嵌入式~PCB专辑31_电子设备_15

上面公式是计算共模浪涌抑制电路中电感L和电容CY参数的计算公式,式中,Uc为CY电容两端的电压,也是浪涌抑制电路的输出电压,∆Uc为CY电容两端的电压变化量,但由于雷电脉冲的周期很长,占空比很小,可以认为Uc = ∆Uc,Up为共模浪涌脉冲的峰值,q为CY电容存储的电荷,τ为共模浪涌脉冲的宽度,L为电感,C为电容。

根据上面公式,假设浪涌峰值电压Up=4000Vp,电容C=2500p,浪涌抑制电路的输出电压Uc=2000Vp,则需要电感L的数值为1H。显然这个数值非常大,在实际中很难实现,所以上面电路对雷电共模抑制的能力很有限,此电路还需进一步改进。

差模浪涌电压抑制,主要是靠图中的滤波电感L1、L2 ,和滤波电容CX ,L1、L2滤波电感和CX滤波电容等参数的选择,同样可以用下面公式来进行计算。

嵌入式~PCB专辑31_G1_16

但上式中的L应该等于L1和L2两个滤波电感之和,C=CX,Uc等于差模抑制输出电压。一般,差模抑制输出电压应不大于600Vp,因为很多半导体器件和电容的最大耐压都在此电压附近,并且,经过L1和L2两个滤波电感以及CX电容滤波之后,雷电差模浪涌电压的幅度虽然降低了,但能量基本上没有降低,因为经过滤波之后,脉冲宽度会增加,一旦器件被击穿,大部分都无法恢复到原来的状态。

根据上面公式,假设浪涌峰值电压Up=4000Vp,脉冲宽度为50uS,差模浪涌抑制电路的输出电压Uc=600Vp,则需要LC的数值为14mH×uF。显然,这个数值对于一般电子产品的浪涌抑制电路来说还是比较大的,相比之下,增加电感量要比增加电容量更有利,因此最好选用一种有3个窗口、用矽钢片作铁芯,电感量相对较大(大于20mH)的电感作为浪涌电感,这种电感共模和差模电感量都很大,并且不容易饱和。 顺便指出,整流电路后面的电解滤波电容,同样也具有抑制浪涌脉冲的功能,如果把此功能也算上,其输出电压Uc就不能选600Vp,而只能选为电容器的最高耐压Ur(400Vp)。

#雷击浪涌脉冲电压抑制常用器件

嵌入式~PCB专辑31_G1_17

避雷器件主要有陶瓷气体放电管、氧化锌压敏电阻、半导体闸流管(TVS)、浪涌抑制电感线圈、X类浪涌抑制电容等,各种器件要组合使用。

气体放电管的种类很多,放电电流一般都很大,可达数十kA,放电电压比较高,放电管从点火到放电需要一定的时间,并且存在残存电压,性能不太稳定;氧化鋅压敏电阻伏安特性比较好,但受功率的限制,电流相对比放电管小,多次被雷电过流击穿后,击穿电压值会下降,甚至会失效;

半导体TVS管伏安特性最好,但功率一般都很小,成本比较高;浪涌抑制线圈是最基本的防雷器件,为防流过电网交流电饱和,必须选用三窗口铁芯;X电容也是必须的,要选用容许纹波电流较大的电容。

#气体放电管

嵌入式~PCB专辑31_电子设备_18

气体放电管指作过电压保护用的避雷管或天线开关管一类,管内有二个或多个电极,充有一定量的惰性气体。气体放电管是一种间隙式的防雷保护元件,它用在通信系统的防雷保护。

放电管的工作原理是气体间隙放电i当放电管两极之间施加一定电压时,便在极间产生不均匀电场:在此电场作用下,管内气体开始游离,当外加电压增大到使极间场强超过气体的绝缘强度时,两极之间的间隙将放电击穿,由原来的绝缘状态转化为导电状态,导通后放电管两极之间的电压维持在放电弧道所决定的残压水平,这种残压一般很低,从而使得与放电管并联的电子设备免受过电压的损坏。

气体放电管有的是以玻璃作为管子的封装外壳.也有的用陶瓷作为封装外壳,放电管内充入电气性能稳定的惰性气体(如氩气和氖气等),常用放电管的放电电极一般为两个、三个,电极之间由惰性气体隔开。按电极个数的设置来划分,放电管可分为二极、三极放电管。

陶瓷二极放电管由纯铁电极、镍铬钴合金帽、银铜焊帽和陶瓷管体等主要部件构成。管内放电电极上涂覆有放射性氧化物,管体内壁也涂覆有放射性元素,用于改善放电特性。

放电电极主要有杆形和杯形两种结构,在杆形电极的放电管中,电极与管体壁之间还要加装一个圆筒热屏,该热屏可以使陶瓷管体受热趋于均匀,不致出现局部过热而引起管断裂。热屏内也涂覆放射性氧化物,以进一步减小放电分散性。在杯形电极的放电管中,杯口处装有钼网,杯内装有铯元素,其作用也是减小放电分散性。

三极放电管也是由纯铁电极、镍铬钴合金帽、银铜焊帽和陶瓷管体等部件构成。与二极放电管不同,在三极放电管中增加了镍铬钴合金圆筒,作为第三极,即接地电极。

嵌入式~PCB专辑31_引脚_19

主要参数:

(1)直流击穿电压。此值由施加一个低上升速率(dv/dt=100V/s)的电压值来决定。

(2)冲击(或浪涌)击穿电压。它代表放电管的动态特性,常用上升速率为dv/dt=1kV/us的电压值来决定。

(3)标称冲击放电电流。8/20us波形(前沿8us,半峰持续时间20us)的额定放电电流,通常放电10次。

(4)标准放电电流。通过50Hz交流电流的额定有效值,规定每次放电的时间为1s,放电10次。

(5)最大单次冲击放电电流。对8/20us电流波的单次最大放电电流。

(6)耐工频电流值。对8/20us电流波的单次最大放电电流。对50Hz交流电,能经受连续9个周波的最大电流的有效值。

(7)绝缘电阻。对8/20us电流波的单次最大放电电流。对50Hz交流电,能经受连续9个周波的最大电流的有效值。

(8)电容。放电管电极间的电容,一般在2~10pF之间,是所有瞬变干扰吸收器件中最小的。

嵌入式~PCB专辑31_引脚_20

金属氧化物压敏电阻

嵌入式~PCB专辑31_电子设备_21

压敏电阻一般都是以氧化锌为主要成分,另加少量的其它金属氧化物(颗粒),如:鈷、猛、铋等压制而成。由于两种不同性质的物体组合在一起,相当于一个PN结(二极管),因此,压敏电阻相当于众多的PN结串、并联组成。

嵌入式~PCB专辑31_引脚_22

#超高浪涌电压抑制电路 

实例1

嵌入式~PCB专辑31_G1_23

上图是一个可抗击较强雷电浪涌脉冲电压的电原理图,图中:G1、G2为气体放电管,主要用于对高压共模浪涌脉冲抑制,对高压差模浪涌脉冲也同样具有抑制能力;VR为压敏电阻,主要用于对高压差模浪涌脉冲抑制。经过G1、G2和VR抑制后,共模和差模浪涌脉冲的幅度和能量均大幅度降低。

G1、G2的击穿电压可选1000Vp~3000Vp,VR的压敏电压一般取工频电压最大值的1.7倍。

G1、G2击穿后会产生后续电流,一定要加保险丝以防后续电流过大使线路短路。

实例2

嵌入式~PCB专辑31_引脚_24

增加了两个压敏电阻VR1、VR2和一个放电管G3,主要目的是加强对共模浪涌电压的抑制,由于压敏电阻有漏电流,而一般电子产品都对漏电流要求很严格(小于0.7mAp),所以图中加了一个放电管G3,使平时电路对地的漏电流等于0。G3的击穿电压要远小于G1、G2的击穿电压,采用G3对漏电隔离后,压敏电阻VR1或VR2的击穿电压可相应选得比较低,VR1、VR2对差模浪涌电压也有很强的抑制作用。

实例3

嵌入式~PCB专辑31_电子设备_25

G1是一个三端放电管,它相当于把两个二端放电管安装在一个壳体中,用它可以代替上面两个实例中的G1、G2放电管。除了二端、三端放电管之外,放电管还有四端、五端的,各放电管的用途也不完全相同。

实例4

嵌入式~PCB专辑31_电子设备_26

增加了两个压敏电阻(VR1、VR2),主要目的是为了隔断G1击穿后产生的后续电流,以防后续电流过大使输入电路短路,但由于VR1、VR2的最大峰值电流一般只有G1的几十分之一,所以,本实例对超高浪涌电压的抑制能力相对实例3要的抑制能力差很多。

实例5 直接在PCB板上制作避雷装置

嵌入式~PCB专辑31_嵌入式硬件_27

在PCB板上直接制作放电避雷装置,可以代替防雷放电管,可以抑制数万伏共模或差模浪涌电压冲击,避雷装置电极之间距离一般要求比较严格,输入电压为AC110V时,电极之间距离可选4.5mm,输入电压为AC220V时,可选6mm;避雷装置的中间电极一定要接到三端电源线与PCB板连接的端口上。

实例6 PCB板气隙放电装置代替放电管

在PCB板上直接制作气隙放电装置,正常放电电压为每毫米1000~1500V,4.5mm爬电距离的放电电压大约为4500~6800Vp,6mm爬电距离的放电电压大约为6000~9000Vp。

嵌入式~PCB专辑31_嵌入式硬件_28

#各种防雷器件的连接 

避雷器件的安装顺序不能搞错,放电管必须在最前面,其次是浪涌抑制电感和压敏电阻(或放电管),再其次才是半导体TVS闸流管或X类电容及Y类电容。

嵌入式~PCB专辑31_G1_29

三、一个地弹现象导致电源芯片工作不正常的案例

发现问题 

如下图1 ,产品其中一个供电是12V转3.3V的电路,产品发货50K左右以后,大约有1%的产品无法启动,经过解耦定位,问题出在下图中的电源芯片。

嵌入式~PCB专辑31_引脚_30

图1 12V 转3.3V电

 原因分析 

经过分析,问题最终定位在与PCB的布局和布线有关,其中涉及一个重要容易忽略的技术:地弹。如下图,左图是芯片内部的原理框图,右图是实际PCB中的布局图,在高频开关电源中,提供能量来源的有两个器件:输入电容Cvin和电感Lbuck;

(1)当高端开关闭合,低端开关断开时,电流的路径如红色箭头所示;

(2)当高端开关断开,低端开关闭合时,电流的路径如蓝色的箭头所示。

嵌入式~PCB专辑31_嵌入式硬件_31

图2 芯片内部的高低开关(左图)、实际的工作示意图(右图)

根据电磁感应定理:e=-dФ/dt=-d(Li)/dt=-Ldi/dt,由于红色和蓝色的环路面积变化较大,最终的体现会在低端开关和Cvin之间产生感应电动势。

厂商内部手册中显示,电源芯片满足以下两个的条件,就可以进入测试模式,测试模式下,电源芯片不工作,电源无输出。(1)pin5 引脚FB 电压大于3V;(2)pin6引脚COMP电压小于-0.5V;我们实际设计的PCB示意图如下图所示,环路1由Cvin、高端开关、L、Cbuck、负载组成,环路2由Cbuck、负载组成,环路3由低端开关、L、负载组成。其中环路面积变化A最大,同时电流突变最最迅速,实测引脚6 COMP 最高可达到-0.6V。如果FB引脚耦合的干扰达到3V,是可以将芯片进入到测试模式的,导致无法输出。

嵌入式~PCB专辑31_嵌入式硬件_32

解决方案 

问题的原因主要时两种开关状态时的环路面积不一样,导致感应电动势变化太大,导致芯片内部的逻辑混乱。重新布局后的措施如下:

(1)将输入电容、高低端开关尽量在同一水平线;

(2)将输出电容和负载尽量靠近用电端,消灭上图中的环路2导致的变化。同时可以应付用电设备的突发电流,突发电流大部分由输出电容供电,而不是通过电源芯片转换而来;

(3)重新布局后的环路面积变化=变化的长度 X 板厚度。板厚为2mm,此时的面积变化基本可以忽略不计。

嵌入式~PCB专辑31_G1_33

总结 

对于DCDC电源芯片,厂商不会对外公布其内部的具体逻辑电路,但是有一点可以肯定,高低开关两种不同的状态导致的环路面积变化,如果没有处理好,产生的地弹会影响内部逻辑,使得进入不确定的工作状态。

四、如何实现按键的短按、长按检测

在电子产品中经常用到按键,尤其是经常需要MCU判断短按长按这两种动作,本篇我们来专门聊下这个话题。

只谈理论太无聊,我们还是结合着实际应用来说明。例子默认的功能是蓝牙连接后不断的发送数据,从而不断的拍照。而实际中的遥控器通常是按一次按键,控制一次,我们在来实现该功能。

嵌入式~PCB专辑31_电子设备_34

板子上只有两个按键,一个是RESET按键,一个是DOWNLOAD按键,我们使用DOWNLAOD按键,按键的一端接GND,另外一端接CH573的PB22引脚。

嵌入式~PCB专辑31_G1_35

原理图中有一个NC的C5,但是实际板子上我却没有找到它,可能是版本不一致。

提前说明一下:CH573的代码里跑了TMOS(Task Management Operating System),可以理解为一个简单的操作系统,所以下面的代码一般的裸机代码看着略有不同,不过核心思想都是一样的,用在其他地方也很容易移植,只需要将其中的定时器部分改写即可。

最初我是这么做的,把PB22配置为上拉输入,开启下降沿中断,在中断服务函数里,启动一个事件,执行蓝牙发送。代码如下:

void Key_Init()
{
  GPIOB_ModeCfg( GPIO_Pin_22, GPIO_ModeIN_PU );
  GPIOB_ITModeCfg( GPIO_Pin_22, GPIO_ITMode_FallEdge );
  PFIC_EnableIRQ( GPIO_B_IRQn );
}
void GPIOB_IRQHandler( void )
{
  if(GPIOB_ReadPortPin(GPIO_Pin_22)==0)
  {
      GPIOB_ClearITFlagBit( GPIO_Pin_22);
      tmos_set_event( hidEmuTaskId, START_REPORT_EVT );
  }
}

这么写能工作,但是有问题,就是经常会出现按一下误判为多次按下。原因大家应该都清楚,因为按键存在抖动,所以一次按下有可能进入多次进入中断。

理想中的按下-弹起波形是这样的:

嵌入式~PCB专辑31_G1_36

但是实际由于按键抖动的存在,实际的波形可能是这样的:

嵌入式~PCB专辑31_引脚_37

不信的话你可以接上示波器看看,或者软件验证,比如在GPIO中断服务函数里,设置一个全局变量,让它每次进入中断后加1,按按键观察这个变量的值。

那么该如何消除抖动呢?一种方法是硬件消抖,即按键两端并联一个小电容(电容大小由按键的机械特性来决定),另外一种方法是我们今天要重点介绍的软件消抖。

方法一:常用的加延时函数

在中断服务函数中加一个比如10ms的延时函数,延时时间的长短取决于实际所用的按键特性,只要延时时间比抖动时间略大即可。原理很简单,加了延时就避开了抖动的这段时间,在延时之后判断引脚电平,如果为低电平就表示是按下。

void GPIOB_IRQHandler( void )
{
  if(GPIOB_ReadPortPin(GPIO_Pin_22)==0)
  {
      mDelaymS(10);
      if(GPIOB_ReadPortPin(GPIO_Pin_22)==0)
          tmos_set_event( hidEmuTaskId, START_REPORT_EVT );
      GPIOB_ClearITFlagBit( GPIO_Pin_22);
  }
}

这个方法很简单,但是不好的地方是延时占用MCU资源。尤其是这里的BLE应用,在中断服务函数中执行时间长会引起蓝牙连接中断,所以这里不能这么用,我实际测试当按键按快一点就很容易引起蓝牙连接中断。

方法二:加定时器

它的原理和方法一类似,只不过是不在中断服务函数中阻塞等待,而是用一个定时器,代码如下:

void GPIOB_IRQHandler( void )
{
  if(GPIOB_ReadPortPin(GPIO_Pin_22)==0)
  {
      GPIOB_ClearITFlagBit( GPIO_Pin_22);

      tmos_stop_task(hidEmuTaskId, START_DEBOUNCE_EVT);
      tmos_start_task(hidEmuTaskId, START_DEBOUNCE_EVT,16);
  }
}
if(events & START_DEBOUNCE_EVT)
    {
        if(GPIOB_ReadPortPin(GPIO_Pin_22)==0)
        {
            PRINT("short press\n");
            tmos_set_event( hidEmuTaskId, START_REPORT_EVT );
        }

        return (events ^ START_DEBOUNCE_EVT);
    }

它的逻辑是每次抖动的下降沿重新开启10ms定时器,在定时器时间到之后判断IO电平状态来判断按键是否按下。

需要注意的是:10ms定时器不是一个周期性的定时器,它是一次性的,即时间到了之后就停止计时了。另外每次进中断后先让定时器重新重头开始计时。如果大家用其他代码实现时要注意这两点。

此方法的好处不像加延时函数那样占用MCU资源。我实际测试这个方法可用,不会引起蓝牙连接中断。

以上介绍了使用中断的方式来判断按键短按,可以看到它判断的依据是按键按下(由高电平变到低电平)这个状态。下面在方法二的基础上我们来实现长按的检测,判断长按的依据是按下后持续的维持一段时间低电平。代码如下:

if(events & START_DEBOUNCE_EVT)
{
    if(GPIOB_ReadPortPin(GPIO_Pin_22)==0)
    {
        PRINT("short press\n");
        tmos_set_event( hidEmuTaskId, START_REPORT_EVT );
        tmos_start_task( hidEmuTaskId, START_LONGCHECK_TIMER,16 );
    }

    return (events ^ START_DEBOUNCE_EVT);
}
if(events & START_LONGCHECK_TIMER)
    {
        static int cnt=0;
        if(GPIOB_ReadPortPin(GPIO_Pin_22)==0)
        {
            cnt++;
            if(cnt>100)
            {
                PRINT("long press\n");
                tmos_stop_task( hidEmuTaskId, START_LONGCHECK_TIMER);
                cnt =0;
            }
            else
                tmos_start_task( hidEmuTaskId, START_LONGCHECK_TIMER,16 );
        }
        else
        {
            cnt=0;
            tmos_stop_task( hidEmuTaskId, START_LONGCHECK_TIMER );
        }

        return (events ^ START_LONGCHECK_TIMER);
    }

实现的逻辑是:当检测到短按时,再开启一个10ms定时器,在定时器到时之中判断电平状态,如果为低电平,就让cnt变量加1,否则cnt=0,当cnt>100,即低电平持续1s认为是长按。我在这里当判断到长按之后或者IO变高之后会停止掉这个定时器,否则周期定时,因为没必要一直开着定时器。

除了上述的中断方式,还可以使用轮询的方式来实现,代码如下:

void Key_Init()
{
  GPIOB_ModeCfg( GPIO_Pin_22, GPIO_ModeIN_PU );
}
if(events & START_KEYSCAN_EVT)
{
    KeyScan();
    tmos_start_task(hidEmuTaskId, START_KEYSCAN_EVT,160);// 100ms执行一次KeyScan()
    return (events ^ START_KEYSCAN_EVT);
}
bool key_press_flag = false;      // 按下标志
bool key_long_press_flag = false; // 长按标志

void KeyScan()
{
  if(GPIOB_ReadPortPin(GPIO_Pin_22) == 0) // 低电平
  {
    if(key_press_flag == false)
      tmos_start_task( hidEmuTaskId, START_LONGCHECK_TIMER, 1600 ); // 启动1s定时器

    key_press_flag = true;    // 置位按下标志
  }
  else if(key_press_flag == true) // 高电平同时按键被按下过 ,表示是按下后的弹起
  {
      key_press_flag = false; // 清除按下标志

      if(key_long_press_flag == false)// 短按后的弹起
      {
        tmos_stop_task(hidEmuTaskId, START_LONGCHECK_TIMER);
        PRINT("short press\n");
        tmos_set_event( hidEmuTaskId, START_REPORT_EVT );
      }
      else // 长按后的弹起
      {
          key_long_press_flag =false;
      }
  }
  else
  {
    key_press_flag = false;
    key_long_press_flag = false;
  }

}
if(events & START_LONGCHECK_TIMER)
{
    key_long_press_flag =true;
    PRINT("long press\n");
    return (events ^ START_LONGCHECK_TIMER);
}

上面的这段代码初次看着有点绕,但是看明白了之后会觉得这个实现逻辑还是挺好的,注释写了,这里不再详细解释了,我在多个项目里使用的都是它。它兼顾了去抖和短按/长按的检测,并且长按可以判断出长按按下/长按弹起。短按是检测到弹起时认为是短按动作。另外如果想同时支持多个长按,也很方便添加。

轮询和中断各有优缺点,大家可以根据实际情况来选择,你一般常用哪种方式呢?