显示标签为“Electric”的博文。显示所有博文
显示标签为“Electric”的博文。显示所有博文

2014年10月3日星期五

extreme burn for Atmega1280

※还没确定是否正确!!!!

add


        ATmega1280
        131072
        4096
        0x0003971E
        256
        YES
        YES
        YES
        YES
        YES
        .\Images\Placements\ZIF_DIP_40.bmp
   


to chips.xml

2014年8月3日星期日

使用运算放大器来驱动高精度模数转换器

传自:http://www.deyisupport.com/blog/b/analogwire/archive/2013/11/12/51569.aspx

作者:Rick Downs,德州仪器 (TI) 高精度模拟应用工程经理

大多数高精度模数转换器 (ADC) 都没有高阻抗输入。输入信号直接通过一个开关连接到一个采样电容器。这种负载存在一些有趣的挑战。

有人试图通过直接连接一个电位计到输入来验证其 ADC 的运行,如 所示。这样做的结果通常让人失望,因为获得的结果并不理想。这种情况下,在 ADC 输入上看到的信号呈现出巨大的峰值,因为大输入阻抗从采样电容器吸取电流,从而导致对电容器充电需要大量的电流。如果在转换器的采集时间 tACQ 内稳定下来,便不会出现问题。但是,如果没有在 tACQ 内稳定到 0.5 最低有效位 (LSB) 以下,则会损耗精度。


 高源阻抗会引起精度损耗

 显示了驱动一个高精度 ADC 的建议电路。CSH 为 ADC 内部的采样电容,而 RSW 为采样开关的导通电阻(通常低到可以忽略不计)。转换器的采集时间 tACQ 期间,采样开关关闭。
 
 驱动高精度 ADC 的建议电路

外部 CFLT 用于提供充电 CSH 所需的瞬时电流,其必须至少为 20x CSH。一般而言,1nF 较为合适。RFLT 用于阻止驱动运算放大器承受纯电容性负载。这样,RFLT 和 CFLT 构建起一个时间常量为 τ = RFLTCFLT 的 RC 电路。

为了保证所有一切都及时稳定以获得精确的信号采集,tACQ 必须为 ≥ k τ,其中k = ln(2(N+1))。K 为一个 N 位转换器稳定至 0.5LSB 要求的时间常量值。由此,您可以确定最大值 τ,以及 RFLT 的值。

选择驱动运算放大器的关键参数是其单位增益带宽,其必须为 4(1/(2πRFLTCFLT)) 以足够快地稳定。一些设计人员通常会忘记这个要求,可能选择一款比要求慢得多的运算放大器,从而得到令人失望的结果。

如欲了解采样过程、RC 时间常量计算以及正确选择运算放大器的更多详情,敬请访问:

  1. 使用 SAR 模数转换器进行马达控制应用中的电流测量》(SBAA081),作者:M. Oljaca 和 J. McEldowney,2002 年 10 月,网址:http://focus.ti.com/lit/an/sbaa081/sbaa081.pdf
  2. 设计 SAR ADC 驱动电路,第一部分:ADC 工作原理详解》作者:R. Downs 和 M. Oljaca,2006 年 2 月,网址:http://www.en-genius.net/includes/files/acqt_022106.pdf
  3. ADS8342 SAR ADC 输入》(SBAA127),作者:M. Oljaca 和 B. Mappes,2005 年 1 月,网址:http://focus.ti.com/lit/an/sbaa127/sbaa127.pdf
  4. 《设计 SAR ADC 驱动电路,第二部分:SAR ADC 输入行为》,作者:R. Downs 和 M. Oljaca,2006 年 10 月:http://www.en-genius.net/includes/files/acqt_100306.pdf
  5. 设计 SAR ADC 驱动电路,第三部分:为 SAR ADC 设计优化的输入驱动电路》作者:R. Downs 和 M. Oljaca,2007 年 3 月:http://www.en-genius.net/includes/files/acqt_031207.pdf
  6. 外部组件提升了 SAR ADC 精度》,作者:B. Baker 和 M. Oljaca,EDN,2007 年 6 月 7 日,pp 67-75,网址:http://www.edn.com/article/CA6447231.html。 
  7. 驱动 SAR ADC 首先是选择正确的运算放大器》作者:M. Oljaca 和 B. Baker,EDN,2008 年 10 月 16,pp 43-54,网址:http://www.edn.com/article/CA6602451.html

2014年3月13日星期四

How to Select a DSP Processor

How to Select a DSP Processor

This article will be useful if you have already decided that you need a DSP processor to handle your computationally-intensive signal processing application in real-time, but need some help selecting a DSP processor. It will guide you through some of the characteristics of DSP processors that you can choose from to help you narrow-down the choice.
For this discussion it is assumed that you are interested in stand-alone DSP processor chips, and not on DSP cores that you will embed on your own ASIC.

Floating-Point vs. Fixed-Point

You will need to decide if you need floating-point support from the DSP processor or not. If your application does not make use of floating-point variables, then you don’t need a floating-point unit. If your application does use floats, you can still convert the algorithms to fixed-point arithmetic. This is a time-consuming job, but allows you to save the cost of a floating-point unit on your DSP processor. If you leave floating-point operations in your program and compile it for a processor with no floating-point unit, it will use emulation libraries that are extremely slow.
In general all algorithms can be implemented in fixed-point arithmetic, and fixed-point implementations run a bit faster than floating-point implementations of the same algorithm. The advantage of floating-point is that it saves development time. But having a floating-point unit will make your DSP processor bigger and more expensive.
Note that floating point units in DSP processors will provide support for single-precision floating-point operations only. Double-precision operations will still use emulation libraries and will run very slowly.

32-Bit Vs. 16-Bit

The vast majority of DSP processors today are 32-bit. There are still some 16-bit DSP processors offered, which tend to be smaller, cheaper and consume less power than 32-bit processors.
To know if you need a 32-bit processor, you must first determine what the dynamic range of your data is. Dynamic range is the difference between the lowest and the highest values that you need to represent in a variable, including fractional bits. Voice applications usually work with 12-bit data, while CD-quality audio is 16-bits. In addition to the basic data size, you will need some extra bits to hold sums (the sum of two 16-bit numbers requires 17 bits). So practically speaking, 16-bit DSP processors are useful mostly for voice signal processing applications.
Even if your data fits comfortably inside of 16 bits, you might still prefer a 32-bit processor because of the optimization opportunities it provides. You can store two 16-bit data elements on a single 32-bit variable, and perform operations on them in parallel. If your application has 8-bit data (like video and image processing), you may be able to operate on 4 elements at a time on a 32-bit DSP. When perform multiplications of 16-bit values, the intermediate result is a 32-bit value. Manipulating intermediate multiplication results is done more efficiently on a 32-bit architecture than on a 16-bit one.

