分类目录:摩登3官网注册

摩登3官网注册_波波夫:无线电的先驱

小枣君注:之前推送马可尼那篇文章的时候,有读者建议我再写一篇波波夫。今天特此补上。 波波夫,全名叫亚历山大·斯捷潘诺维奇·波波夫(俄文名:Александр Степанович Попов,英文名:Alexander Stepanovich Popov),俄国著名物理学家、发明家,无线电通信的奠基人之一,天线的发明人,电磁波研究的先驱。 波波夫 1859年3月16日,波波夫出生在俄国乌拉尔矿区小镇的一个普通家庭。他的父亲史蒂芬·彼特罗维奇(Stefan Petrovich)是一名当地牧师,他的母亲安娜·史蒂潘诺夫娜(Anna Stepanovna)是一名乡村教师。 波波夫的父亲非常希望儿子也能成为一名神职人员,所以,安排他从小进入神学院进行学习。 然而,波波夫的兴趣并不在神学上。他对自然科学非常着迷,从小就研究木工和电工技术。小学的时候,他就尝试制作了水磨模型和电池。他还用电铃把自家的钟改装成闹钟。 少年波波夫 中学的时候,波波夫的数学和物理成绩特别好,受到校长的重视。 1877年,在经历了漫长的神学院学习之后,波波夫以优异的成绩毕业。18岁的他,拒绝走神职人员路线,而是通过考试,进入了彼得堡大学数学物理系。 青年波波夫 进入大学后,波波夫在电学上的兴趣得以充分释放。他不仅在学校里学习了大量的电学知识,还在圣彼得堡最早的一家发电厂中担任电工,进行勤工俭学。 两年后,波波夫转到彼得堡大学森林学院学习。因为这里学术思想活跃,允许学生自由发展。 这期间,波波夫对炸药产生了浓厚的兴趣。他研究出了用电线遥控炸药爆炸,被同学们称为“炸药专家”。 1882年,波波夫从彼得堡大学毕业,留校担任助教。 1883年,波波夫到“俄罗斯克伦施塔特(Kronstadt)海军鱼雷学校”担任物理和电气工程教师(后来成为物理系主任)。这一期间,波波夫研究了高频电流的实际应用。 1883年11月,波波夫与一位律师的女儿(Raisa Alekseevna)结婚,后来有了两个儿子和两个女儿。 波波夫及家人 1888年,德国科学家海因里希·赫兹(Heinrich Hertz)通过实验证明了电磁波的存在,引起了整个科学界的轰动。大量的科学家开始加入对电磁波的研究和实验,波波夫也是其中一员。 不过,波波夫最开始的兴趣是研究雷暴和闪电等大气现象造成的电磁反应。因为波波夫是海军,极端天气对航海有很大威胁,所以他希望能借助电磁反应进行气象预报。 1894年,波波夫在传统电磁波检测装置(粉末检波器)的基础上,进行改进,大幅提升了灵敏度。 波波夫发明了一种天线装置。他将检波器的一端与天线连接,另一端接地,检测到了许多公里以外大气中的放电。这是人类首次利用天线,接收到自然界的无线电波。 1895年5月7日,波波夫在圣彼得堡召开的俄国物理化学协会年会上,第一次公开演示了他所发明的无线电接收机。他将其称为“雷电指示器”。 波波夫的无线电接收机 1895年7月,波波夫将无线电接收机安装在圣彼得堡林业研究所的气象台上。 几个月后,波波夫发表论文:《金属屑同电振荡的关系》。他在论文中表示,只要有足够的电源,他的设备就可以用于接收来自人造振荡源的信号。 1896年3月24日,波波夫和助手雷布金在俄国物理化学协会的年会上,正式演示了用无线电传递莫尔斯电报码。 当时,雷布金负责拍发信号,波波夫负责接收信号,通信距离是250米。俄罗斯物理学会分会会长佩特罗司赫夫基教授,把接收到的电报字母逐一写在黑板上,最后得到的报文是: “海因里希·赫兹(HEINRICH HERTZ)” 这是波波夫在向前辈致敬。这份电报,是世界上第一份有明确内容的无线电报。 演示结束后,波波夫充满信心地说:“我的仪器在进一步改良以后,就能够凭借迅速的电振荡进行长距离通信”。 不幸的是,当时波波夫并没有进行该装置的专利申请。不久后,1896年6月,意大利人古列尔莫·马可尼(Guglielmo Marconi)申请了自己的无线电报系统专利。 马可尼 后来,马可尼的专利图纸传到俄国,人们发现,图纸上的设计和波波夫的发明非常吻合。俄罗斯物理化学协会声称,波波夫才是真正的无线电发明者。然而,那时候说什么都没用了,国际上已经普遍认可了马可尼的专利权。 1897年,俄国政府利用波波夫的技术,在克伦施塔特建立了无线电台。同年夏天,相隔5公里的两艘俄国军舰,借助无线电台实现了远距离通信。 1900年初,波波夫使电台的通信距离增加到45公里。 同年,俄国海军在波波夫的指导下,在波罗的海中的高戈兰岛设立了无线电台,和芬兰沿海城市科特卡之间实现了无线电通讯。这个电台后来多次协助救援了触礁的军舰和受困的渔民。 波波夫(后排右二) 还是1900年,波波夫的无线电系统在上赢得了金牌。 1901年,波波夫被任命为圣彼得堡大学电气工程学院教授。四年后,被任命为院长。 1906年1月13日,波波夫突发死于脑溢血,年仅47岁。 波波夫的英年早逝,是物理学界的重大损失。不少科学家认为,如果他还能多活一年,1906年度的诺贝尔物理学奖非他莫属(诺贝尔奖只颁发给生者)。 1945年,为了纪念波波夫在无线电方面的卓越贡献,苏联政府部长会议经过投票,将5月7日规定为苏联“无线电节”。此后,苏联经常在这个节日举办活动,纪念波波夫。 波波夫诞辰100周年纪念邮票(1959年) 苏联发行的波波夫纪念邮票() 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3注册开户_交织型ADC到底是个啥?今天咱们就科普一下~

