【博客大赛】使用LM2677制作的3V至24V数控可调恒压源
http://bbs.ednchina.com/BLOG_ARTICLE_3013105.HTM
LM2677,是TI公司生产的高效率5A开关buck稳压器,由于它内部具备的low ON-register DMOS功率开关,
使得它能够驱动大电流负载。LM2677有+3.3V、+5V、+12V和AJUSTABLE四个版本,
其中AJUSTABLE的输出范围是1.2V~37V,使用它可以做一个可调的恒压源。
官方手册中给出的AJUSTABLE典型应用电路如下:
在上图中,R1固定为1K,选择不同的R2值,就能得到不同的输出电压。
VOUT = VREF * (R1 + R2) / R1 其中VREF = 1.21V。
如果需要得到14.8V的输出,那么R2选择11.23KΩ就可以了。
要制作一个手动可调的恒压源,将R2换成一个电位器即可。
用户拧动电位器,使其有效阻值变化,LM2677的输出也会随之变化。
LM2677的内部工作原理,是使用VOUT反馈到FB端的电压,与参考电压VREF比较,构成一个负反馈网络。
VOUT反馈到FB的电压,可以直接使用电阻来实现(如使用电位器),
也可以使用运算放大器构成的电路(如方案一),
实际上,只要是能将VOUT反馈到FB端的任何方式,都可以实现调节功能,
比如使用AD采集VOUT,然后使用DA反馈到FB。
J1是+28V电源输入接口。也可输入不大于40V的任意电压,(输出电压会稍低于输入电压)。
输入非+28V电压,也会获得正确的输出电压,但结果由设计保证,不做测试。
因为这块电路板有数字部分和模拟部分,所以布线的时候需要把地平面分开,
数字部分的+5V/GND在U1处单点共地(为什么不在电源入口J1处单点共地呢?
因为LM2596的输出+5V在U1处输入数字部分,在这个地方共地,电源构成的环路最小)。
电感附近不建议放置信号线,所以IC3(LM2677)的6号引脚以及IC1(LM2596)的4号引脚上面的线,
都离电感较远。数字部分的地平面采用relief connect,模拟部分的地平面采用direct connect,
因为数字部分的电流较小,而模拟部分的大电流可能会烧坏焊盘的leader。
这种方案,需要使用AD和DA芯片,看起来是最复杂。但是由于数控方案本身需要UART
(或其他通讯协议)的功能而必须使用MCU,而目前的MCU集成了AD和DA部分,
所以反而在电路实现上最为简单。
(32位CORTEX-M3的ARM异军突起,使得集成AD和DA的单片MCU价格也在二十元以下,
而使用8位MCU配合DA和AD芯片的成本,已经超过了前者。
虽然使用前者强大的32位处理功能,来实现单一的电压调节,实在是有点浪费啊-_-~~~)
图中,VOUT经过R14和R16分压之后,输入至AD采样,结果经过运算之后,
转换出相应的DA值,经过R13,反馈到FB上。
使用R11连接+24V,这样即使DAC_OUT失效,输出也会保持在很低的安全电压下。
D4的作用是将DAC_OUT电压钳位在+3.3V上,保护DA输出引脚。
只要DAC_OUT能够以正确的比例反映ADC_IN的值,那么这个负反馈网络就构建成功。
OFF引脚具备内部上拉,如果悬空则芯片会一直工作。
加上R17下拉到地,使得MCU未工作时LM2677处在关断状态。
大电流器件的说明(这一小节的内容,参看LM2677的用户手册更好哈~~)
LM2677可提供5A的负载电流,它的外围功率器件也必须达到至少5A负载能力,
而且在大电流开关稳压器的应用中,器件的选择上还有其他一些要十分注意的地方。
(虽然关于器件的选择理由,这一部分内容在用户手册中十分晦涩,但是读懂了之后会获益良多~~
作为数字电路设计偏多的人,这一部分俺已经看了多遍,可还是在半懂不懂之间~~)
此块电路板在上电时有打火现象,通过直流电源观察到,启动电流超过了3A的阈值,
可以清晰的听到直流电源继电器的声音。过了启动瞬间之后,电流会立刻降低到10mA以下。
从前设计的电路板,使用LM2596 作为电路板稳压芯片,并使用220uF的输入电容,
+12V输入电压,打火情况几乎可忽略不计,它引起的电流冲击也不会造成器件的破坏,
所以也没有做消除打火的措施。而这块电路板打火现象非常严重,
调试工具USB/RS232转换线也跟着不正常。所以增加消除打火的电路就变得非常必要了。
打火现象主要是由于输入电容太大引起的。LM2677的输入电容2200uF。
消除打火,就是要给电容预充电(pre-charge)。
以下灰色字体的内容来自维基百科的pre-charge词条:
“Pre-charge of the powerline voltages in a high voltage DC application
is a preliminary mode which current-limits the power source such that
a controlled rise time of the system voltage during power up is achieved.”
“When a high-voltage system is designed appropriately
to handle the flow of maximum rated power through its distribution system,
the components within the system can still undergo considerable stress
upon the system ‘power up’. In some applications, the occasion to activate
the system is a rare occurrence, such as in commercial utility power distribution
which is typically on almost all of the time.
Yet in other systems such as in vehicle applications,
activation will occur with every individual use of the system.
When a long life of the components and a high reliability of the high voltage system
is needed, then a power-up method which reduces and limits the power-up stress is required.”
pre-charge可以限制电流输出,并在power-up时控制板上电压的上升时间,
虽然一个设计得很好的high-voltage系统能够承受power-up的冲击,但是需要经常启动的系统,
比如车辆应用,需要提高器件寿命和可靠性时,使用pre-charge就很必要。
“In-rush currents into capacitive components are a key concern in power-up stress to components.
When DC input power is applied to a capacitive load, the step response of the voltage input will
cause the input capacitor to charge. The capacitor charging starts with an inrush current and ends
with an exponential decay down to the steady state condition.
When the magnitude of the inrush peak is very large compared to the maximum rating of the components,
then components stress is to be expected.
The current into a capacitor is known to be I=C(dV/dT):
the peak inrush current will depend upon the capacitor C and the rate of change of the voltage (dV/dT).
The inrush current will increase as the capacitance value increases, and the inrush current will
increase as the voltage of the power source increases.
This second parameter is of primary concern in high voltage power distribution systems.
By their nature, high voltage power sources will deliver high voltage into distribution system.
Capacitive loads will then be subject to high inrush currents upon power-up.
The stress to the components must be understood and minimized.”
In-rush电流(浪涌电流)是电容的关键参数。电容充电始于in-rush current,结束于指数级衰退。
电容的电流为I=C(dV/dT),因此电容的容值越大,电源电压的上升趋势越大,inrush电流也会越大。
从上表看出,如果输入电容11000uF,电源电压在10ms内升至+28V,inrush电流会到31A。
而LM2677的输入电容为2200uF,inrush电流约为6.2A。
“The functional requirement of the high voltage pre-charge circuit is
to minimize the peak current out from the power source by slowing down
the dV/dT of the input power voltage such that a new ‘pre-charge mode’ is created.
Of course the inductive loads on the distribution system must
be switched off during the pre-charge mode.
While pre-charging, the system voltage will rise slowly and controllably
with power-up current never exceeding the maximum allowed.
As the circuit voltage approached near steady state, then the pre-charge function is complete.
Normal operation of a pre-charging circuit is to terminate pre-charge mode
when the circuit voltage is 90% or 95% of the operating voltage.
Upon completion of pre-charging, the pre-charge resistance is switched
out of the power supply circuit and returns to a low impedance power source for normal mode.
The high voltage load are then powered up sequentially.”
既然电容通常不方便修改,那么就可以通过减慢dV/dT来减小inrush电流。
当pre-charge进行时,不能接通感性负载,如电机。当到达operation电压的90%或者95%时,
pre-charge就可以终止。终止后,可以将pre-charge电阻短接,以减少功耗。
“The simplest inrush-current limiting system,
used in many consumer electronics devices, is a NTC resistor.
When cold, its high resistance allows a small current to pre-charge the reservoir capacitor.
After it warms up, its low resistance more efficiently passed the working current.”
最简单的pre-charge电路,是使用一个NTC热敏电阻。
启动时,它的温度较低,阻值较大,用来给电容充电;随着温度升高,阻值变小,用来通过工作电流。
也有使用继电器的pre-charge方案,它能完全短接pre-charge电阻,从而最大限度的减少功耗。
考虑到继电器的硬件成本和功耗,LM2677这个电路还是采用了NTC热敏电阻的方案。
那剩下的工作,就是选择合适的NTC电阻了。
以下灰色字体的内容来自http://www.yzxdz.com/news_content-79990.html:
“滤波电容的大小决定了应该选用多大尺寸的NTC。对于某个尺寸的NTC热敏电阻来说,允许接入的滤波电容的大小是有严格要求的,
这个值也与最大额定电压有关。在电源应用中,开机浪涌是因为电容充电产生的,因此通常用给定电压值下的允许接入的电容量来
评估NTC热敏电阻承受浪涌电流的能力。对于某一个具体的NTC热敏电阻来说,所能承受的最大能量已经确定了,根据一阶电路中
电阻的能量消耗公式E=1/2×CV2可以看出,其允许的接入的电容值与额定电压的平方成反比。简单来说,就是输入电压越大,
允许接入的最大电容值就越小,反之亦然。”
“NTC热敏电阻产品的规范一般定义了在220Vac下允许接入的最大电容值。假设某应用条件最大额定电压是420Vac,
滤波电容值为200μF,根据上述能量公式可以折算出在220Vac下的等效电容值应为200×4202/2202=729μF,
这样在选型时就必须选择220Vac下允许接入电容值大于729μF的型号。”
“电子产品允许的最大启动电流值决定了NTC热敏电阻的阻值。假设电源额定输入为220Vac,内阻为1Ω,
允许的最大启动电流为60A,那么选取的NTC在初始状态下的最小阻值为Rmin=(220×1.414/60)-1=4.2(Ω)。”
“产品正常工作时,长期加载在NTC热敏电阻上的电流应不大于规格书规定的电流。
根据这个原则可以从阻值大于4.2Ω的多个电阻中挑选出一个适合的阻值。当然这指的是在常温情况下。
如果工作的环境温度不是常温,就需要按下文提到的原则来进行NTC热敏电阻的降额设计。”
“电源设计中使用NTC热敏电阻型浪涌抑制器,其抑制浪涌电流的能力与普通电阻相当,
而在电阻上的功耗则可降低几十到上百倍。对于需要频繁开关的应用场合,电路中必须增加继电器旁路电路
以保证NTC热敏电阻能完全冷却恢复到初始状态下的电阻。在产品选型上,要根据最大额定电压和滤波电容值选定产品系列,
根据产品允许的最大启动电流值和长时间加载在NTC热敏电阻上的工作电流来选择NTC热敏电阻的阻值,同时要考虑工作环境的温度,适当进行降额设计。 ”
最大工作电流 > 电源回路工作电流
标称电阻值R ≥ 1.414 * E / Im;E为线路电压,Im为浪涌电流
材料常数B值越大,残余电阻越小,温升越小
时间常数与耗散系数的乘积越大,热容量越大,抑制浪涌电流的能力也越强
能否不加pre-charge电路,而通过缓慢升高电源电压来避免inrush current呢?
当然可以。如果使用直流电源,那缓慢的拧动输出旋钮就行。如果是使用开关电源,那还是算了吧。
下图是5V10A的开关电源的输出波形(空载),它可是在10ms内就从0V升到了+5V。
理论分析很麻烦,但是结论通常都很简单。通常确定最大工作电流和标称阻值之后,就能选定NTC的型号。
在LM2677的应用中,最大工作电流需要>5A,标称电阻值需要R ≥ (1.414 * 28 / 7) = 5.656Ω。
NTC6D-20、NTC8D-20、NTC10D-20都是不错的选择,使用时串在电源线正极上即可。
开关稳压芯片的最大负载电流,实际使用的时候往往达不到技术手册上的标称值。比如LM2677的标称最大负载电流是5A,
但是实际上往往到不了4A,再增大负载时,输出电压会被拉下来。这是为什么呢?难道是芯片买到假货了吗?
并联输出电容,能够稍微的增大负载能力,因为并联降低了输出电容的ESR,也减轻了在电容上的损耗。
可是,这个措施能带来的改进,实在是很小。LM2677的输出电容,即使并联了5个,
能够提高的负载能力也不过不到0.2A而已。其实switch regular能否到达标称负载能力的关键,
在于它的thermal management。散热有那么重要么?散热就是有那么重要!
在http://www.eevblog.com/forum/reviews/lm2596-dc-dc-step-down-modules-load-testing/
这个论坛中也提到类似的问题:使用3A的regular LM2596时,当负载电流为2.5A时,不到一分钟,输出电压就会被拉下来。
LM2677输入+28V电流4A时,输入功率112W,热功率112W*8%=8.96W,因此需要15.29cm2*6.72=137cm2的面积。
LM2677的TO263背板过孔不用太大(12mil),但是要很多。
散热片加在LM2677的bottom比加在top要好。从图上来看,散热片的面积不用很大,覆盖exposed pad即可。
(要达到标称的5A负载,在器件的选择和散热的处理上,都要狠下功夫。目前这块电路板,调整过输出电容、输出电感、
钳位二极管,修改过散热措置,但是能达到的最大负载电流只有3.8A(输出电压5V情况下),
而且随着输入输出压差的减小,最大负载电流也会减小~~更深的研究,就留给各位感兴趣的童鞋吧~~)
使用数字控制来实现LM2677的模拟控制,最简单的程序实现方案莫过于,使用ADC的值乘以相应的比例,给出DAC的值。
这种方案里,没有算法,没有数字PID,ADC采到什么,DAC就给出什么。简单,直接,有效。
程序需要实现以下步骤:
- 在定时器中断服务程序中,采集10次voltageOut的值,做平均值滤波;
- 使用voltageOut,计算实际比例的LM2677输出(mV);
- 按照指令中的理想输出,计算理想的等效反馈电阻resFeed;
- 根据理想的等效反馈电阻resFeed和实际的反馈电阻,计算应有的反馈电压;
- 根据反馈电压,计算并给出对应的DAC值;
- 启动下一次ADC;
增量式数字PID算法的用途非常广泛,几乎能想到的控制,都可以用它来实现,最常见的如直流电机的速度闭环。
对于LM2677的电路来说,设定值就是用户输入的理想输出电压,输出值就是LM2677的实际输出电压,
控制量就是加在LM2677反馈引脚上的DAC输出值。LM2677的MCU程序需要实现的功能就是,
采集LM2677的实际输出电压,和用户输入的理想输出电压比较,根据比较出来的偏差,
调整LM2677反馈引脚上的DAC输出值,直到使实际输出电压等于理想输出电压。
100us的调节时间,用定时器TIM2的溢出中断来实现,但是PID调节的计算并不在中断服务程序中。
TIM2_IRQHandler仅仅做了一件事情,就是启动一次ADC扫描。扫描完成之后,ADC的数据会经由DMA通道传输到指定地址的数组中,
DMA1_Channel1_IRQHandler是DMA中断,当需要扫描的ADC通道都转换完成之后,DMA中断被触发,在这里进行PID运算。
void TIM2_IRQHandler( void ) { if ( TIM_GetITStatus( TIM2, TIM_IT_Update ) != RESET ) { TIM_ClearITPendingBit( TIM2, TIM_IT_Update ); auu.dmaFlag = TRUE; adc_startScan( ); } } void DMA1_Channel1_IRQHandler( void ) { if ( DMA_GetITStatus( DMA1_IT_TC1 ) != RESET ) { DMA_ClearITPendingBit( DMA1_IT_TC1 ); if ( auu.dmaFlag == TRUE ) { auu.dmaFlag = FALSE; regular_pid( ); } } }
PID为数字增量式,
buu.vol_set是用户给定的输出电压值,
buu.vol_out为实际采回来的输出电压值,
auu.voltageOut为ADC的运算结果,
auu.voltageFeed为DAC的给定结果。
struct __pid { int32_t vol_set; int32_t vol_out; int32_t vol_feed; int32_t vol_preError; int32_t vol_preDError; int32_t vol_P; int32_t vol_I; int32_t vol_D; int32_t deadline; }; struct __pid buu; uint8_t regular_pid( void ) { int32_t i = 0; int32_t error_t, derror_t, dderror_t; for ( auu.voltageOut = 0, i = 2; i < ADC_NUM; i++ ) auu.voltageOut += adcResult[ i ]; auu.voltageOut /= ( ADC_NUM - 2 ); auu.voltageOut = ( auu.voltageOut * ( VOUT_RES_H + VOUT_RES_L ) / VOUT_RES_L ) * ( 3300 / 4 ) / ( 4096 / 4 ); buu.vol_set = auu.voltageSet; buu.vol_out = auu.voltageOut; error_t = buu.vol_set - buu.vol_out; derror_t = error_t - buu.vol_preError; dderror_t = derror_t - buu.vol_preDError; buu.vol_preError = error_t; buu.vol_preDError = derror_t; if ( !( ( error_t < buu.deadline ) && ( error_t > -buu.deadline ) ) ) buu.vol_feed += buu.vol_P * derror_t + buu.vol_I * error_t / 100 + buu.vol_D * dderror_t / 100; auu.voltageFeed = buu.vol_feed / 1000; auu.voltageFeed = 3114 - auu.voltageFeed; if ( auu.voltageFeed > 3114 + 980 ) auu.voltageFeed = 3114 + 980; if ( auu.voltageFeed < 3114 - 980 ) auu.voltageFeed = 3114 - 980; DAC_SetChannel1( auu.voltageFeed ); return 0; }
这是一个很典型的增量式数字PID算法,error_t是误差,derror_t是误差之差,dderror_t是误差之差的差。
通过PID运算buu.vol_feed之后,乘以相应的比例,给出DAC的值。
理想情况下,输出电压会以一个缓慢的趋势到达指令值。实际情况是,这“一个缓慢的趋势”与负载大小有关系,负载大,则趋势快;
负载小,则趋势慢。所以在不同的负载电流下,需要不一样的PID参数值。
(调节PID参数,是一件吃力不讨好的事情,枯燥无趣,而且很难掌握一个绝对的规律。
所以才会有那么多人去研究更高级的PID算法,比如神经网络、模糊数学、马尔可夫算法等等~~~
尼玛用好控制理论真是一门很不简单的工作~~~~)
三个PID参数分别为buu.vol_P、buu.vol_I、buu.vol_D。
不同的参数会获得不同特性的输出。经过调试,发现如果使用下面的参数表,会获得相当不错的波形。
这几张张表中都没有0A负载电流的情况,是因为负载太小时PID失去了调节能力。
不论指令电压给了多少,输出电压都几乎等于输入电压。而加大负载之后,输出电压会调节到指令电压位置。
总结,使用LM2677制作的这个恒压源,比起使用运放的方案,
硬件成本更低,噪声稍大,调节速度稍逊,适用于不方便使用PWM调制的电阻性负载。