Multi-Core

A popular choice for embedded systems is to use a dual-core chip, where one of the cores is a DSP processor, and the other is a general-purpose processor. This arrangement suits many applications that require a DSP processor for number-crunching, but also need to run a lot of general code, like a full operating system, or a web browser. If your application will involve only a small amount of general-purpose code, then a single-core DSP might be good enough (you can run a simple UI and network interface inside the DSP). But if you need to run a complex operating system like Linux, you should consider a dual-core system on chip.
Another reason for multiple cores on a chip is to increase the total performance. Some applications are so computationally complex that a single DSP processor core is not enough. There are DSP chips with 2 to 4 DSP cores in them. Note that partitioning your application into multiple cores may require a substantial architecture effort.

VLIW

VLIW stands for Very-Large Instruction Word. This is a type of computer architecture that can execute multiple instructions every cycle, and therefore can reduce the execution time of complex programs. The number of parallel instructions issued on VLIW DSP processors varies from 4 to 8. Theoretically, an 8-way VLIW processor can execute 8 times as many operations per second than a regular (scalar) processor, but in practice the amount of speedup is limited by the available parallelism in the program. In average VLIW processors can execute 2 to 4 times faster than scalar DSPs, but manual optimization is required to fully exploit this feature.

On-Chip Memory

System memory (like DRAM) is much slower than the processor. When a program needs to read data from memory, the whole CPU will stall until the memory read completes. To alleviate this, processors utilize fast on-chip memory that can be read or stored in a single cycle. You still may need to move data from main memory, but once it is on-chip, the program will run very efficiently.
On-chip memories can either be arranged as caches, or as user-programmable memories. Cache memory will hold a copy of anything that is read from main memory, so subsequent accesses are done from the cache. Stores to main memory get trapped by the cache, and only get copied back to main memory when the cache is running out of space. On user-programmable on-chip memories, data needs to be explicitly moved in and out of them. Once on-chip, data accesses can be done without any stalls.
Most applications will require some amount of on-chip memory to maintain the DSP processor running at full speed. Figuring-out how much on-chip memory you need will require some careful analysis of your application and some benchmarking (simulation).

Speed

There is a wide range of CPU speeds for DSP processors, from about 100 MHz, to about 1 GHz. Faster processors will tend to consume more power and dissipate more heat, so you will want to select a DSP processor that is just powerful enough for your application.
The best way to determine if your application will fit on a given DSP processor is to benchmark it. This is the process of executing a set of programs that is representative of your application on a cycle-accurate simulator of your target platform.

Cost

DSP processor prices range from less than $10 to about $100. A 32-bit processor will be more expensive than a 16-bit. Having a floating-point unit will cost more. Larger caches or on-chip memories will also be more expensive. Adding VLIW or increasing the CPU speed will also add to the cost.
If your volumes are going to be high, you will want to carefully select the processor that just meets your needs. This is not an easy task, as you won’t know how fast your application will execute until it’s fully ported and optimized. However, it is still possible to estimate by using benchmarks.
Inband Software can help you select the right DSP processor for your application. We can help you interpret third-party benchmark data, and run detailed benchmark simulations specific to your application, and then recommend one DSP processor that is just right for your needs.

2013年3月20日星期三

零点极点



自觉浪费了很多时间在学校里,在我那一直延续到三十多岁的求学生涯中,仅有两门课可说修正了我的思维习惯。这两门课都发生在加州理工学院。一门是Carver Mead教授的模拟IC设计,课程的内容已不再重要,只记得Mead教授的课本开首的一句话:“我每多写一个公式,就知道这本书的读者会减少一半。”整个课本讲述一个实习生去水坝工作的所见所闻。半导体的势垒当然就是那水坝,载流子的移动是他感受到的从水坝上“飘过来”的水气。整个课本几乎没有一个公式!

对知识真正的理解往往可以化作一种感觉。如果您能感觉到零点和极点的移动,普通的控制理论就不再是什么深奥的学说。另一门课是Middlebrook教授的控制理论。Middlebrook和Cuk教授是开关电源控制理论的奠基者,他们的贡献后来被我的大师兄Ericsson(虽然理论上我可以这样叫他,但与他的水平实在相差太远)写在了《Fundamentals of Power Electronics》,至今我仍然认为那是一本该行业最好的教科书。上Middlebrook的课是一种享受。记得第一堂课他让大家计算一个并不复杂的电路的传递函数,大家几乎都“做对了”。但当他指着我们延绵了三四行的算式问我们应当调整哪些参数时,大家终于明白:一个工程师所面对的未知量几乎从来都比已知量多。我们从小做的作业和试题让我们相信多数问题都可以列出和未知数一样多的方程。那门课就是教人如何抛弃不重要的量,或假设某些量可以抛弃,再验证其合理性。最后剩下极少数可以清晰控制的未知量。计算机可以代人验证,却大多不能代替人思考。

开关电源的控制理论是个十分抽象的、有时令人望而生畏的东西。系统不稳定却是个常常会遇到的问题,如何调整?为何调好的系统大批量生产时又出问题?讲理论的材料很多,大多数人还是觉得Unitrode的那几篇最早的应用手册最有用。这里只想讲讲俺一些不完全需要通过上半身就能感受到的东西。哈!开个玩笑。有了感觉再看Ericsson那几百页应当不那么困难。因是讲感觉,不周密之处难免,还望谅解。

先说极点,简单的例子是一个RC滤波。对直流C是开路,对无限高频C是短路,所以波特图的幅值在极点前是平的,极点后开始以-20dB/dec下降。俺对极点的感觉就是一个男人。男人通常开始热情高涨,但多半经不起时间的考验。无论是对爱情,还是日渐稀松的头发,男人大抵都是如此。

这样零点当然就是女人。简单的例子是一个电容的ESR零点。在直流时,电容的阻值是无穷大,随着频率的增高,阻值不断下降,到极点以后,剩下ESR电阻的阻值就再也不减小了。男人是火,则女人是水,女人虽不见得轰轰烈烈,却多半比男人更有耐力。女人对爱情多半也是刻骨铭心的,看看安娜·卡列尼娜和他的情人就不难了解男人和女人的区别。