在当今的许多细分市场,交错式模数转换器(ADC)在许多应用中都具有多项优势。在通信基础设施中,存在着一种推动因素,使ADC的采样速率不断提高,以便支持多频段、多载波无线电,除此之外满足DPD(数字预失真)等线性化技术中更宽的带宽要求。在军事和航空航天领域,采样速率更高的ADC可让多功能系统用于通信、电子监控和雷达等多种应用中——此处仅举数例。工业仪器仪表应用中始终需要采样速率更高的ADC,以便充分精确地测量速度更高的信号。 首先,一定要准确地了解交织型ADC是什么。要了解交错,最好了解一下实际发生的情况以及它是如何实现的。有了基本的了解后,再讨论交错的好处。当然,我们都知道,天下没有免费的午餐,因此需要充分评估和验证交织采样相关的技术难点。 关于交错  若ADC为交错式,则两个或两个以上具有固定时钟相位差关系的ADC用来同步采样输入信号,并产生组合输出信号,使得采样带宽为单个ADC带宽的数倍。利用m个ADC可让有效采样速率增加m倍。为简便起见并易于理解,我们重点考察两个ADC的情况。这种情况下,如果两个ADC的每一个采样速率均为fS, 且呈交错式,则最终采样速率为2× fS。这两个ADC必须具有确定的时钟相位差关系,才能正确交错。时钟相位关系由等式1给出,其中:n是某个特定的ADC,m是ADC总数。 举例而言,两个ADC采样速率均为100 MSPS且呈交错式,因此采样速率为200 MSPS。此时,等式1可用来推导出两个ADC的时钟相位关系,如等式2和等式3。 注意,如果已知时钟相位关系,便可确定不同量化值的组合输出。图1以图形说明时钟相位关系,以及两个100 MSPS交织型ADC的样本结构。注意180°时钟相位关系,以及样本是如何交 错的。输入波形也可由两个ADC进行采样。在这种情况下,采用经过2分频的200 MHz时钟输入,并所需的时钟相位发送至每个ADC,便可实现交错。 图1. 两个交错式100 MSPS ADC—基本原理图。 此概念还可以另一种方式表达,如图2所示。通过将这两个100MSPS ADC以交错方式组合,采样速率便能增加至200 MSPS。这样每个奈奎斯特区可以从50 MHz扩展到100 MHz,使工作时的可 用带宽翻倍。增加的工作带宽可为多个市场领域的应用带来诸多优势。无线电系统可以增加其支持的频段数;雷达系统可以增加空间分辨率;而测量设备可以实现更高的模拟输入带宽。 图2. 两个交错式100 MSPS ADC—时钟和样本。 交错的优势  交错结构的优势可惠及多个细分市场。交织型ADC最大好处是增加了带宽,因为ADC的奈奎斯特带宽更宽了。同样,我们举两个100 MSPS ADC交错以实现200 MSPS采样速率的例子。图3显示通过交错两个ADC,可以大幅增加带宽。这为多种应用场景产生了诸多收益。就像蜂窝标准增加了通道带宽和工作频段数一样,对ADC可用带宽的要求也越来越高。此外,在军事应用中,需要更好的空间识别能力以及增加后端通信的通道带宽,这些都要求ADC提供更高的带宽。由于这些领域对带宽的要求越来越高,因此需要准确地测量这些信号。因此,为了正确地获取和测量这些高带宽信号,测量设备也需要更高的带宽。很多设计中的系统要求其实领先于商用ADC技术。交错结构可以弥补这一技术差距。 图3. 两个交织型ADC——奈奎斯特区。 增加采样速率能够为这些应用提供更多的带宽,而且频率规划更轻松,还能降低通常在ADC输入端使用抗混叠滤波器时带来的复杂性和成本。面对这些优势,大家一定想知道需要为此付 出什么代价。就像大多数事情一样,天下没有免费的午餐。交织型ADC具有更高的带宽和其他有用的优势,但在处理交织型ADC时也会带来一些挑战。 交错挑战  在交错组合ADC时存在一些挑战,还有一些注意事项。由于与交错ADC相关的缺陷,输出频谱中会出现杂散。这些缺陷基本上是两个正在交错的ADC之间不匹配。输出频谱中的杂散导致的基本不匹配有四种。包括失调不匹配、增益不匹配、时序不匹配和带宽不匹配。 其中最容易理解的可能是两个ADC之间的失调不匹配。每个ADC都会有一个相关的直流失调值。当两个ADC交错并在两个ADC之间来回交替采样时,每个连续采样的直流失调会发生变化。图4 举例说明了每个ADC如何具有自己的直流失调,以及交错输出如何有效地在这两个直流失调值之间来回切换。输出以fS/2的速率在这些失调值之间切换,将导致位于fS/2的输出频谱中产生杂散。由于不匹配本身没有频率分量,并且仅为直流,因此出现在输出频谱中的杂散频率仅取决于采样频率,并将始终出现fS/2在2频率下。杂散的幅度取决于ADC之间失调不匹配的幅度。不匹配值越大,杂散值就越大。为了尽可能减少失调不匹配导致的杂散,不需要完全消除每个ADC中的直流失调。这样做会滤除信号中的所有直流成分,不适合使用零中频(ZIF)架构的系统,该架构信号成分复杂,DC量实际是有用信号。相反,更合适的技术是让其中一个ADC的失调与另一个ADC匹配。选择一个ADC的失调作为基准,另一个ADC的失调设置为尽可能接近的值。失调值的匹配度越高,在fS/2产生的杂散就越低。 图4. 失调不匹配。 交错时要注意的第二个不匹配是ADC之间的增益不匹配。图5显示了两个交错式转换器之间的增益不匹配。在这种情况下,有一个不匹配频率分量。为了观察这种不匹配,必须向ADC施加 信号。对于失调不匹配,无需信号即可查看两个ADC的固有直流失调。对于增益不匹配,如果不存在信号,就无法测量增益不匹配,因而无法了解增益不匹配。增益不匹配将会产生与输入频率和采样速率相关的输出频谱杂散,出现在fS/2 ± fIN处。为了最大程度地降低增益不匹配引起的杂散,采用了与失调不匹配类似的策略。选择其中一个ADC的增益作为基准,另一个ADC的增益设置为尽可能接近的值。每个ADC增益值的匹配度越高,输出频谱中产生的杂散就越小。 图5. 增益不匹配。 接下来,我们必须探讨两个ADC之间的时序不匹配。时序不匹配有两个分量:ADC模拟部分的群延迟和时钟相位偏差。ADC中的模拟电路具有相关的群延迟,两个ADC的群延迟值可能不同。此外还有时钟偏斜,它也包括两个分量:各ADC的孔径不确定性和一个与输入各转换器的时钟相位精度相关的分量。图6以图形说明ADC时序不匹配的机制和影响。与增益不匹配杂散相似,时序不匹配杂散也与输入频率和采样速率呈函数关系,出现在fS/2 ± fIN处。 图6. 时序不匹配 为了尽可能降低时序不匹配引起的杂散,需要利用合适的电路设计技术使各转换器模拟部分的群延迟恰当匹配。此外,时钟路径设计必须尽量一致以使孔径不确定性差异最小。最后,必须精确控制时钟相位关系,使得两个输入时钟尽可能相差180°。与其他不匹配一样,目标是尽量消除引起时序不匹配的机制。 最后一个不匹配可能最难理解和处理:带宽不匹配。如图7所示,带宽不匹配具有增益和相位/频率分量。这使得解决带宽不匹配问题变得更为困难,因为它含有另外两个不匹配参数的分量。然而,在带宽不匹配中,我们可在不同的频率下看到不同增益值。此外,带宽具有时序分量,使不同频率下的信号通过每个转换器时具有不同的延迟。出色的电路设计和布局布线实践是减少ADC间带宽失配的最好方法。ADC之间的匹配越好,则产生的杂散就越少。正如增益和时序不匹配会导致在输出频谱的fS/2 ± fIN处产生杂散一样,带宽不匹配也会在相同频率处产生杂散。 图7. 带宽不匹配。 现在我们已经讨论了交错ADC时引起问题的四种不同的不匹配,可以发现有一个共性。四个不匹配中有三个会在输出频谱的fS/2 ± fIN处产生杂散。失调不匹配杂散很容易识别,因为只有它位于fS/2处,并可轻松地进行补偿。增益、时序和带宽不匹配都会在输出频谱的fS/2 ± fIN 处产生杂散;因此,随之而来的问题是:如何确定它们各自的影响。图8以简单的图形方式指导如何从交织型ADC的不同不匹配中识别杂散来源。 图8. 交错式不匹配的相互关系。 如果只是考察增益不匹配,那么它就是一个低频(或直流)类型的不匹配。通过在直流附近执行低频增益测量,然后在较高的频率处执行增益测量,可将带宽不匹配的增益分量与增益不 匹配分离。增益不匹配与频率无函数关系,而带宽不匹配的增益分量与频率呈函数关系。对于时序不匹配,可以采用类似的方法。在直流附近执行低频测量,然后在较高的频率下执行后续测量,以便将带宽不匹配的时序分量与时序不匹配分离。 结论  最新通信系统设计、尖端雷达技术和超高带宽测量设备似乎始终领先于现有的ADC技术。在这些需求的推动下,ADC的用户和制造商都想方设法,试图跟上这些需求的步伐。与提高典型ADC转换速率的传统方式相比,交错ADC可以更快的速度实现更宽的带宽。将两个或更多ADC交错起来,可以增加可用带宽,并以更快的速度满足系统设计要求。然而,交错ADC并非没有代价,ADC之间的不匹配不容忽视。虽然不匹配确实存在,但了解其本质及如何正确处理它们,设计人员就能更加明智地利用这些交织型ADC,并满足最新系统设计不断增长的要求。 原文转自 关于世健 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3注册开户_一文彻底搞懂zookeeper 核心知识点(修订版)