讲完男人女人,轮到两个男人。俺不幸在旧金山附近呆了很久,但这里不想谈论同志(多好的词啊,糟蹋了)的问题。一个LC滤波组成了双极点。两个男人难免起冲突,这就像那高高的Q值。一个没有寄生电阻的LC有无穷高的Q值,会把那个谐振频率的信号放大很多,这是我们当年调一个小电容就能在收音机里收到不同电台的原因。两个男人冲突的很厉害对电源可不是什么好事。而冲突的程度是取决于寄生的电阻值,或者说是取决于劝架的强度(学名叫阻尼)。一个Q值很高的系统,相位很快就从0°到了-180°,非常容易不稳定,也难以补偿。所以一般效率高的系统(电阻成分小)不易稳定。
 

对不稳定的系统要做补偿。补偿通常是加一个零点,但同时多半会产生一个高频的极点。比如说在反馈端加一个电容,就会产生一个零点和极点对。俺对零点极点对的理解就是谈了一次恋爱。零点首先介入,正如女人在谈恋爱的开始多半较强势,对于大多数男人,那是他唯一有兴趣陪女人逛商店的时候。接下来真情的、非真情的或至少当时是真情的山盟海誓之后,男人和女人走到一起。男人的爱情极点多半是要发生的,如果发生在其生命极点之前那将是一场悲剧,反之则被称为不朽的爱情。


对于反馈系统来说,一个极点减小了幅值(有利于稳定),也减少了相位裕度(不利于稳定);一个零点则增大了幅值(不利于稳定),但增大了相位裕度(利于稳定);所以他们都是做了一件好事,一件坏事。唯有右半平面的零点,她既增大了幅值,又减少了相位裕度,也就是做了两件坏事。这样的女人只能用巫婆来形容。简单的例子是升压电路:主动管开通时,电感储存能量;二极管导通时,电感将储存的能量交给负载。负载得到的电流大约是IL(1-D)。对两个变量求导,低频时电感阻碍电流上升,高频时只有-ILd一项。前面已经知道,幅值从下降到不变的正好像电容的ESR一样是个零点,不同的是有个负号。当负载增加,D会变大以提供更多的电流。但由于输出电流瞬间和 (1-D)成正比,D的增大瞬时反而造成输出电流的减少。正是这个负号将女人变成了巫婆。

大家知道,我们用的都是负反馈系统。输出多了,就在控制的地方减一点,变化就不会太大。但环路本身大多是有相位滞后的,如果对于某一频率的信号,环路本身相位滞后180°时增益大于1 ,那么加上负反馈的180°就是360°。负反馈变成正反馈了。而且每在回路转一圈幅值都变大,自然就不稳定了。所以系统稳定的条件是转一圈增益为1时( 0dB),相位滞后要小于180°(考虑裕度,一般要小于135°)。用《尘埃落定》里那个傻子也能理解的话说,就是要像个男人(相位滞后90°,相当一个极点)或一个半男人(相位滞后135°,相当一个半极点)一样死去(到达0dB)。

让我们来看个例子,对于电流型的buck,电感上的电流被限制住了,于是可怜的电感失去了发言权(严格地说是最前排的发言权)。主电路只剩下一个Rload和Cout组成的极点(男人2)和输出电容的ESR零点(女人1)。当然控制部分肯定有个很低频的极点(男人1)。也就是说我们有两个男人,有了不稳定的危险,关键看ESR的零点(女人1)在哪儿。电解电容的零点频率很低,所以很可能部分中和了一个男人,于是可能不需要任何补偿。而陶瓷电容的零点频率很高,所以我们很可能要通过加女人的办法进行补偿(一般是一个零点极点对,也就是谈一次恋爱才能稳定)。

对于电压型的buck,L和Cout组成了双极点(男人2和男人3),加上控制部分的极点(男人1)。我们面临的可能是三个男人。毫无疑问,为了要像一个男人一样死去,我们要加一个或两个零极点对。显然电压型的buck不易稳定。像躁动的少年,免不了多谈几次恋爱才能成熟。

最后讲讲开关电路的零点极点都是如何推导出来的。真要俺在这一步步推还不定卡在哪儿,还是讲讲历史比较有趣。话说开关电源出现时,一般的控制理论已很成熟,可都是对一个固定的电路。开关电源这厮不光呆在一个状态,有时甚至会有三个以上的状态。这些状态对应了不同的状态方程,究竟怎么描述整体电路哪?Middlebrook当时引入了用占空比加权平均的办法,成功解决了这一问题。其实很好理解。比如你每往

2012年4月20日星期五

旁路、退耦、耦合电容的选取

  高手和前辈们总是告诉我们这样的经验法则:“在电路板的电源接入端放置一个1~10μF的电容,滤除低频噪声;在电路板上的电源与地线之间放置一个0.01~0.1μF的电容,滤除高频噪声。”在书店里能够得到的大多数的高速PCB设计、高速数字电路设计的经典教程中也不厌其烦的引用该首选法则(老外俗称Rule of Thumb)。但是为什么要这样使用呢?各位看官,如果你是电路设计高手,你可以去干点别的更重要的事情了,因为以下的内容仅是针对我等入门级甚至是门外级菜鸟。
做电路的人都知道需要在芯片附近放一些小电容,至于放多大?放多少?怎么放?将该问题讲清楚的文章很多,只是比较零散的分布于一些前辈的大作中。鄙人试着采用拾人牙慧的方法将几个问题放在一起讨论,希望能加深对该问题的理解;如果很不幸,这些对你的学习和工作正好稍有帮助,那我不胜荣幸的屁颠屁颠的了。(以上有些话欠砍,在此申明以上不是我所写)
什么是旁路?
clip_image004
  旁路(Bypass),在电路中为了改变某条支路的频率特性,使得它在某些频段内存在适当的阻值,而在另一些频段内则处于近似短路的状态,于是便产生了旁路电容的概念。旁路电容之所以为旁路电容,是因为它旁边还存在着一条主路,而并不是某些电容天生就是用来做旁路电容的,也就是说什么种类的电容都可以用来做旁路电容,关键在于电容容值的大小合适与否。旁路电容并不是电解电容或是陶瓷电容的专利。之所以低频电路中多数旁路电容都采用电解电容原因在于陶瓷电容容值难以达到所需要的大小。