初识 zookeeper Zookeeper 它作为Hadoop项目中的一个开源子项目,是一个经典的分布式数据一致性解决方案,致力于为分布式应用提供一个高性能、高可用,且具有严格顺序访问控制能力的分布式协调服务。 1、zookeeper数据模型 zookeeper 维护了一个类似文件系统的数据结构,每个子目录(/微信、/微信/公众号)都被称作为 znode 即节点。和文件系统一样,我们可以很轻松的对 znode 节点进行增加、删除等操作,而且还可以在一个znode下增加、删除子znode,区别在于文件系统的是,znode可以存储数据(严格说是必须存放数据,默认是个空字符)。 由于zookeeper是目录节点结构,在获取和创建节点时,必须要以“/” 开头,否则在获取节点时会报错 Path must start with / character。 [zk: localhost:2181(CONNECTED) 13] get testCommand failed: java.lang.IllegalArgumentException: Path must start with / character 根节点名必须为“/XXX”,创建子节点时必须要带上根节点目录“/XXX/CCC”、“/XXX/AAA”。 例如:想要获取下图 程序员内点事 节点必须拼接完整的路径 get /微信/公众号/程序员内点事 get /微信/公众号/程序员内点事 在这里插入图片描述 znode被用来存储 byte级 或 kb级 的数据,可存储的最大数据量是1MB(请注意:一个节点的数据量不仅包含它自身存储数据,它的所有子节点的名字也要折算成Byte数计入,因此znode的子节点数也不是无限的)虽然可以手动的修改节点存储量大小,但一般情况下并不推荐这样做。 2、znode节点属性 一个znode节点不仅可以存储数据,还有一些其他特别的属性。接下来我们创建一个/test节点分析一下它各个属性的含义。 [zk: localhost:2181(CONNECTED) 6] get /test456cZxid = 0x59ac //ctime = Mon Mar 30 15:20:08 CST 2020mZxid = 0x59admtime = Mon Mar 30 15:22:25 CST 2020pZxid = 0x59accversion = 0dataVersion = 2aclVersion = 0ephemeralOwner = 0x0dataLength = 3numChildren = 0   节点属性 注解 cZxid 该数据节点被创建时的事务Id mZxid 该数据节点被修改时最新的事物Id pZxid 当前节点的父级节点事务Id ctime 该数据节点创建时间 mtime 该数据节点最后修改时间 dataVersion 当前节点版本号(每修改一次值+1递增) cversion 子节点版本号(子节点修改次数,每修改一次值+1递增) aclVersion 当前节点acl版本号(节点被修改acl权限,每修改一次值+1递增) ephemeralOwner 临时节点标示,当前节点如果是临时节点,则存储的创建者的会话id(sessionId),如果不是,那么值=0 dataLength 当前节点所存储的数据长度 numChildren 当前节点下子节点的个数 我们看到一个znode节点的属性比较多,但比较主要的属性还是zxid、version、acl 这三个。 Zxid: znode节点状态改变会导致该节点收到一个zxid格式的时间戳,这个时间戳是全局有序的,znode节点的建立或者更新都会产生一个新的。如果zxid1的值 < zxid2的值,那么说明zxid2发生的改变在zxid1之后。每个znode节点都有3个zxid属性,cZxid(节点创建时间)、mZxid(该节点修改时间,与子节点无关)、pZxid(该节点或者该节点的子节点的最后一次创建或者修改时间,孙子节点无关)。 zxid属性主要应用于zookeeper的集群,这个后边介绍集群时详细说。 Version: znode属性中一共有三个版本号dataversion(数据版本号)、cversion(子节点版本号)、aclversion(节点所拥有的ACL权限版本号)。 znode中的数据可以有多个版本,如果某一个节点下存有多个数据版本,那么查询这个节点数据就需要带上版本号。每当我们对znode节点数据修改后,该节点的dataversion版本号会递增。当客户端请求该znode节点时,会同时返回节点数据和版本号。另外当dataversion为 -1的时候可以忽略版本进行操作。对一个节点设置权限时aclVersion版本号会递增,下边会详细说ACL权限控制。 验证一下,我们修改/test节点的数据看看dataVersion有什么变化,发现dataVersion属性变成了 3,版本号递增了。 [zk: localhost:2181(CONNECTED) 10] set /test 8888cZxid = 0x59acctime = Mon Mar 30 15:20:08 CST 2020mZxid = 0x59b6mtime = Mon Mar 30 16:58:08 CST 2020pZxid = 0x59accversion = 0dataVersion = 3aclVersion = 0ephemeralOwner = 0x0dataLength = 4numChildren = 0 3、znode的类型 zookeeper 有四种类型的znode,在用客户端 client 创建节点的时候需要指定类型。 zookeeper.create("/公众号/程序员内点事", "".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL); PERSISTENT-持久化目录节点 :client创建节点后,与zookeeper断开连接该节点将被持久化,当client再次连接后节点依旧存在。 PERSISTENT_SEQUENTIAL-持久化顺序节点 :client创建节点后,与zookeeper断开连接该节点将被持久化,再次连接节点还存在,zookeeper会给该节点名称进行顺序编号,例如:/lock/0000000001、/lock/0000000002、/lock/0000000003。 EPHEMERAL-临时目录节点 :client与zookeeper断开连接后,该节点即会被删除 EPHEMERAL_SEQUENTIAL-临时顺序节点 :client与zookeeper断开连接后,该节点被删除,会给该节点名称进行顺序编号,例如:/lock/0000000001、/lock/0000000002、/lock/0000000003。 节点的ACL权限控制 ACL:即 Access Control List (节点的权限控制),通过ACL机制来解决znode节点的访问权限问题,要注意的是zookeeper对权限的控制是基于znode级别的,也就说节点之间的权限不具有继承性,即子节点不继承父节点的权限。 zookeeper中设置ACL权限的格式由 : : 三段组成。 schema :表示授权的方式 world:表示任何人都可以访问 auth:只有认证的用户可以访问 digest:使用username  :password用户密码生成MD5哈希值作为认证ID host/ip:使用客户端主机IP地址来进行认证 id:权限的作用域,用来标识身份,依赖于schema选择哪种方式。 acl:给一个节点赋予哪些权限,节点的权限有create,、delete、write、read、admin 统称 cdwra。 1、world:表示任何人都可以访问 我们用 getAcl 命令来看一下,没有设置过权限的znode节点,默认情况下的权限情况。 [zk: localhost:2181(CONNECTED) 12] getAcl /test'world,'anyone: cdrwa 看到没有设置ACL属性的节点,默认schema 使用的是world,作用域是anyone,节点权限是cdwra,也就是说任何人都可以访问。 那我们如果要给一个schema 为非world的节点设置world权限咋搞? setAcl /test world:anyone:crdwa 2、auth:只有认证的用户可以访问 schema 用auth授权表示只有认证后的用户才可以访问,那么首先就需要添加认证用户,添加完以后需要对认证的用户设置ACL权限。 addauth digest test:password(明文) 需要注意的是设置认证用户时的密码是明文的。 [zk: localhost:2181(CONNECTED) 2] addauth digest user:user //用户名:密码[zk: localhost:2181(CONNECTED) 5] setAcl /test auth:user:crdwa[zk: localhost:2181(CONNECTED) 6] getAcl /test'digest,'user:ben+k/3JomjGj4mfd4fYsfM6p0A=: cdrwa 实际上我们这样设置以后,就是将这个节点开放给所有认证的用户,setAcl /test auth:user:crdwa 相当于setAcl /test auth::crdwa。 3、digest:用户名:密码的验证方式 用户名:密码方式授权是针对单个特定用户,这种方式是不需要先添加认证用户的。 如果在代码中使用zookeeper客户端设置ACL,那么密码是明文的,但若是zk.cli等客户端操作就需要将密码进行sha1及base64处理。 setAcl   digest: : : setAcl /test digest:user:jalRr+knv/6L2uXdenC93dEDNuE=:crdwa 那么密码如何加密嘞?有以下几种方式: 通过shell命令加密 echo -n  : <password> | openssl dgst -binary -sha1 | openssl base64 使用zookeeper自带的类库org.apache.zookeeper.server.auth.DigestAuthenticationProvider生成 java -cp /zookeeper-3.4.13/zookeeper-3.4.13.jar:/zookeeper-3.4.13/lib/slf4j-api-1.7.25.jar \  org.apache.zookeeper.server.auth.DigestAuthenticationProvider \  root:rootroot:root->root:qiTlqPLK7XM2ht3HMn02qRpkKIE= 4、host/ip:使用客户端主机IP地址来进行认证 这种方式就比较好理解了,通过对特定的IP地址,也可以是一个IP段进行授权。…