使用旁路电容的目的就是使旁路电容针对特定频率以上的信号相对于主路来说是短路的。如图形式:要求旁路电容需要取值的大小;
已知:1、旁路电容要将流经电阻R的频率高于f的交流信号近似短路。求旁路电容的大小?
:旁路电容C的目的就是在频率f以上将原本流经R的绝大多数电流短路;也即频率为f时,容抗远小于电阻值;
clip_image006clip_image008
当f=1khz,R=1k时,C应该远大于0.16uf。因此取47uf已近很足够了,当然再大一点也不为过,100uf都还算能接受,电容适当增大可以使得旁路更充分,而且在给定频率以上支路的品质因数更低,也就使得整个支路表现出来的容性更弱,支路对信号相位的影响更小,笔者认为旁路电容的值在上述计算值的100到1000倍都可以接受。不过如果要是大于上式计算出的值的5000倍就不太好了。不过再大也不会得到多少回报,甚至有可能带来不好的后果,因为实际的电容永远都不是一个纯粹的电容。电容越大带来的其分布电感也将更显著。
什么是耦合?
耦合,有联系的意思。单元电路级联时,中间如果采用的是电容来传递信号,能量通过电容从前级传至后级,则此电容即耦合电容,作为耦合电容就应当使得两级的直流信号无法串通,只有交流信号得以通过,正因为如此使得静态的设置不相互影响,那么耦合电容该如何设定呢?
clip_image010
已知:如图,Rs表征了前级的输出电阻,R表征了后级的输入电阻,级间传递的信号频率在f以上求C的大小。
:要求信号尽可能多的传到R则C的容抗应当远小于R即:
clip_image012
如果R=5000,需要传输的信号频率为1000hz以上,则C=0.032uf
因此3.2uf便可以了,当然适当大点会更好啊,一般的电路输入电阻求起来不是一下两下的是,因而笔者建议将输入电阻取个大概的较小的值然后估算出电容的值,稍微大一点,不会有问题。
由上式可知C的大小不受Rs的影响。那么Rs到底影响了什么呢?当Rs较大时,R便相对更小,前级信号传递到后级的电压值更小,也就是Rs太大,或是R太小,那么增加电容的值(即加深级间耦合的程度)也无法挽回大局,电压信号还是会降低很多。
什么是退耦?
退耦(Decouple),最早用于多级电路中,为保证前后级间传递信号而不互相影响各级静态工作点的而采取的措施。在电源中退耦表示,当芯片内部进行开关动作或输出发生变化时,需要瞬时从电源线上抽取较大电流,该瞬时的大电流可能导致电源线上电压的降低,从而引起对自身和其他器件的干扰。为了减少这种干扰,需要在芯片附近设置一个储电的“小水池”以提供这种瞬时的大电流能力。
clip_image014在电源电路中,旁路和退耦都是为了减少电源噪声。旁路主要是为了减少电源上的噪声对器件本身的干扰(自我保护);退耦是为了减少器件产生的噪声对电源的干扰(家丑不外扬)。有人说退耦是针对低频、旁路是针对高频,我认为这样说是不准确的,高速芯片内部开关操作可能高达上GHz,由此引起对电源线的干扰明显已经不属于低频的范围,为此目的的退耦电容同样需要有很好的高频特性。本文并不刻意区分退耦和旁路,认为都是为了滤除噪声,而不管该噪声的来源。
退耦电路的形式当然不只上面图示的那样,退耦电路就一个作用就是稳定电源的电压,使电源电压不发生动摇,如果电源电压都动摇了,那么整个电路的静态都在摇,势必使得输出的信号不理想。退耦,顾名思义就是减退耦合,使得电源与后级,后级的级与级之间没有交流信号的串扰,如此而已,而之所以用两个电容只是为了达到优势互补,达到较好的隔交流的作用。
如有错漏。就跟我说说,谢谢。


















2012年3月20日星期二

关于滤波电容、去耦电容、旁路电容作用及其原理

From: http://hi.baidu.com/fdppjwqd/blog/item/60f89af282ef05baa50f5294.html/cmtid/ca07bde57b1f8b21b83820a8
从电路来说,总是存在驱动的源和被驱动的负载。如果负载电容比较大,驱动电路要把电容充电、放电,才能完成信号的跳变,在上升沿比较陡峭的时候,电流比较大,这样驱动的电流就会吸收很大的电源电流,由于电路中的电感,电阻(特别是芯片管脚上的电感,会产生反弹),这种电流相对于正常情况来说实际上就是一种噪声,会影响前级的正常工作。这就是耦合。
去藕电容就是起到一个电池的作用,满足驱动电路电流的变化,避免相互间的耦合干扰。
旁路电容实际也是去藕合的,只是旁路电容一般是指高频旁路,也就是给高频的开关噪声提高一条低阻抗泄防途径。高频旁路电容一般比较小,根据谐振频率一般是0.1u,0.01u等,而去耦合电容一般比较大,是10u或者更大,依据电路中分布参数,以及驱动电流的变化大小来确定。
去耦和旁路都可以看作滤波。去耦电容相当于电池,避免由于电流的突变而使电压下降,相当于滤纹波。具体容值可以根据电流的大小、期望的纹波大小、作用时间的大小来计算。去耦电容一般都很大,对更高频率的噪声,基本无效。旁路电容就是针对高频来的,也就是利用了电容的频率阻抗特性。电容一般都可以看成一个RLC串联模型。在某个频率,会发生谐振,此时电容的阻抗就等于其ESR。如果看电容的频率阻抗曲线图,就会发现一般都是一个V形的曲线。具体曲线与电容的介质有关,所以选择旁路电容还要考虑电容的介质,一个比较保险的方法就是多并几个电容。
去耦电容在集成电路电源和地之间的有两个作用:一方面是本集成电路的蓄能电容,另一方面旁路掉该器件的高频噪声。数字电路中典型的去耦电容值是0.1μF。这个电容的分布电感的典型值是5μH。0.1μF的去耦电容有5μH的分布电感,它的并行共振频率大约在7MHz左右,也就是说,对于10MHz以下的噪声有较好的去耦效果,对40MHz以上的噪声几乎不起作用。1μF、10μF的电容,并行共振频率在20MHz以上,去除高频噪声的效果要好一些。每10片左右集成电路要加一片充放电电容,或1个蓄能电容,可选10μF左右。最好不用电解电容,电解电容是两层薄膜卷起来的,这种卷起来的结构在高频时表现为电感。要使用钽电容或聚碳酸酯电容。去耦电容的选用并不严格,可按C=1/F,即10MHz取0.1μF,100MHz取0.01μF。
退耦原理: (去耦即退耦)
高手和前辈们总是告诉我们这样的经验法则:“在电路板的电源接入端放置一个1~10μF的电容,滤除低频噪声;在电路板上每个器件的电源与地线之间放置一个0.01~0.1μF的电容,滤除高频噪声。”在书店里能够得到的大多数的高速PCB设计、高速数字电路设计的经典教程中也不厌其烦的引用该首选法则(老外俗称Rule of Thumb)。但是为什么要这样使用呢?
首先就我的理解介绍两个常用的简单概念。
什么是旁路?旁路(Bypass),是指给信号中的某些有害部分提供一条低阻抗的通路。电源中高频干扰是典型的无用成分,需要将其在进入目标芯片之前提前干掉,一般我们采用电容到达该目的。用于该目的的电容就是所谓的旁路电容(Bypass Capacitor),它利用了电容的频率阻抗特性(理想电容的频率特性随频率的升高,阻抗降低,这个地球人都知道),可以看出旁路电容主要针对高频干扰(高是相对的,一般认为20MHz以上为高频干扰,20MHz以下为低频纹波)。
什么是退耦?退耦(Decouple), 最早用于多级电路中,为保证前后级间传递信号而不互相影响各级静态工作点的而采取的措施。在电源中退耦表示,当芯片内部进行开关动作或输出发生变化时,需 要瞬时从电源在线抽取较大电流,该瞬时的大电流可能导致电源在线电压的降低,从而引起对自身和其他器件的干扰。为了减少这种干扰,需要在芯片附近设置一个 储电的“小水池”以提供这种瞬时的大电流能力。
在电源电路中,旁路和退耦都是为了减少电源噪声。旁路主要是为了减少电源上的噪声对器件本身的干扰(自我保护);退耦是为了减少器件产生的噪声对电源的干扰(家丑不外扬)。有人说退耦是针对低频、旁路是针对高频,我认为这样说是不准确的,高速芯片内部开关操作可能高达上GHz,由此引起对电源线的干扰明显已经不属于低频的范围,为此目的的退耦电容同样需要有很好的高频特性。本文以下讨论中并不刻意区分退耦和旁路,认为都是为了滤除噪声,而不管该噪声的来源。
简单说明了旁路和退耦之后,我们来看看芯片工作时是怎样在电源线上产生干扰的。我们建立一个简单的IO Buffer模型,输出采用图腾柱IO驱动电路,由两个互补MOS管组成的输出级驱动一个带有串联源端匹配电阻的传输线(传输线阻抗为Z0)。
设电源引脚和地引脚的封装电感和引线电感之和分别为:Lv和Lg。两个互补的MOS管(接地的NMOS和接电源的PMOS)简单作为开关使用。假设初始时刻传输在线各点的电压和电流均为零,在某一时刻器件将驱动传输线为高电平,这时候器件就需要从电源管脚吸收电流。在时间T1,使PMOS管导通,电流从PCB板上的VCC流入,流经封装电感Lv,跨越PMOS管,串联终端电阻,然后流入传输线,输出电流幅度为VCC/(2×Z0)。电流在传输线网络上持续一个完整的返回(Round-Trip)时间,在时间T2结束。之后整个传输线处于电荷充满状态,不需要额外流入电流来维持。当电流瞬间涌过封装电感Lv时,将在芯片内部的电源提供点产生电压被拉低的扰动。该扰动在电源中被称之为同步开关噪声(SSN,Simultaneous Switching Noise;SSO,Simultaneous Switching Output Noise)或Delta I噪声。
在时间T3,关闭PMOS管,这一动作不会导致脉冲噪声的产生,因为在此之前PMOS管一直处于打开状态且没有电流流过的。同时打开NMOS管,这时传输线、地平面、封装电感Lg以及NMOS管形成一回路,有瞬间电流流过开关B,这样在芯片内部的地结点处产生参考电平点被抬高的扰动。该扰动在电源系统中被称之为地弹噪声(Ground Bounce,我个人读着地tan)。
              实际电源系统中存在芯片引脚、PCB走线、电源层、底层等任何互联机都存在一定电感值,因此上面就IC级分析的SSN和地弹噪声在进行Board Level分析时,以同样的方式存在,而不仅仅局限于芯片内部。就整个电源分布系统来说(Power Distribute System)来说,这就是所谓的电源电压塌陷噪声。因为芯片输出的开关操作以及芯片内部的操作,需要瞬时的从电源抽取较大的电流,而电源特性来说不能快速响应该电流变化,高速开关电源开关频率也仅有MHz量级。为了保证芯片附近电源在线的电压不至于因为SSN和地弹噪声降低超过器件手册规定的容限,这就需要在芯片附近为高速电流需求提供一个储能电容,这就是我们所要的退耦电容。
所以电容重要分布参数的有三个:等效串联电阻ESR 等效串联电感ESL 、等效并联电阻EPR Rp 。其中最重要的是ESR、 ESL,实际在分析电容模型的时候一般只用RLC简化模型,即分析电容的C、ESR、ESL。因为寄生参数的影响,尤其是ESL的影响,实际电容的频率特性表现出阻抗和频率成“V”字形的曲线,低频时随频率的升高,电容阻抗降低;当到最低点时,电容阻抗等于ESR;之后随频率的升高,阻抗增加,表现出电感特性(归功于ESL)。因此对电容的选择需要考虑的不仅仅是容值,还需要综合考虑其他因素。
所有考虑的出发点都是为了降低电源地之间的感抗(满足电源最大容抗的条件下),在有瞬时大电流流过电源系统时,不至于产生大的噪声干扰芯片的电源地引脚。
电容的频率特性
  当频率很高时,电容不再被当做集总参数看待,寄生参数的影响不可忽略。寄生参数包括Rs,等效串联电阻(ESR)和Ls等效串联电感(ESL)。电容器实际等效电路如图1所示,其中C为静电容,1Rp为泄漏电阻,也称为绝缘电阻,值越大(通常在GΩ级以上),漏电越小,性能也就越可靠。因为Pp通常很大(GΩ级以上),所以在实际应用中可以忽略,Cda和Rda分别为介质吸收电容和介质吸收电阻。介质吸收是一种有滞后性质的内部电荷分布,它使快速放电后处于开路状态的电容器恢复一部分电荷。
  ESR和ESL对电容的高频特性影响最大,所以常用如图1(b)所示的串联RLC简化模型,可以计算出谐振频率和等效阻抗:
 