摩登三1960_电子系统越来越复杂,我们需要更灵活的电源管理解决方案~

随着技术不断进步,所有电子系统中包含的功能内容数量不断增多,可用空间却在不断减少。手机有触摸屏、手电筒、省电模式和精巧的摄像头。以前汽车仪表盘上只有基本的AM收音机和少量简易的仪表,现在却装满了精密的仪器仪表、卫星收音机、蓝牙®、GPS和其他基于手机的网络连接、多彩车灯以及无数的USB接口。工业计算机包含条形码读码器、大屏幕、硬盘驱动器和发光键盘。医疗电子设备包含传感器、多强度闪光灯、仪表和省电模式。 不变的是对电源和功率的需求。随着便携式和系统电子功能不断增加,它们对功率的需求也随之增加,特别是在用到以下这些复杂的电子IC时: 图形处理单元(GPU) 现场可编程门阵列(FPGA) 微控制器和微处理器 可编程逻辑器件(PLD) 数字信号处理器(DSP) 专用集成电路(ASIC) 可编程逻辑器件(PLD) 这些复杂的数字器件需要高功率密度多电压轨电源,这些电源具有高电流、低电压和快速瞬态响应特性。这些严格的要求和特定的高性能要求(如低噪音或数字控制)加在一起,为电源设计人员提供先进的解决方案造成了不小的压力。在所有情况下,电源设计人员也应保持同步跟上这些器件需求的演进。 功率系统设计挑战 现代电子系统设计人员面临着诸多挑战,包括满足严格的空间要求、有限的工作温度范围和噪声规格。器件高度集成可以帮助节省PCB空间,但需要高效的功率器件确保温例如,如今的汽车仪表盘中包含多种在较高环境温度下运行的电子系统,所以温度监控和报告非常重要,对于电源管理组件尤其如此。系统控制器可以对超温(OT)警报作出响应,并采取缓解措施来防止系统过热,例如关闭不太重要的功能或限制处理器、显示器和网络通信。 从电源角度来看,即使是最基本的汽车仪表盘信息娱乐控制面板都需要多个不同电流的低压电源电轨(输出电平),总电流只有几安培,高级控制台需要的更多。传统上,低压电轨一般是采用许多微型负载点(POL)分立式功率调节器IC产生,或者,采用高度集成的大型电源管理集成电路(PMIC)产生。许多PMIC通常具有超过需求更多的电压轨,因此需要更大尺寸的电路,而其中某些电轨的功率可能不足,无法满足额外集成的目的。 另一个潜在设计挑战是需求蠕变,或者产品规格的改变速度跟不上开发发展的速度,例如输入和输出电压、输出电流的变化。需求蠕变会严重影响集成电路和相关分立式组件的选择。在最好的情况下,如果系统规格在电路板布局确定之后发生变化,则可以通过改换可调输出转换器上的电阻来调节电压。在最糟糕的情况下,当更新之后的电流电平超过现有转换器的开关电流额定值时,需要采用引脚排列不兼容的IC来更换多个IC。即使是最小的功能改变,都可能要求重新进行IC、电路板或系统级别的认证,出现成本增加、计划延迟的情况。 解决这些问题的方法,是使用多输出的功率IC。相比纯粹的分立式、单输出或双输出IC,PMIC提供的输出更多,占用的空间更少,且需要的器件数也更少。这种电压调节器是一个多输出功率IC,提供可配置的多个中等功率电轨,且解决方案的尺寸小巧。理想情况下,这种IC可以配置成输出各种电压和电流,以适应开发过程中出现的电源需求变化,避免重新认证,并缩短产品的上市时间。此外,它可以在高于5 V的输入电压下高效工作,所以可以用于各种应用场合,例如12 V至18 V的电压适配器。除此以外,需要的特性还包括:集成安全和监控特性、宽温度范围运行,以及具备较高热性能的创新封装设计等。 灵活、可配置的20 V多输出功率IC ADI的 LTC3376 是一款高度集成的通用电源管理解决方案,适用于需要多个低压供电轨的系统。该器件可配置为可从最高20 V的输入提供1至4个独立的调节输出,具备15种可行输出电流配置,总输出电流最高可达12 A;详情参见图1。这种灵活性使得LTC3376非常适合用于多种多通道应用,包括电信、工业、汽车和通信系统。 图1. LTC3376简化功能框图。 LTC3376具备4个独立的降压稳压器通道、8个可配置的1.5 A功率级、灵活的时序和故障监测功能,总可用输出电流为12 A,峰值降压效率为96%,在所有通道上的输出电压精度为±1%。每个通道可由独立的3 V至20 V输入电源供电,输出电压的范围最低可至0.4 V。相邻输出可通过单个共享电感并联排列,以简化电路。DC-DC转换器通过CFG0到CFG3引脚进行配置,由系统分配采用15种功率配置中的一种。无需采用外部BST电容,因为它们已被集成到封装中。 LTC3376的开关稳压器支持两种工作模式:突发工作模式(Burst Mode®)(默认的上电模式),可在轻载下提供更高效率,强制连续脉冲宽度调制(PWM)模式,可在轻载下提供更低噪声。开关稳压器从内部补偿,只需采用外部反馈电阻来设置输出电压。降压转换器提供输入限流(软启动,在启动期间限制浪涌电流)、差分输出检测和短路保护。该器件配有一个可编程、可同步的1 MHz至3 MHz振荡器,默认采用2 MHz开关频率。 在四个转换器全部启用的情况下,静态电流仅为42 μA。其他特性包括:四个电源良好引脚,指明启用的DC-DC转换器是否在指定目标输出的百分比内;电流监测器,从外部监测每个降压稳压器的负载;一个EXTVCC 引脚,用于改善效率;准确的RUN引脚阈值,以确定上电时序;一个裸片温度监测器输出(通过TEMP引脚上的模拟电压读取),显示外部裸片温度;以及超温功能,过载条件下裸片温度较高时禁用降压稳压器。 LTC3376采用紧凑的64引脚7 mm × 7 mm倒装引脚球栅阵列(BGA)封装。在–40°C至+125°C工作结温范围内,指定采用E和I级。 灵活性和可配置性 LTC3376本身具备的灵活性使其可以采用15种不同的输出配置: 单个电感,单个输出12 A降压,所有功率级在内部组合,产生最大的电流输出。 四种可能的双降压组合,两个电感,总输出电流总和为12 A。 五种三通道降压组合,每种三个电感,总电流12 A。 五种四通道降压配置,每种四个电感,总电流12 A(参见图2)。 图2. 典型的四通道输出应用电路。 查看表1,了解15种可能的输出配置的列表。设计期间要求发生变化时,这种灵活性可以实现轻松调整,从而继续使用LTC3376,无需再对新IC实施认证。 表1. LTC3376:15种12 A总电流输出配置示例 出色的热设计和紧凑型解决方案 LTC3376通过在其紧凑的64引脚7 mm × 7 mm倒装引脚球栅阵列封装中组合采用多种封装技术,提供一种紧凑、具备较高热效率的解决方案。封装的内部结构使用铜柱代替键合线,内部旁路电容和集成式衬底接地平面进一步提高EMI,降低对PCB布局的敏感度,从而简化设计并降低性能风险(参见图3了解详情)。此外,裸片中的功率器件排列可以最大化热性能,均衡分配功耗。 (a) (b) (c) 图3. LTC3376倒装封装(a)引脚球栅阵列,(b)铜柱在裸片下方以及(c)集成旁路电容。 图4所示为采用4 × 3 A、四通道降压稳压器(总输出电流12 A)的LTC3376完整解决方案。解决方案总尺寸紧凑小巧:有效面积仅为~1.5 cm × 2.9 cm ~ < 4.4cm2. 图4. LTC3376演示板,展示提供5 V、3.3 V、2.5 V和1.8 V输出的4 × 3 A降压解决方案。 额外的系统监测、安全和保护 除了可配置性外,LTC3376还具备多种安全特性,对由它供电的系统实施监测和保护。每个降压稳压器关联的PGOOD引脚会报告功率故障情况。每个降压稳压器都配有电流监测器,该监测器在IMON引脚上产生电流,电流的值与平均降压负载电流的值成比例。 为了防止LTC3376和其周围的组件遭受热损坏,LTC3376集成了超温功能。当LTC3376裸片的温度达到165°C(典型值)时,所有开启的降压开关稳压器关闭,并保持关闭状态,直至裸片温度降低至155°C(典型温度)。 LTC3376还包含一个温度监测器:可通过对模拟TEMP引脚电压采样来读取裸片温度。通过TEMP引脚电压表示的温度T的计算公式如下: 其中,VTEMP 是TEMP引脚上的电压。 可配置的降压稳压器系列 表2显示整个可配置的四通道和八通道降压稳压器系列,其中LTC3376是新产品。LTC3376具备最高的总输出电流(最高12 A)和最高的输入电压容量(最高20 V)。LTC3376具备最高的总输出电流(最高12 A)和最高的输入电压容量(最高20 V)。 表2. ADI Power系列可配置四通道和八通道降压稳压器 在技术进步的推动下,汽车信息娱乐、消费电子手持设备、工业设备和医疗设备等应用的功能性内容愈加丰富。在许多情况下,这些系统的输入电压都超过5 V,并由复杂的低电压、大电流数字IC供电,这些IC本身都有独特的功率需求。传统上,电压电轨和电流电平都由众多分立式功率调节器IC支持,或由尺寸相对较大、过度集成的电源管理集成电路或PMIC支持。两者都不具备灵活性,尺寸也不小巧。 采用单通道、四通道或八通道多输出功率IC来替换这些方案是一个明智的选择。LTC3376引脚可配置的PMIC就是新一代多输出功率IC的示例。它是一个20 V输入的数字可编程、高效率多输出功率电源IC,包含四个同步降压转换器和八个内部功率级(总IOUT 最高12 A),且输出电压低。由于可以采用多达15种不同的输出电流配置,所以系统设计人员可以利用其灵活性来消除功率模块系统变化和特性蠕变带来的影响。无需过早实施价格高昂的电路板或系统级认证,缩短产品上市时间,降低开发成本并减少升级时间和成本。 LTC3376 LTC3376 宽 VIN 范围:3V…