914faf21f9422c079922ed9e
 
图1 去耦电容模型图
 
b81c79506a97ce5b0df3e39e
 电容器串联RLC模型的频域阻抗图如图2所示,电容器在谐振频率以下表现为容性;在谐振频率以上时表现为感性,此时的电容器的去耦作用逐渐减弱。同时还发现,电容器的等效阻抗随着频率的增大先减小后增大,等效阻抗最小值为发生在串联谐振频率处的ESR。
 
29c99b0cf8466b9f7acbe19e
 
图2 电容器串联RLC模型的频域阻抗图
由谐振频率式(4-8)可得出,容值大小和ESL值的变化都会影响电容器的谐振频率,如图3所示。由于电容在谐振点的阻抗最低,所以设计时尽量选用fR和实际工作频率相近的电容。在工作频率变化范围很大的环境中,可以同时考虑一些fR较小的大电容与fR较大的小电容混合使用。
 
bd183ec88d7eb613f31fe79e
 
 
图3 容值和ESL的变化对电容器频率特性的影响v

































退耦电容的选择

From:http://hi.baidu.com/bigbigeasy/blog/item/25ca4d4a194f872208f7efb1.html

          高手和前辈们总是告诉我们这样的经验法则:“在电路板的电源接入端放置一个1~10μF的电容,滤除低频噪声;在电路板上每个器件的电源与地线之间放置一个0.01~0.1μF的电容,滤除高频噪声。”在书店里能够得到的大多数的高速PCB设计、高速数字电路设计的经典教程中也不厌其烦的引用该首选法则(老外俗称Rule of Thumb)。但是为什么要这样使用呢?各位看官,如果你是电路设计高手,你可以去干点别的更重要的事情了,因为以下的内容仅是针对我等入门级甚至是门外级菜鸟。
         做电路的人都知道需要在芯片附近放一些小电容,至于放多大?放多少?怎么放?将该问题讲清除的文章很多,只是比较零散的分布于一些前辈的大作中。鄙人试着采用拾人牙慧的方法将几个问题放在一起讨论,希望能加深对该问题的理解;如果很不幸,这些对你的学习和工作正好稍有帮助,那我不胜荣幸的屁颠屁颠的了。
          首先就我的理解介绍两个常用的简单概念。
          什么是旁路?旁路(Bypass),是指给信号中的某些有害部分提供一条低阻抗的通路。电源中高频干扰是典型的无用成分,需要将其在进入目标芯片之前提前干掉,一般我们采用电容到达该目的。用于该目的的电容就是所谓的旁路电容(Bypass Capacitor),它利用了电容的频率阻抗特性(理想电容的频率特性随频率的升高,阻抗降低,这个地球人都知道),可以看出旁路电容主要针对高频干扰(高是相对的,一般认为20MHz以上为高频干扰,20MHz以下为低频纹波)。
         什么是退耦?退耦(Decouple),最早用于多级电路中,为保证前后级间传递信号而不互相影响各级静态工作点的而采取的措施。在电源中退耦表示,当芯片内部进行开关动作或输出发生变化时,需要瞬时从电源线上抽取较大电流,该瞬时的大电流可能导致电源线上电压的降低,从而引起对自身和其他器件的干扰。为了减少这种干扰,需要在芯片附近设置一个储电的“小水池”以提供这种瞬时的大电流能力。
         在电源电路中,旁路和退耦都是为了减少电源噪声。旁路主要是为了减少电源上的噪声对器件本身的干扰(自我保护);退耦是为了减少器件产生的噪声对电源的干扰(家丑不外扬)。有人说退耦是针对低频、旁路是针对高频,我认为这样说是不准确的,高速芯片内部开关操作可能高达上GHz,由此引起对电源线的干扰明显已经不属于低频的范围,为此目的的退耦电容同样需要有很好的高频特性。本文以下讨论中并不刻意区分退耦和旁路,认为都是为了滤除噪声,而不管该噪声的来源。
         简单说明了旁路和退耦之后,我们来看看芯片工作时是怎样在电源线上产生干扰的。我们建立一个简单的IO Buffer模型,输出采用图腾柱IO驱动电路,由两个互补MOS管组成的输出级驱动一个带有串联源端匹配电阻的传输线(传输线阻抗为Z0)。
        为了做成纯文档的格式,尽量采用文字说明,不不采用图片,这样给理解带来一定的困难,看官们见笑了。设电源引脚和地引脚的封装电感和引线电感之和分别为:Lv和Lg。两个互补的MOS管(接地的NMOS和接电源的PMOS)简单作为开关使用。假设初始时 刻传输线上各点的电压和电流均为零,在某一时刻器件将驱动传输线为高电平,这时候器件就需要从电源管脚吸收电流。在时间T1,使PMOS管导通,电流从PCB板上的VCC流入,流经封装电感Lv,跨越PMOS管,串联终端电阻,然后流入传输线,输出电流幅度为VCC/(2×Z0)。电流在传输线网络上持续一个完整的返回(Round-Trip)时间,在时间T2结束。之后整个传输线处于电荷充满状态,不需要额外流入电流来维持。当电流瞬间涌过封装电感Lv时,将在芯片内部的电源提供点产生电压被拉低的扰动。该扰动在电源中被称之为同步开关噪声(SSN,Simultaneous Switching Noise;SSO,Simultaneous Switching Output Noise)或Delta I噪声。
          在时间T3,关闭PMOS管,这一动作不会导致脉冲噪声的产生,因为在此之前PMOS管一直处于打开状态且没有电流流过的。同时打开NMOS管,这时传输线、地平面、封装电感Lg以及NMOS管形成一回路,有瞬间电流流过开关B,这样在芯片内部的地结点处产生参考电平点被抬高的扰动。该扰动在电源系统中被称之为地弹噪声(Ground Bounce,我个人读着地tan)。