摩登3注册登录网_嵌入式软件架构设计之分层设计

在实际的项目开发中,项目往往是并行开发的,也就是说硬件设计,底层软件设计,应用软件设计是同步进行的。比如说在开发板上调试模块驱动,在其他平台上调试应用再移植到目前这个平台等。这里又涉及到如何提高嵌入式应用软件的可移植性的问题,这个问题在下一篇博文中专门讲解,敬请期待。要想开发的应用程序在不同的嵌入式平台上具有高效率的可移植性,像Android sdk一样,统一的接口规范是必须的。 本文所要提到的嵌入式,其实更偏向于单片机。因为经典的linux+arm配置属于资源比较丰富,高配的嵌入式系统,其操作系统本身就很强大,软件设计也变得水到渠成。单片机更多时候是没有系统软件设计之说。一般的人会说,小项目才用单片机,实现功能简单,无需太多人参与,所以无需注重软件设计。其实是很幼稚的观点(刚毕业时我也是这样认为的)。因为目前mcu的处理速度,和实现功能已经可以满足很多项目的要求了。并且这些项目的软件也是越来越复杂。因此注重单片机类嵌入式软件设计是项目前期必须考虑的工作。 下面具体讲解单片机软件开发的分层设计思路。本栗子所使用的是飞思卡尔K21 MCU,IAR编译器。本文主题是讲软件分层,也就是底层软件和应用软件分开。当然可以把底层软件生成一个静态库提供给应用。但是这样就会有一个问题,如果静态库改变了,得重新编译,然后提供给应用,应用程序也得重新编译一下,这显然是很麻烦的一种处理方式。于是我们可以用另外一种思路去实现:底层软件和应用软件是两个独立的bin文件,姑且叫libdev.bin和app.bin。非操作系统的嵌入式是没有动态库.so这样一说的,不过底层软件这个可执行文件姑且就认为是app的.so吧。这两个bin文件通过配置icf,映射到不同的flash空间以及分配不同的RAM空间。显然,这两个bin文件的关系是app.bin会调用libdev.bin的实现。但是他们是独立的bin文件,如何关联起来呢。这事就需要一个函数表告诉app.bin到哪里去调用libdev.bin里面的函数实现。要实现这个函数表,就需要有统一的函数接口才方便管理。这个函数表可用静态库.a实现(libdev.a)。libdev.a的功能就是要映射所有libdev的接口函数,使app调用某一接口函数时,可以跳转到libdev.bin里面执行。如何实现上述思路,下面用一个具体实例讲解: 1.函数表用结构体的方式实现,结构体元素为函数指针。 eg: struct libdev_ops{    int (*dev_PortOpen)(int PortNum, char *PortParm);}; 2.在libdev.bin里面,对结构体里面的函数指针赋值。 eg: void libdev_ops_init(struct libdev_ops *ops){    ops->dev_PortOpen = dev_PortOpen;//把函数地址赋给对应的函数指针} 3.程序启动时,先进入libdev.bin,然后再跳转到app.bin。在此需要一个地址跳转函数。 eg: struct libdev_ops ops;void call_app(int addr){    int (*startup)(struct libdev_ops *ops);    startup = (int(*)(struct libdev_ops *))(addr);    libdev_ops_init(&ops);    startup(&ops);} 在libdev.a里面 4.重新封装所有函数,如下: int dev_PortOpen(int PortNum, char *PortPara){     ops->dev_PortOpen(PortNum,PortPara);} 5.实现libdev.bin需要跳转地址的函数 eg: void common_startup(struct libdev_ops *libdev_ops){    ......    ops = libdev_ops;    //为不定参函数,不能在步骤2中进行赋值,所以在静态库里进行初始化赋值。    dev_printf = ops->;    main();//跳到app的main中} 在app.bin 6.app.bin程序的启动地址修改,修改 IAR配置 工程名字--options--linker--library--勾选override default program entry,在Entry symbol 后面输入common_startup。 7.因为有两个.bin程序。所以就需要配置icf文件,并且call_app(addr)这个addr为app.bin里面common_startup函数的地址。因此需要编译app.bin后在output文件里面的app.map里面查看common_startup的地址是多少(由于这个函数是程序最先执行的函数,所以其地址为icf配置的起始地址)。 8.然后你在应用里面包含了dev_PortOpen函数的头文件就可以正常调用这个函数了。 因为libdev.bin和app.bin是同时运行的(app.bin调用的libdev函数的实现在libdev.bin里面),因此必须把RAM和ROM分成两份,不得重叠。 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3测速登陆_关于5G最新进展的一些数据

12月24日,在国务院新闻发布会上,工业和信息化部新闻发言人、信息通信发展司司长闻库表示,这一年来,工信部大力推动5G发展应用,加快5G网络建设,取得了比较好的效果。 网络建设稳步推进。今年新增5G基站约58万个,推动5G基站共建共享33万个,实现了年初所定地市覆盖5G的目标。1~11月,国内市场5G手机出货量达1.44亿部,占手机出货量的51.4%;上市5G手机新机型累计199款,占新上市机型的47.7%。用户数量增长较快,。应用落地进程速度加快。 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3注册开户_IMU中加速度计、陀螺仪、磁力计的工作原理

编排 | strongerHuang 来源 | autotian@CSDN IMU:Inertial Measurement Unit,即惯性测量单元。它是由三轴加速计、三轴陀螺仪、三轴磁力计等多种传感器组成的模块。 IMU在无人驾驶汽车、无人机上面应用的比较多,包括手机等很多电子设备也有IMU传感器的存在。 下面就来讲讲IMU中三轴加速计、三轴陀螺仪、三轴磁力计的工作原理。 1、三轴加速度计 三轴加速度传感器是基于加速度的基本原理去实现工作。 1.测量比力 三轴加速度计是一种惯性传感器,能够测量物体的比力,即去掉重力后的整体加速度或者单位质量上作用的非引力。当加速度计保持静止时,加速度计能够感知重力加速度,而整体加速度为零。在自由落体运动中,整体加速度就是重力加速度,但加速度计内部处于失重状态,而此时三轴加速度计输出为零。 2.测量角度 三轴加速度计的原理能够用来测量角度。直观地,如图所示,弹簧压缩量由加速度计与地面的角度决定。比力能够通过弹簧压缩长度来测量。因此在没有外力作用的情况下,加速度计能够精确地测量俯仰角和滚转角,且没有累积误差。 MEMS三轴加速度计是采用压阻式、压电式和电容式工作原理,产生的比力(压力或者位移)分别正比于电阻、电压和电容的变化。这些变化可以通过相应的放大和滤波电路进行采集。该传感器的缺点是受振动影响较大。 介于其测量角度的工作原理三轴加速度计无法测量偏航角: 可测量俯仰角和横滚角: 2、三轴陀螺仪 三轴陀螺仪是惯性导航系统的核心敏感器件,其测量精度直接影响惯导系统的姿态解算的准确性。 作用:用于测量单元中的角速度及对角速度积分后角度的计算 原理:理解三轴陀螺仪的原理首先要知道科里奥利力 科里奥利力 科里奥利力(Coriolis force)有些地方也称作哥里奥利力,简称为科氏力,是对旋转体系中进行直线运动的质点由于惯性相对于旋转体系产生的直线运动的偏移的一种描述。科里奥利力来自于物体运动所具有的惯性。 —来自百度百科 当一个质点相对于惯性系做直线运动时,因为质点自身惯性,它相对于旋转体系,其轨迹是一条曲线。立足于旋转体系,我们认为有一个力驱使质点运动轨迹形成曲线。科氏力就是对这种偏移的一种描述,表示为: 即本来直线的运动当放在一个旋转体系中直线轨迹会发生偏移,而实际上并直线运动的问题并未受到力的作用,设立这样一个虚拟的力称为科里奥利力。 由此我们在陀螺仪中,选用两块物体,他们处于不断的运动中,并令他们运动的相位相差-180度,即两个质量块运动速度方向相反,而大小相同。它们产生的科氏力相反,从而压迫两块对应的电容板移动,产生电容差分变化。电容的变化正比于旋转角速度。由电容即可得到旋转角度变化。 3、三轴磁力计 磁力计能提供装置在XYZ各轴所承受磁场的数据,接着相关数据会汇入微控制器的运算法,以提供磁北极相关的航向角,利用这些信息可侦测地理方位。 磁力仪是采用三个互相垂直的磁阻传感器,每个轴向上的传感器检测在该方向上的地磁场强度。 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3平台注册登录_尽着自己最大的努力,不加班不快乐

1.1 大赛介绍 全国大学生智能汽车竞赛是以“立足培养、重在参与、鼓励 探索、追求卓越”为宗旨,鼓励创新的一项科技竞赛活动。今年首次新增了电 磁 AI 组别,希望通过神经网络学习甚至超越传统的 PID 控制方法。 在这份报告中,我们小组对小车设计制作整体思路、机械、电路、电控、 神经网络几个方面进行了详细的介绍。 整体思路中主要概括了项目构建时的主 要核心思想,机械部分中主要阐述了小车的机械部分中主要阐述了小车的结构 设计,包含各部件的安装位置以及对车模的保护措施,电路部分主要阐述了小 车的电路结构设计为软件停工稳定输入与输出环境减少外界干扰。 电控部分主 要阐述了如何采用 PID 进行小车控制,包含舵机控制,差速控制,电机控制等。 神经网络部分主要阐述了如何采用神经网络学习小车控制方法,包含数据集制 作,电感位置分布,网络结构创新等。 虽说看似就是一简单巡线的项目,但是随着深入地进行研究,我们发现在 此之上可以用非常多方法大幅度提升巡线效果,比如可以通过无线串口进行 PID 远程调参,通过神经网络去自动地寻找较好的控制方法,通过陀螺仪和编码器 去记录整个赛道等等。 随着一步步地迭代,我们的工程越来越大,完成的功能 也越来越多,自然而然速度也在一点一滴地提升。 1.2 整体方案设计 本节主要简要地介绍智能车系统总体设计思路,在后面的章节中将整个系 统分为机械结构,硬件电路设计,传统 PID 设计,神经网络设计等四部分对智 能车控制系统进行深入的介绍和分析。 根据第十五届智能车竞赛规则,AI 电磁组比赛是在 PVC 赛道上进行,赛道 采用黑色边线引导。选手制作的车模完成赛道运行一周。车辆运行时间是从车 模冲过起跑线开始,到最后车模回到起跑线为止。赛道中存在的元素包括直线 道路、曲线弯道、十字交叉路口、环岛(可不进入)。 根据竞赛规则相关规定及以上任务要求,智能车系统采用大赛组委会统一 提供的 C 型车模,以恩智浦公司生产的 MIMXRT1064DVL6A 作为核心控制器,在 IAR 开发环境中进行软件开发。智能车系统检测电磁场信号为基础,通过单片机 处理信号实现对车体控制。通过编码器测速模块来检测车速,并采用 RT1064 的 输入捕捉功能进行脉冲计数计算速度和路程;电机转速控制采用 PID 控制,通 过 PWM 控制驱动电路调整电机的转速,完成智能车速度的闭环控制。 根据以上系统方案设计,赛车总共包括一下几个模块: 1.RT1064 单片机最小系统模块;2.电源模块; 3.电机驱动模块 ;4.传感器模块; 5. 无线串口模块; 6.编码器测速模块; 7.陀螺仪模块; 8.停车线检测模块; 9.人机交互模块。 ▲ 图1.2-1 系统框图 机械设计中,我们需要考虑多电感的保护,转向机构设计,电路板放置, 车身强度等问题。 2.1 智能汽车车体机械建模 此次竞赛选用的是东莞市博思电子数码科技有限公司生产的智能车竞赛专 用模型车(C 型模型车),配套的电机型号为 RS-380,舵机的型号为 FUTABA3010。智能车的外形大致如下: ▲ 车模照片 2.2 转向机构设计 在调试过程中,我们发现原有的转向机构中舵机的转角与前轮的转角不为线 性关系,故尝试更改前轮转向机构为线性控制,但导致前轮转向时的响应时间 增长,转弯不及时。 最终我们使用了自制的舵机固定板与舵机转向套装,如下图所示。 ▲ 舵机固定板与舵机转向套装 最终虽然控制仍不为线性,但做到了前轮转向的快速响应,转向机构整体如 下图。 ▲ 转向机构 2.3 电路板放置 对于电路板排布,我们经过两次迭代,最终选择采用如下图所示的碳板作为 整体的支撑结构,使用 4 根铜柱与车模底盘连接,保证强度的同时,也能尽可 能地让车身更轻,从而有更为稳定的结构,且易于加装/拆卸长前瞻。 ▲ 自制支撑结构 为了维持多个电感与车模之间固定的相对位置,我们将所有装有采集电感传 感器的电路板都安装在碳板上,同时为了操作、拆卸更加方便,我们将其他电 路板也固定在了碳板之上。 ▲ 碳板固定 2.4 智能汽车传感器的安装 车模中的传感器包括有:速度传感器,车模姿态传感器(陀螺仪、加速度计), 霍尔传感器以及采集电感传感器。下面分别介绍这些传感器的安装。 2.4.1 速度传感器的安装 速度传感器使用了龙邱 512 线 mini…

摩登3娱乐怎么样?_要能搞定容性负载,提高放大器性能便唾手可得~

容性负载一定会影响运算放大器的性能。简单地说,容性负载可以将放大器变为振荡器。今天我们就来说说—— ◎ 容性负载如何将放大器变为振荡器 ◎ 如何处理容性负载? 放大器变振荡器?这是有原理的! 运算放大器固有的输出电阻Ro与容性负载一起,构成放大器传递函数的另一个极点。如波特图所示,在每个极点处,幅度斜率(负值)减小20dB/10倍。请注意各极点如何增加多达-90°的相移。我们可以从两个角度来考察不稳定性问题。请看对数图上的幅度响应,当开环增益与反馈衰减之和大于1时,电路就会变得不稳定。类似地,还可以看相位响应,在环路相移超过-180°的频率,如果此频率低于闭环带宽,则运算放大器往往会发生振荡。电压反馈型运算放大器电路的闭环带宽等于运算放大器的增益带宽积(GBP,或单位增益频率)除以电路的闭环增益(ACL)。 运算放大器电路的相位余量可以看作是使电路变得不稳定时所需的闭环带宽的额外相移量(即相移+相位余量=-180°)。随着相位余量趋于0,环路相移趋于-180°,运算放大器电路便趋于不稳定。通常而言,如果相位余量值远小于45°,就会导致频率响应的尖峰,以及阶跃响应时的过冲或响铃振荡等问题。为了保持足够的相位余量,容性负载所产生的极点至少应比电路的闭环带宽高10倍。如果不是这样,请考虑电路不稳定的可能性。 如何处理容性负载?教你三招 首先应当确定,运算放大器能否安全地驱动自身负载。许多运算放大器数据手册规定了“容性负载驱动能力”,另有一些则提供了关于“小信号过冲与容性负载之间关系”的典型数据。查看这些数值,可以发现过冲随着负载电容增加成倍递增。当过冲接近100%时,运算放大器便趋于不稳定。如果可能,请让过冲远低于此限值。另外请注意,此图针对特定增益而言。对于电压反馈型运算放大器,容性负载驱动能力随着增益的增加而提高。因此,在单位增益时能够安全驱动100pF电容的电压反馈型运算放大器,在增益为10时应当能够驱动1000pF电容。 一些运算放大器数据手册给出了开环输出电阻(Ro),由此可算出上述附加极点的频率。如果附加极点的频率(fp)比电路带宽高出10倍,电路将保持稳定。 如果运算放大器的数据手册没有说明容性负载驱动能力或开环输出电阻,并且没有提供过冲与容性负载的关系图,那么为了确保稳定性,必须假设任何负载电容均要求采取某种补偿技术。有许多方法都能使标准运算放大器电路稳定驱动容性负载,下面是其中几种: 噪声增益操控 这是一种在低频应用中保持稳定的有效方法,然而却经常被设计人员所忽略。其原理是提高电路的闭环增益(也称为“噪声增益”),而不改变信号增益,从而降低开环增益与反馈衰减之积变为1的频率。在一些电路的运算放大器输入端之间连接RD即可实现,如下图所示。利用所给的公式可求得这些电路的“噪声增益”。 由于稳定性受噪声增益而不是信号增益控制,因此上面的电路可提高稳定性,且不会影响信号增益。只需使“噪声带宽”(GBP/ANOISE)比负载所产生的极点至少低10倍,便可确保稳定。 这种稳定方法有一个缺点,即折合到输入端的电压噪声和输入失调电压进一步放大,导致输出噪声和失调电压增加。将电容CD与RD串联,可以消除增加的直流偏置电压,但这种技术会增加噪声,无法消除。这些电路在包含CD和不含CD两种情况下的有效噪声增益如图所示。 使用时,CD应尽可能大;最小值应为10ANOISE/(2πRDGBP),才能使“噪声极点”至少比“噪声带宽”低10倍。 环外补偿 这种方法是在运算放大器的输出端与负载电容之间增加一个电阻RX,如下图所示。该电阻显然在反馈环路之外,但它与负载电容一起,可将一个零点引人反馈网络的此传递函数,从而减小高频时的环路相移。 为确保稳定,RX值应使所增加的零点(fZ)至少比运算放大器电路的闭环带宽低10倍。增加RX后,电路性能不会像第一种方法一样受到影响,输出噪声不会增加,但相对负载而言的输出阻抗会提高。由于RX和RL构成电阻分压器,这可能会降低信号增益。如果RL已知且相当稳定,则可以提高运算放大器电路的增益,以抵消该增益损失。 这种方法对于驱动传输线路非常有效。为了避免驻波,RL和RX的值必须等于电缆的特性阻抗(一般为50Ω或75Ω)。因此,RX是预先确定的,剩下的工作就是让放大器的增益加倍,以便抵消电阻分压器造成的信号损耗,这样问题就解决了。 环内补偿 如果RL是未知的或动态变化的,则增益级的有效输出电阻必须保持较低。这种情况下,将RX连接在整个反馈环路以内可能有帮助,如下图所示。采用这种配置,直流和低频反做来自负载本身,因此从输入端到负载的信号增益仍然不受分压器(RX和RL)的影响。 此电路中增加的电容CF可以抵消CL所造成的极点和零点。简单地说,CF所产生的零点与CL所产生的极点一致,同时CF所产生的极点与CL所产生的零点一致。因此,总传递函数和相位响应与没有电容时完全一样。为了确保极点和零点组合均得以抵消,必须精确求解上述方程式。另外应注意条件;如果负载阻抗相对较大,则这些条件很容易得到满足。 如果RO未知,将难以计算。这种情况下,设计程序就变成猜谜游戏,这可以说是电路设计的噩梦。关于SPICE,有一点应当注意:运算放大器的SPICE模型并未精确模拟开环输出电阻(RO),因此并不能完全取代补偿网络的经验设计。 还有一点必须注意:CL必须为已知且恒定的值,才能应用这种技术。许多应用中,放大器驱动非常规负载,CL可能会因负载不同而有很大差别。只有CL是闭环系统的一部分时,使用以上电路才是最佳选择。 一种应用是对基准电压进行缓冲或反相,以驱动较大的去耦电容。此时,CL为固定值,可以精确抵消极点/零点组合。这种方法的低直流输出阻抗和低噪声(与前两种方法相比)非常有利。此外,基准电压的去耦电容可能很大(经常为若干微法),使用其它补偿方法并不可行。 以上三种方法均应用于“标准”、单位增益稳定、电压反馈型运算放大器,每种方法各有利弊。现在,您可以应用自己的知识来判断哪种方法最适合您的应用啦~ 关于世健 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3内部554258_What is the Memory Model in C++11

C++11其实主要就四方面内容,第一个是可变参数模板,第二个是右值引用,第三个是智能指针,第四个是内存模型(Memory Model)。 相对来说,这也是较难理解的几个特性,分别针对于泛型编程,内存优化,内存管理和并发编程。 并发编程是个非常大的模块,而在诸多内容底下有一个基本的概念,就是并发内存模型(Memory Model)。 那么,什么是内存模型? 1 Memory Model 早在之前介绍并发编程的文章中,我们就知道同步共享数据很重要。而同步可分为两种方式:原子操作和顺序约束。 原子操作是数据操作的最小单元,天生不可再分;顺序约束可以协调各个线程之间数据访问的先后顺序,避免数据竞争。 通常的同步方式会有两个问题,一是效率不够,二是死锁问题。导致效率不够是因为这些方式都是lock-based的。 当然,若非非常在意效率,完全可以使用这些同步方式,因其简单方便且不易出错。 若要追求更高的效率,需要学习lock-free(无锁)的同步方式。 内存模型,简单地说,是一种介于开发者和系统之间的并发约定,可以无锁地保证程序的执行逻辑与预期一致。 这里的系统包括编译器、处理器和缓存,各部分都想在自己的领域对程序进行优化,以提高性能,而这些优化会打乱源码中的执行顺序。尤其是在多线程上,这些优化会对共享数据造成巨大影响,导致程序的执行结果往往不遂人意。 内存模型,就是来解决这些优化所带来的问题。主要包含三个方面: Atomic operations(原子操作) Partial ordering of operations(局部执行顺序) Visible effects of operations(操作可见性) 原子操作和局部执行顺序如前所述,「操作可见性」指的是不同线程之间操作共享变量是可见的。 原子数据的同步是由编译器来保证的,而非原子数据需要我们自己来规划顺序。 2 关系定义 这里有三种关系术语, sequenced-before happens-before synchronizes-with 同一线程语句之间,若A操作在B操作之前执行,则表示为A sequenced-before B,A的执行结果对B可见。 而在不同线程的语句之间,若A操作在B操作之前就已发生,则表示为A happens-before B。该关系具有可传递性,也就是说,若A happens-before B,B happens-before C,则一定能得出A happens-before C。 若A操作的状态改变引发了B操作的执行,则表示为A synchronizes-with B。比如我们学过的事件、条件变量、信号量等等都会因一个条件(状态)满足,而执行相应的操作,这种状态关系就叫做synchronizes-with。 由于synchronizes-with的特性,可以借其实现happens-before关系。 内存模型就是提供一个操作的约束语义,借其可以满足上述关系,实现了顺序约束。 3 Atomics(原子操作) 原子操作的知识之前也介绍过,限于篇幅,便不再捉细节。 先来整体看一下原子操作支持的操作类型,后面再来讲应用。 这里挑两个来介绍一下相关操作,算是回顾。 第一个来讲atomic_flag,这是最简单的原子类型,代表一个布尔标志,可用它实现一个自旋锁: 1#include  2#include  3#include  4 5class spin_lock 6{ 7    std::atomic_flag flag = ATOMIC_FLAG_INIT; 8public: 9    void lock() { while(flag.test_and_set()); }1011    void unlock() { flag.clear(); }12};1314spin_lock spin;15int g_num = 0;16void work()17{18    spin.lock();1920    g_num++;2122    spin.unlock();23}2425int main()26{27    std::thread t1(work);28    std::thread t2(work);29    t1.join();30    t2.join();3132    std::cout << g_num;3334    return 0;35} atomic_flag必须使用ATOMIC_FLAG_INIT初始化,该值就是0,也就是false。 只能通过两个接口来操作atomic_flag: clear:清除操作,将值设为false。 test_and_set:将值设为true并返回之前的值。 第9行的lock()函数实现了自旋锁,当第一个线程进来的时候,由于atomic_flag为false,所以会通过test_and_set设置为true并返回false,第一个线程于是可以接着执行下面的逻辑。 当第二个线程进来时,flag为true,因此会一直循环,只有第一个线程中unlock了才会接着执行。由此保证了共享变量g_num。 第二个来讲atomic ,它所支持的原子操作要比atomic_flag多。 一个简单的同步操作: 1#include  2#include  3#include  4#include  5#include  6#include  7 8std::atomic<bool> flag{false}; 9std::vector<int> shared_values;10void work()11{12    std::cout << "waiting" << std::endl;13    while(!flag.load())14    {15        std::this_thread::sleep_for(std::chrono::milliseconds(5));16    }1718    shared_values[1] = 2;19    std::cout << "end of the work" << std::endl;20}2122void set_value()23{24    shared_values = { 7, 8, 9 };25    flag = true;26    std::cout << "data prepared" << std::endl;27}2829int main()30{31    std::thread t1(work);32    std::thread t2(set_value);33    t1.join();34    t2.join();3536    std::copy(shared_values.begin(), shared_values.end(), std::ostream_iterator<int>(std::cout, " "));3738    return 0;39} 这里有两个线程,它们之间拥有执行顺序,只有先在set_value函数中设置好共享值,才能在work函数中修改。 通过flag的load函数可以获取原子值,在值未设置完成时其为false,所以会一直等待数据到来。当flag变为true时,表示数据已经设置完成,于是会继续工作。 4 Memory ordering(内存顺序) 是什么保证了上述原子操作能够在多线程环境下同步执行呢? 其实在所有的原子操作函数中都有一个可选参数memory_order。比如atomic 的load()和store()原型如下: bool std::_Atomic_bool::load(std::memory_order _Order = std::memory_order_seq_cst) const noexceptvoid std::_Atomic_bool::store(bool _Value, std::memory_order _Order = std::memory_order_seq_cst) noexcept 这里的可选参数默认为memory_order_seq_cst,所有的memory_order可选值为: enum memory_order {    memory_order_relaxed,    memory_order_consume,    memory_order_acquire,    memory_order_release,    memory_order_acq_rel,    memory_order_seq_cst}; 这就是C++提供的如何实现顺序约束的方式,通过指定特定的memory_order,可以实现前面提及的sequence-before、happens-before、synchronizes-with关系。 顺序约束是我们和系统之间的一个约定,约定强度由强到弱可以分为三个层次: Sequential consistency(顺序一致性): memory_order_seq_cst Acquire-release(获取与释放): memory_order_consume,memory_order_acquire,memory_order_release,memory_order_acq_rel Relaxed(松散模型): memory_order_relaxed Sequential consistency保证所有操作在线程之间都有一个全局的顺序,Acquire-release保证在不同线程间对于相同的原子变量的写和读的操作顺序,Relaxed仅保证原子的修改顺序。 为何要分层次呢? 其实顺序约束和系统优化之间是一种零和博弈,约束越强,系统所能够做的优化便越少。 因此每个层次拥有效率差异,层次越低,优化越多,效率也越高,不过掌握难度也越大。 所有的Memory order按照操作类型,又可分为三类: Read(读):memory_order_acquire,memory_order_consume Write(写):memory_order_release Read-modify-Write(读-改-写):memory_order_acq_rel,memory_order_seq_cst Relaxed未定义同步和顺序约束,所以要单独而论。 例如load()就是Read操作,store()就是Write()操作,compare_exchange_strong就是Read-modify-Write操作。 这意味着你不能将一个Read操作的顺序约束,写到store()上。例如,若将memory_order_acquire写到store()上,不会产生任何效果。 我们先来从默认的Sequential consistency开始,往往无需设置,便默认是memory_order_seq_cst,可以写一个简单的生产者-消费者函数: 1std::string sc_value;…