实际电源系统中存在芯片引脚、PCB走线、电源层、底层等任何互连线都存在一定电感值,因此上面就IC级分析的SSN和地弹噪声在进行Board Level分析时,以同样的方式存在,而不仅仅局限于芯片内部。就整个电源分布系统来说(Power Distribute System)来说,这就是所谓的电源电压塌陷噪声。因为芯片输出的开关操作以及芯片内部的操作,需要瞬时的从电源抽取较大的电流,而电源特性来说不能快速响应该电流变化,高速开关电源开关频率也仅有MHz量级。为了保证芯片附近电源线上的电压不至于因为SSN和地弹噪声降低超过器件手册规定的容限,这就需要在芯片附近为高速电流需求提供一个储能电容,这就是我们所要的退耦电容。
         如果电容是理想的电容,选用越大的电容当然越好了,因为越大电容越大,瞬时提供电量的能力越强,由此引起的电源轨道塌陷的值越低,电压值越稳定。但是,实际的电容并不是理想器件,因为材料、封装等方面的影响,具备有电感、电阻等附加特性;尤其是在高频环境中更表现的更像电感的电气特性。我们都知道实际电容的模型简单的以电容、电阻和电感建立。除电容的容量C以外,还包括以下寄生参数:
         1、等效串联电阻ESR(Resr):电容器的等效串联电阻是由电容器的引脚电阻与电容器两个极板的等效电阻相串联构成的。当有大的交流电流通过电容器,Resr使电容器消耗能量(从而产生损耗),由此电容中常用用损耗因子表示该参数。
         2、等效串联电感ESL(Lesl):电容器的等效串联电感是由电容器的引脚电感与电容器两个极板的等效电感串联构成的。
         3、等效并联电阻EPR Rp :就是我们通常所说的电容器泄漏电阻,在交流耦合应用、存储应用(例如模拟积分器和采样保持器)以及当电容器用于高阻抗电路时,Rp是一项重要参数,理想电容器中的电荷应该只随外部电流变化。然而实际电容器中的Rp使电荷以RC时间常数决定的速度缓慢泄放。
          还是两个参数RDA、CDA 也是电容的分布参数,但在实际的应该中影响比较小,这就省了吧。所以电容重要分布参数的有三个:ESR、ESL、EPR。其中最重要的是ESR、 ESL,实际在分析电容模型的时候一般只用RLC简化模型,即分析电容的C、ESR、ESL。因为寄生参数的影响,尤其是ESL的影响,实际电容的频率特性表现出阻抗和频率成“V”字形的曲线,低频时随频率的升高,电容阻抗降低;当到最低点时,电容阻抗等于ESR;之后随频率的升高,阻抗增加,表现出电感特性(归功于ESL)。因此对电容的选择需要考虑的不仅仅是容值,还需要综合考虑其他因素。包括:
1、电容容值;2、电介质材料;3、电容的几何尺寸和放置位置。
          所有考虑的出发点都是为了降低电源地之间的感抗(满足电源最大容抗的条件下),在有瞬时大电流流过电源系统时,不至于产生大的噪声干扰芯片的电源地引脚。选用常见的有两种方法计算所需的电容:
简单方法:由输出驱动的变化计算所需退耦电容的大小;
复杂方法:由电源系统所允许的最大的感抗计算退耦电容的大小。
         我们假设一个模型,在一个Vcc=3.3V的SRAM系统中,有36根输出数据线,单根数据线的负载为Cload=30pF(相当的大了),输出驱动需要在Tr=2ns(上升时间)内将负载从0V驱动到3.3V,该芯片资料里规定的电源电压要求是3.3V+0.3V/-0.165V。
         可以看出在SRAM的输出同时从0V上升到3.3V时,从电源系统抽取的电流最大,我们选择此时计算所需的退耦电容量。我们采用第一种计算方法进行计算,单根数据线所需要的电流大小为:
         I=Cload×(dV/dt)=30pF×(3V/2ns)=45mA;
        36根数据线同时翻转时的电流大小为Itot=45mA×36=1.62A。芯片允许的供电电压降为0.165V,假设我们允许该芯片在电源线上因为SSN引入的噪声为50mV,那么所需要的电容退耦电容为:
       C=I×(dt/dV)=1.62A×(2ns/50mV)=64nF;
         从标准容值表中选用两个34nF的电容进行并联以完成该值,正如上面提到的退耦电容的选择在实际中并不是越大越好,因为越大的电容具有更大的封装,而更大的封装可能引入更大的ESL,ESL的存在会引起在IC引脚处的电压抖动(Glitching),这个可以通过V=L×(di/dt)公式来说明,常见贴片电容的L大约是1.5nH,那么V=1.5nH×(1.62A/2ns)=1.2V,考虑整个Bypass回路的等效电感之后,实际电路中glitch会小于该值。通过前人做的一些仿真的和经验的数据来看,退耦电容上的Glitch与同时驱动的总线数量有很大关系。
         因为ESL在高频时觉得了电源线上的电流提供能力,我们采用第二种方法再次计算所需的退耦电容量。这中方法是从Board Level考虑单板,即从Bypass Loop的总的感抗角度进行电容的计算和选择,因此更具有现实意义,当然需要考虑的因素也就越多,实际问题的解决总是这样,需要一些折中,需要一点妥协。
        同样使用上面的假设,电源系统的总的感抗最大:
         Xmax=(dV/dI)=0.05/1.62=31m欧;
         在此,需要说明我们引入的去耦电容是为了去除比电源的去耦电容没有滤除的更高频率的噪声,例如在电路板级参数中串联电感约为Lserial=5nH,那么电源的退耦频率:
         Fbypass=Xmax/(2pi×Lserial)=982KHz,这就是电源本身的滤波频率,当频率高于此频率时,电源电路的退耦电路不起作用,需要引入芯片的退耦电容进行滤波。另外引入另外一个参数——转折点频率Fknee,该频率决定了数字电路中主要的能量分布,高于该频率的分量认为对数字电路的上升沿和下降沿变化没有贡献。在High-Speed Digital Design:A Hand Book of Black Magic这本书的第一章就详细的讨论了该问题,在此不进行详细说明。只是引入其中推倒的公式:
      Fknee=(1/2×Tr)=250MHz,其中Tr=2ns;
可见Fknee远远大于Fbypass,5nH的串联电感肯定是不行了。那么计算:
      Ltot=Xmax/(2pi×Fknee)=(Xmax×Tr/pi)=19.7pH;
如前面提到的常见的贴片电容的串联电感在1.5nH左右,所需要的电容个数是:
       N=(Lserial/Ltot)=76个,另外当频率降到Fbypass的时候,也应该满足板级容抗需要即:
Carray=(1/(2pi×Fbypass×Xmax))=5.23uF;
Celement=Carray/N=69nF;
          哇噻,真不是一个小数目啊,这么多啊!如果单板上还有其他器件同时动作,那么需要更多的电容呢!如果布不下,只能选择其他具有更小电感值的电容了。
      电容选择上都采用的MLCC的电容进行退耦,常见的MLCC的电容因为介质的不同可以进行不同的分类,可以分成NPO的第一类介质,X7R和Z5V等的第二、三类介质。EIA对第二、三类介质使用三个字母,按照电容值和温度之间关系详细分类为:
第一个数字表示下限类别温度:
X:-55度;Y:-30度;Z:+10度
第二个数字表示上限温度:
4:+65度;5:+85度;6:105度;7:125度;8:150度;
第三个数字表示25度容量误差:
P:+10%/-10%;R:+15%/-15%;S:+22%/-22%;
T:+22%/-33%;U:+22%/-56%;V:+22%/-82%
        例如我们常见的Z5V,表示工作温度是10度~85度,标称容量偏差+22%/-82%,就这玩意儿我们还大用特用啊。
          介质性能好的电容容量做不大,容量大的介质常量不好,生活啊,你怎么总是这么矛盾啊!尤其重要的一点是MLCC电容提供的电容值都是指静电容量,表示电容在很低的电压下测试得到的电容量,当电容的两端的直流电压在不超过电容耐压下加大时电容量将急剧下降,例如在某耐压16V 的MLCC电容的测试数据中有:
0V-->100%,8V——>86%,12V——>68%,16V——55%。
       我就因为没有注意该特性在某电路设计中出现了惨痛的教训。
         最后关于电容放置的位置,还得引用前辈们的口头禅:“The rule of thumb is to place the capacitor as close as possible to the IC.”
          本来以为自己可以写出藏之名山,传世不朽的大作的,写着写着就不想写了,关键还是肚子里没货,就不污染大家的眼睛了,也不误导看客了。



2011年11月22日星期二

Using Relays (Tips & Tricks)

From: http://jumperone.com/2011/10/using-relays/
In this article I will tell you how to get shorter relay switching times and how to minimize relay current consumption. The same exact things apply to solenoids and solenoid valves.
Usually if you want to control relay from microcontroller you would do something like this:



You need to use a transistor because either relay you want to control needs a higher voltage than your microcontroller can provide, or relay’s current demand is too high. Although some microcontrollers can give enough current to switch a relay, but most of them is incapable of doing that.
And the diode in parallel with relay coil (or solenoid coil) is needed to suppress the flyback voltage that occurs when transistor is switching-off and magnetic field stored in coil collapses. That flyback voltage can reach hundreds of volts, which can completely destroy the driving transistor.
Switch-off (release) speed
When you cutting power to relay, the energy stored in the coil will slowly dissipate through the diode. The problem with this is slow relay release time. This time could be crucial to some high-speed relays or to fast acting valves, like, for example, car fuel injectors, which should open and close really fast to inject specific amount of fuel into combustion chamber (maybe I will write about this someday).
To conquer this problem you can put a zener diode in series with flyback protection diode like so:


This will allow for flyback voltage to go higher, therefore helping to dissipate stored energy in coil much faster and dramatically decreasing relay release time. Zener diode voltage should be lower than transistor breakdown voltage, which you can find in that transistor’s datasheet.
The little test that I’ve made with this relay



shows much smaller release time when using zener diode, than with single clamping diode.
Relay with clamping diode takes about 11.5 milliseconds to turn-off (release):


Channel 1 (yellow) shows state of relay control signal, and channel 2 (blue) goes low when relay is ON.
With additional 12V zener diode it’s only 3.5 milliseconds, which is 8ms less than with just a clamping diode alone.


And without clamping diode at all it’s roughly 2.5 milliseconds. Which is not that different from 3.5 ms with 12V zener diode.


So as you can see, zener diode in series with ordinary clamping diode significantly speeds up relay release. All relays and solenoids behave the same, but release time will vary.
PICK/HOLD Power Consumption
Once relay is picked it doesn’t need that much current to hold it’s contacts. Usually relay needs only about 50% of pick voltage to hold it’s position. So relay needs higher current only at the beginning to pull contacts from one end to another. For example relay that I was testing earlier has 12VDC coil, but it can be easily pulled-in at 9V and reliably hold it’s contacts at about 4V.
I’m gonna tell you about two solutions to this problem. This solutions can save you battery life in battery-operated devices, or can save you money by selecting power supply with less output current, especially when you need to switch more than one relay simultaneously or some big single relay. In addition to that it will decrease release time, because coil will store less energy.
The first solution is this:



Capacitor in discharged state has very low impedance, it’s almost like a short and it will pass full current needed by relay to pick. Then, as capacitor will fully charge, it will completely stop passing any current, and all the current will flow through the resistor connected in parallel with the capacitor, therefore lowering the relay current consumption.
So, basically, the capacitor provides initial “kick” needed by relay to pull-in, and then current will flow through the resistor.
I made a little experiment with the above relay, powering it from 9VDC with 200Ω resistor in series. That relay has 12VDC 155Ω coil, and it draws about 58mA working from 9V.
When connected in series with 200Ω resistor and still working from 9V this circuit draws only about 25mA instead of 58mA. So the coil works from about 4V, whilst 5V dropping on the resistor. And under 4V the relay holds close pretty reliable (at least for the experiment).
But 4V is not nearly enough to initially pull-in. So I found out that it needs at least 330uF capacitor in parallel with the resistor to work reliably.
As you can see, the results is pretty nice. 58mA @ 9V versus 25mA @ 9V.
But this solution has it’s own downsides – part of energy will dissipate through the resistor in form of heat, so when you have a really big relay, you would need a power resistor; and second one is that you would need a comparatively big capacitor for each relay.
And the second solution allows you to make the same thing, but without any extra parts, by using PWM once relay is picked:



When using microcontroller to switch relay on and off, you often have enough processor time or even hardware capability to generate PWM on one or on multiple MCU outputs.
This will allow you to “chop” relay current consumption without adding any additional parts to the circuit.
So, basically, if PWM would be 50% on and 50% off – then relay will consume only half of the current needed to pull-in. But for switching relay with this method you need to implement simple software algorithm, for example like this one:
1. RELAY_OUTPUT_PWM = 100%
2. DELAY 20ms
3. RELAY_OUTPUT_PWM = 50% (or whatever ratio you want to set)
There is another methods to lower relay power consumption exists, like using two transistors and two different power supply voltages, or using discrete logic and some external clock to make PWM, or even using additional set of contacts(if your relay has any) to implement pick and hold function without capacitor.
That’s it! Here you can download datasheet for BS-901, the relay I was playing with