国产亚洲一本大道中文在线_直流穩壓電源,高頻開(kāi)關(guān)電源,高壓直流電源,大功率直流電源_直流電源廠(chǎng)家http:///直流穩壓電源,高頻開(kāi)關(guān)電源,高壓直流電源,大功率直流電源_直流電源廠(chǎng)家C語(yǔ)言預處理命令http:///hangyexinwen/582.html<p>預處理(或稱(chēng)預編譯)是指在進(jìn)行編譯的第一遍掃描(詞法掃描和語(yǔ)法分析)之前所作的工作。預處理指令指示在程序正式編譯前就由編譯器進(jìn)行的操作,可放在程序中任何位置。</p><p><br/></p><p>預處理是C語(yǔ)言的一個(gè)重要功能,它由預處理程序負責完成。當對一個(gè)源文件進(jìn)行編譯時(shí),系統將自動(dòng)引用預處理程序對源程序中的預處理部分作處理,處理完畢自動(dòng)進(jìn)入對源程序的編譯。</p><p><br/></p><p>C語(yǔ)言提供多種預處理功能,主要處理#開(kāi)始的預編譯指令,如宏定義(#define)、文件包含(#include)、條件編譯(#ifdef)等。合理使用預處理功能編寫(xiě)的程序便于閱讀、修改、移植和調試,也有利于模塊化程序設計。</p><p><br/></p><p>二&nbsp; 宏定義</p><p><br/></p><p>C語(yǔ)言源程序中允許用一個(gè)標識符來(lái)表示一個(gè)字符串,稱(chēng)為“宏”。被定義為宏的標識符稱(chēng)為“宏名”。在編譯預處理時(shí),對程序中所有出現的宏名,都用宏定義中的字符串去代換,這稱(chēng)為宏替換或宏展開(kāi)。</p><p><br/></p><p>宏定義是由源程序中的宏定義命令完成的。宏替換是由預處理程序自動(dòng)完成的。</p><p><br/></p><p>在C語(yǔ)言中,宏定義分為有參數和無(wú)參數兩種。下面分別討論這兩種宏的定義和調用。</p><p><br/></p><p>2.1 無(wú)參宏定義</p><p><br/></p><p>無(wú)參宏的宏名后不帶參數。其定義的一般形式為:</p><p><br/></p><p>#define&nbsp; 標識符&nbsp; 字符串</p><p><br/></p><p>其中,“#”表示這是一條預處理命令(以#開(kāi)頭的均為預處理命令)?!癲efine”為宏定義命令?!皹俗R符”為符號常量,即宏名?!白址笨梢允浅?、表達式、格式串等。</p><p><br/></p><p>宏定義用宏名來(lái)表示一個(gè)字符串,在宏展開(kāi)時(shí)又以該字符串取代宏名。這只是一種簡(jiǎn)單的文本替換,預處理程序對它不作任何檢查。如有錯誤,只能在編譯已被宏展開(kāi)后的源程序時(shí)發(fā)現。</p><p><br/></p><p>注意理解宏替換中“換”的概念,即在對相關(guān)命令或語(yǔ)句的含義和功能作具體分析之前就要進(jìn)行文本替換。</p><p><br/></p><p>【例1】定義常量:</p><p><br/></p><p>#define MAX_TIME 1000</p><p><br/></p><p>若在程序里面寫(xiě)if(time &lt; MAX_TIME){.........},則編譯器在處理該代碼前會(huì )將MAX_TIME替換為1000。</p><p><br/></p><p>注意,這種情況下使用const定義常量可能更好,如const int MAX_TIME = 1000;。因為const常量有數據類(lèi)型,而宏常量沒(méi)有數據類(lèi)型。編譯器可以對前者進(jìn)行類(lèi)型安全檢查,而對后者只進(jìn)行簡(jiǎn)單的字符文本替換,沒(méi)有類(lèi)型安全檢查,并且在字符替換時(shí)可能會(huì )產(chǎn)生意料不到的錯誤。</p><p><br/></p><p>【例2】反例:</p><p><br/></p><p>#define pint (int*)</p><p>pint pa, pb;</p><p>&nbsp; &nbsp; &nbsp;</p><p>本意是定義pa和pb均為int型指針,但實(shí)際上變成int* pa,pb;。pa是int型指針,而pb是int型變量。本例中可用typedef來(lái)代替define,這樣pa和pb就都是int型指針了。</p><p><br/></p><p>因為宏定義只是簡(jiǎn)單的字符串代換,在預處理階段完成,而typedef是在編譯時(shí)處理的,它不是作簡(jiǎn)單的代換,而是對類(lèi)型說(shuō)明符重新命名,被命名的標識符具有類(lèi)型定義說(shuō)明的功能。</p><p><br/></p><p>typedef的具體說(shuō)明見(jiàn)附錄6.4。</p><p><br/></p><p>無(wú)參宏注意事項:</p><p><br/></p><p>宏名一般用大寫(xiě)字母表示,以便于與變量區別。宏定義末尾不必加分號,否則連分號一并替換。宏定義可以嵌套。</p><p><br/></p><p>可用#undef命令終止宏定義的作用域。</p><p><br/></p><p>使用宏可提高程序通用性和易讀性,減少不一致性,減少輸入錯誤和便于修改。如數組大小常用宏定義。預處理是在編譯之前的處理,而編譯工作的任務(wù)之一就是語(yǔ)法檢查,預處理不做語(yǔ)法檢查。宏定義寫(xiě)在函數的花括號外邊,作用域為其后的程序,通常在文件的最開(kāi)頭。字符串&quot; &quot;中永遠不包含宏,否則該宏名當字符串處理。</p><p>宏定義不分配內存,變量定義分配內存。</p><p><br/></p><p>2.2 帶參宏定義</p><p><br/></p><p>C語(yǔ)言允許宏帶有參數。在宏定義中的參數稱(chēng)為形式參數,在宏調用中的參數稱(chēng)為實(shí)際參數。</p><p><br/></p><p>對帶參數的宏,在調用中,不僅要宏展開(kāi),而且要用實(shí)參去代換形參。</p><p><br/></p><p>帶參宏定義的一般形式為:</p><p>#define&nbsp; 宏名(形參表)&nbsp; 字符串</p><p><br/></p><p>在字符串中含有各個(gè)形參。</p><p><br/></p><p>帶參宏調用的一般形式為:</p><p>宏名(實(shí)參表);</p><p><br/></p><p>在宏定義中的形參是標識符,而宏調用中的實(shí)參可以是表達式。</p><p><br/></p><p>在帶參宏定義中,形參不分配內存單元,因此不必作類(lèi)型定義。而宏調用中的實(shí)參有具體的值,要用它們去代換形參,因此必須作類(lèi)型說(shuō)明,這點(diǎn)與函數不同。函數中形參和實(shí)參是兩個(gè)不同的量,各有自己的作用域,調用時(shí)要把實(shí)參值賦予形參,進(jìn)行“值傳遞”。而在帶參宏中只是符號代換,不存在值傳遞問(wèn)題。</p><p><br/></p><p>【例3】</p><p><br/></p><p>&nbsp;#define INC(x) x+1&nbsp; //宏定義</p><p>&nbsp;y = INC(5);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//宏調用</p><p><br/></p><p>在宏調用時(shí),用實(shí)參5去代替形參x,經(jīng)預處理宏展開(kāi)后的語(yǔ)句為y=5+1。</p><p><br/></p><p>【例4】反例:</p><p><br/></p><p>#define SQ(r)&nbsp; &nbsp; r*r</p><p>&nbsp; &nbsp; &nbsp;</p><p>上述這種實(shí)參為表達式的宏定義,在一般使用時(shí)沒(méi)有問(wèn)題;但遇到如area=SQ(a+b);時(shí)就會(huì )出現問(wèn)題,宏展開(kāi)后變?yōu)閍rea=a+b*a+b;,顯然違背本意。</p><p><br/></p><p>相比之下,函數調用時(shí)會(huì )先把實(shí)參表達式的值(a+b)求出來(lái)再賦予形參r;而宏替換對實(shí)參表達式不作計算直接地照原樣代換。因此在宏定義中,字符串內的形參通常要用括號括起來(lái)以避免出錯。</p><p><br/></p><p>進(jìn)一步地,考慮到運算符優(yōu)先級和結合性,遇到area=10/SQ(a+b);時(shí)即使形參加括號仍會(huì )出錯。因此,還應在宏定義中的整個(gè)字符串外加括號,</p><p><br/></p><p>綜上,正確的宏定義是#define SQ(r) ((r)*(r)),即宏定義時(shí)建議所有的層次都要加括號。</p><p><br/></p><p>【例5】帶參函數和帶參宏的區別:</p><p><br/></p><p>&nbsp;#define SQUARE(x) ((x)*(x))</p><p><br/></p><p>&nbsp;int Square(int x){</p><p><br/></p><p>&nbsp; &nbsp;return (x * x); //未考慮溢出保護</p><p><br/></p><p>}</p><p><br/></p><p>int main(void){</p><p><br/></p><p>&nbsp; &nbsp; int i = 1;</p><p><br/></p><p>&nbsp; &nbsp;while(i &lt;= 5)</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; &nbsp;printf(&quot;i = %d, Square = %d\n&quot;, i, Square(i++));</p><p><br/></p><p>&nbsp; &nbsp;int j = 1;</p><p><br/></p><p>&nbsp; &nbsp;while(j &lt;= 5)</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; printf(&quot;j = %d, SQUARE = %d\n&quot;, j, SQUARE(j++));</p><p>&nbsp; return 0;</p><p><br/></p><p>&nbsp;}</p><p><br/></p><p>執行后輸出如下:</p><p><br/></p><p>i = 2, Square = 1</p><p><br/></p><p>i = 3, Square = 4</p><p><br/></p><p>i = 4, Square = 9</p><p><br/></p><p>i = 5, Square = 16</p><p><br/></p><p>i = 6, Square = 25</p><p><br/></p><p>j = 3, SQUARE = 1</p><p><br/></p><p>j = 5, SQUARE = 9</p><p><br/></p><p>j = 7, SQUARE = 25</p><p><br/></p><p>本例意在說(shuō)明,把同一表達式用函數處理與用宏處理兩者的結果有可能是不同的。</p><p><br/></p><p>調用Square函數時(shí),把實(shí)參i值傳給形參x后自增1,再輸出函數值。因此循環(huán)5次,輸出1~5的平方值。調用SQUARE宏時(shí),SQUARE(j++)被代換為((j++)*(j++))。在第一次循環(huán)時(shí),表達式中j初值為1,兩者相乘的結果為1。相乘后j自增兩次變?yōu)?,因此表達式中第二次相乘時(shí)結果為3*3=9。同理,第三次相乘時(shí)結果為5*5=25,并在此次循環(huán)后j值變?yōu)?,不再滿(mǎn)足循環(huán)條件,停止循環(huán)。</p><p><br/></p><p>從以上分析可以看出函數調用和宏調用二者在形式上相似,在本質(zhì)上是完全不同的。</p><p><br/></p><p>帶參宏注意事項:</p><p><br/></p><p>宏名和形參表的括號間不能有空格。</p><p>宏替換只作替換,不做計算,不做表達式求解。</p><p>函數調用在編譯后程序運行時(shí)進(jìn)行,并且分配內存。宏替換在編譯前進(jìn)行,不分配內存。</p><p>函數只有一個(gè)返回值,利用宏則可以設法得到多個(gè)值。</p><p>宏展開(kāi)使源程序變長(cháng),函數調用不會(huì )。</p><p>宏展開(kāi)不占用運行時(shí)間,只占編譯時(shí)間,函數調用占運行時(shí)間(分配內存、保留現場(chǎng)、值傳遞、返回值)。</p><p>為防止無(wú)限制遞歸展開(kāi),當宏調用自身時(shí),不再繼續展開(kāi)。</p><p>如:#define TEST(x)&nbsp; (x + TEST(x))被展開(kāi)為1 + TEST(1)。</p><p><br/></p><p>2.3 實(shí)踐用例</p><p><br/></p><p>包括基本用法(及技巧)和特殊用法(#和##等)。</p><p><br/></p><p>#define可以定義多條語(yǔ)句,以替代多行的代碼,但應注意替換后的形式,避免出錯。宏定義在換行時(shí)要加上一個(gè)反斜杠”\”,而且反斜杠后面直接回車(chē),不能有空格。</p><p><br/></p><p>2.3.1 基本用法</p><p>1. 定義常量:</p><p><br/></p><p>#define PI&nbsp; &nbsp;3.1415926</p><p>將程序中出現的PI全部換成3.1415926。</p><p><br/></p><p>2. 定義表達式:</p><p>&nbsp;#define M&nbsp; &nbsp;(y*y+3*y)</p><p><br/></p><p>編碼時(shí)所有的表達式(y*y+3*y)都可由M代替,而編譯時(shí)先由預處理程序進(jìn)行宏替換,即用(y*y+3*y)表達式去置換所有的宏名M,然后再進(jìn)行編譯。</p><p><br/></p><p>注意,在宏定義中表達式(y*y+3*y)兩邊的括號不能少,否則可能會(huì )發(fā)生錯誤。如s=3*M+4*M在預處理時(shí)經(jīng)宏展開(kāi)變?yōu)閟=3*(y*y+3*y)+4*(y*y+3*y),如果宏定義時(shí)不加括號就展開(kāi)為s=3*y*y+3*y+4*y*y+3*y,顯然不符合原意。因此在作宏定義時(shí)必須十分注意。應保證在宏替換之后不發(fā)生錯誤。</p><p><br/></p><p>3. 得到指定地址上的一個(gè)字節或字:</p><p><br/></p><p>#define MEM_B(x)&nbsp; &nbsp; &nbsp;(*((char *)(x)))</p><p>&nbsp;#define MEM_W(x)&nbsp; &nbsp; &nbsp;(*((short *)(x)))</p><p><br/></p><p>4. 求最大值和最小值:</p><p><br/></p><p>#define MAX(x, y)&nbsp; &nbsp; &nbsp;(((x) &gt; (y)) ? (x) : (y))</p><p>#define MIN(x, y)&nbsp; &nbsp; &nbsp;(((x) &lt; (y)) ? (x) : (y))</p><p><br/></p><p>以后使用MAX (x,y)或MIN (x,y),就可分別得到x和y中較大或較小的數。</p><p><br/></p><p>但這種方法存在弊病,例如執行MAX(x++, y)時(shí),x++被執行多少次取決于x和y的大??;當宏參數為函數也會(huì )存在類(lèi)似的風(fēng)險。所以建議用內聯(lián)函數而不是這種方法提高速度。不過(guò),雖然存在這樣的弊病,但宏定義非常靈活,因為x和y可以是各種數據類(lèi)型。</p><p><br/></p><p>以下給出MAX宏的兩個(gè)安全版本(源自linux/kernel.h):</p><p><br/></p><p>&nbsp;#define MAX_S(x, y) ({ \</p><p><br/></p><p>&nbsp; &nbsp; const typeof(x) _x = (x);&nbsp; \</p><p><br/></p><p>&nbsp; &nbsp; const typeof(y) _y = (y);&nbsp; \</p><p><br/></p><p>&nbsp; &nbsp; (void)(&amp;_x == &amp;_y);&nbsp; &nbsp; &nbsp; &nbsp;\</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;_x &gt; _y ? _x : _y; })</p><p><br/></p><p><br/></p><p>&nbsp;#define TMAX_S(type, x, y) ({ \</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;type _x = (x);&nbsp; \</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;type _y = (y);&nbsp; \</p><p><br/></p><p>&nbsp; &nbsp; _x &gt; _y ? _x: _y; })</p><p><br/></p><p>Gcc編譯器將包含在圓括號和大括號雙層括號內的復合語(yǔ)句看作是一個(gè)表達式,它可出現在任何允許表達式的地方;復合語(yǔ)句中可聲明局部變量,判斷循環(huán)條件等復雜處理。而表達式的最后一條語(yǔ)句必須是一個(gè)表達式,它的計算結果作為返回值。MAX_S和TMAX_S宏內就定義局部變量以消除參數副作用。</p><p><br/></p><p>MAX_S宏內(void)(&amp;_x == &amp;_y)語(yǔ)句用于檢查參數類(lèi)型一致性。當參數x和y類(lèi)型不同時(shí),會(huì )產(chǎn)生” comparison of distinct pointer types lacks a cast”的編譯警告。</p><p><br/></p><p>注意,MAX_S和TMAX_S宏雖可避免參數副作用,但會(huì )增加內存開(kāi)銷(xiāo)并降低執行效率。若使用者能保證宏參數不存在副作用,則可選用普通定義(即MAX宏)。&nbsp;</p><p><br/></p><p>5. 得到一個(gè)成員在結構體中的偏移量(lint 545告警表示&quot;&amp;用法值得懷疑&quot;,此處抑制該警告):</p><p><br/></p><p>&nbsp;#define FPOS(type, field) \</p><p>&nbsp;/*lint -e545 */ ((int)&amp;((type *)0)-&gt; field) /*lint +e545 */</p><p><br/></p><p>6. 得到一個(gè)結構體中某成員所占用的字節數:</p><p><br/></p><p>#define FSIZ(type, field)&nbsp; &nbsp; sizeof(((type *)0)-&gt;field)</p><p><br/></p><p>7. 按照LSB格式把兩個(gè)字節轉化為一個(gè)字(word):</p><p><br/></p><p>#define FLIPW(arr)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ((((short)(arr)[0]) * 256) + (arr)[1])</p><p><br/></p><p>8. 按照LSB格式把一個(gè)字(word)轉化為兩個(gè)字節:</p><p><br/></p><p>#define FLOPW(arr, val) \</p><p>&nbsp; &nbsp; (arr)[0] = ((val) / 256); \</p><p>&nbsp; &nbsp; (arr)[1] = ((val) &amp; 0xFF)</p><p><br/></p><p>9. 得到一個(gè)變量的地址:</p><p><br/></p><p>#define B_PTR(var)&nbsp; &nbsp; &nbsp; &nbsp;((char *)(void *)&amp;(var))</p><p>#define W_PTR(var)&nbsp; &nbsp; &nbsp; &nbsp;((short *)(void *)&amp;(var))</p><p><br/></p><p>10. 得到一個(gè)字(word)的高位和低位字節:</p><p><br/></p><p>#define WORD_LO(x)&nbsp; &nbsp; &nbsp; &nbsp;((char)((short)(x)&amp;0xFF))</p><p>#define WORD_HI(x)&nbsp; &nbsp; &nbsp; &nbsp;((char)((short)(x)&gt;&gt;0x8))</p><p><br/></p><p>11. 返回一個(gè)比X大的最接近的8的倍數:</p><p><br/></p><p>#define RND8(x)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;((((x) + 7) / 8) * 8)</p><p><br/></p><p>12. 將一個(gè)字母轉換為大寫(xiě)或小寫(xiě):</p><p><br/></p><p>#define UPCASE(c)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(((c) &gt;= &#39;a&#39; &amp;&amp; (c) &lt;= &#39;z&#39;) ? ((c) + &#39;A&#39; - &#39;a&#39;) : (c))</p><p>#define LOCASE(c)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(((c) &gt;= &#39;A&#39; &amp;&amp; (c) &lt;= &#39;Z&#39;) ? ((c) + &#39;a&#39; - &#39;A&#39;) : (c))</p><p><br/></p><p>注意,UPCASE和LOCASE宏僅適用于A(yíng)SCII編碼(依賴(lài)于碼字順序和連續性),而不適用于EBCDIC編碼。</p><p><br/></p><p>13. 判斷字符是不是10進(jìn)值的數字:</p><p><br/></p><p>&nbsp;#define ISDEC(c)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ((c) &gt;= &#39;0&#39; &amp;&amp; (c) &lt;= &#39;9&#39;)</p><p><br/></p><p>14. 判斷字符是不是16進(jìn)值的數字:</p><p><br/></p><p>&nbsp; #define ISHEX(c)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (((c) &gt;= &#39;0&#39; &amp;&amp; (c) &lt;= &#39;9&#39;) ||\</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;((c) &gt;= &#39;A&#39; &amp;&amp; (c) &lt;= &#39;F&#39;) ||\</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;((c) &gt;= &#39;a&#39; &amp;&amp; (c) &lt;= &#39;f&#39;))</p><p><br/></p><p><br/></p><p>15. 防止溢出的一個(gè)方法:</p><p><br/></p><p>&nbsp;#define INC_SAT(val)&nbsp; &nbsp; &nbsp; (val = ((val)+1 &gt; (val)) ? (val)+1 : (val))</p><p>16. 返回數組元素的個(gè)數:</p><p><br/></p><p>#define ARR_SIZE(arr)&nbsp; &nbsp; &nbsp;(sizeof((arr)) / sizeof((arr[0])))</p><p><br/></p><p>17. 對于IO空間映射在存儲空間的結構,輸入輸出處理:</p><p><br/></p><p>&nbsp;#define INP(port)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(*((volatile char *)(port)))</p><p><br/></p><p>&nbsp;#define INPW(port)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (*((volatile short *)(port)))</p><p><br/></p><p>&nbsp;#define INPDW(port)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(*((volatile int *)(port)))</p><p><br/></p><p>&nbsp;#define OUTP(port, val)&nbsp; &nbsp; &nbsp;(*((volatile char *)(port)) = ((char)(val)))</p><p><br/></p><p>&nbsp;#define OUTPW(port, val)&nbsp; &nbsp; (*((volatile short *)(port)) = ((short)(val)))</p><p><br/></p><p>&nbsp;#define OUTPDW(port, val)&nbsp; &nbsp;(*((volatile int *)(port)) = ((int)(val)))</p><p><br/></p><p>18. 使用一些宏跟蹤調試:</p><p><br/></p><p>ANSI標準說(shuō)明了五個(gè)預定義的宏名(注意雙下劃線(xiàn)),即:__LINE__、__FILE __、__DATE__、__TIME__、__STDC __。</p><p><br/></p><p>若編譯器未遵循ANSI標準,則可能僅支持以上宏名中的幾個(gè),或根本不支持。此外,編譯程序可能還提供其它預定義的宏名(如__FUCTION__)。</p><p><br/></p><p>__DATE__宏指令含有形式為月/日/年的串,表示源文件被翻譯到代碼時(shí)的日期;源代碼翻譯到目標代碼的時(shí)間作為串包含在__TIME__中。串形式為時(shí):分:秒。</p><p><br/></p><p>如果實(shí)現是標準的,則宏__STDC__含有十進(jìn)制常量1。如果它含有任何其它數,則實(shí)現是非標準的。</p><p><br/></p><p>可以借助上面的宏來(lái)定義調試宏,輸出數據信息和所在文件所在行。如下所示:</p><p><br/></p><p>&nbsp;#define MSG(msg, date)&nbsp; &nbsp; &nbsp; printf(msg);printf(“[%d][%d][%s]”,date,__LINE__,__FILE__)</p><p>&nbsp; &nbsp; &nbsp;</p><p>19. 用do{…}while(0)語(yǔ)句包含多語(yǔ)句防止錯誤:</p><p><br/></p><p>#define DO(a, b) do{\</p><p>&nbsp; &nbsp; a+b;\</p><p>&nbsp; &nbsp; a++;\</p><p>&nbsp;}while(0)</p><p><br/></p><p>20. 實(shí)現類(lèi)似“重載”功能</p><p><br/></p><p>C語(yǔ)言中沒(méi)有swap函數,而且不支持重載,也沒(méi)有模板概念,所以對于每種數據類(lèi)型都要寫(xiě)出相應的swap函數,如:</p><p><br/></p><p>IntSwap(int *,&nbsp; int *);&nbsp;&nbsp;</p><p><br/></p><p>LongSwap(long *,&nbsp; long *);&nbsp;&nbsp;</p><p><br/></p><p>StringSwap(char *,&nbsp; char *);&nbsp;</p><p><br/></p><p>可采用宏定義TSWAP (t,x,y)或SWAP(x, y)交換兩個(gè)整型或浮點(diǎn)參數:</p><p><br/></p><p>&nbsp;</p><p>#define TSWAP(type, x, y) do{ \</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; type _y = y; \</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; y = x;&nbsp; &nbsp; &nbsp; &nbsp;\</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; x = _y;&nbsp; &nbsp; &nbsp; \</p><p><br/></p><p>&nbsp; }while(0)</p><p><br/></p><p>&nbsp; #define SWAP(x, y) do{ \</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; x = x + y;&nbsp; &nbsp;\</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; y = x - y;&nbsp; &nbsp;\</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; x = x - y;&nbsp; &nbsp;\</p><p><br/></p><p>&nbsp;}while(0)</p><p><br/></p><p><br/></p><p>&nbsp;int main(void){</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;int a = 10, b = 5;</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;TSWAP(int, a, b);</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;printf(“a=%d, b=%d\n”, a, b);</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;return 0;</p><p><br/></p><p>}</p><p><br/></p><p>21. 1年中有多少秒(忽略閏年問(wèn)題) :</p><p><br/></p><p>&nbsp;#define SECONDS_PER_YEAR&nbsp; &nbsp; (60UL * 60 * 24 * 365)</p><p><br/></p><p>該表達式將使一個(gè)16位機的整型數溢出,因此用長(cháng)整型符號L告訴編譯器該常數為長(cháng)整型數。</p><p><br/></p><p>注意,不可定義為#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL,否則將產(chǎn)生(31536000)UL而非31536000UL,這會(huì )導致編譯報錯。</p><p><br/></p><p>以下幾種寫(xiě)法也正確:</p><p><br/></p><p>&nbsp;#define SECONDS_PER_YEAR&nbsp; &nbsp; 60 * 60 * 24 * 365UL</p><p><br/></p><p>&nbsp;#define SECONDS_PER_YEAR&nbsp; &nbsp; (60UL * 60UL * 24UL * 365UL)</p><p><br/></p><p>&nbsp;#define SECONDS_PER_YEAR&nbsp; &nbsp; ((unsigned long)(60 * 60 * 24 * 365))</p><p>}</p><p><br/></p><p>22. 取消宏定義:</p><p><br/></p><p>#define [MacroName] [MacroValue]&nbsp; &nbsp; &nbsp; &nbsp;//定義宏</p><p><br/></p><p>#undef [MacroName]&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//取消宏</p><p><br/></p><p><br/></p><p>宏定義必須寫(xiě)在函數外,其作用域為宏定義起到源程序結束。如要終止其作用域可使用#undef命令:</p><p><br/></p><p>&nbsp;#define PI&nbsp; &nbsp;3.14159</p><p><br/></p><p>&nbsp;int main(void){</p><p>&nbsp; &nbsp; &nbsp;//……</p><p>&nbsp;}</p><p><br/></p><p>&nbsp;#undef PI</p><p>&nbsp;int func(void){</p><p>&nbsp; &nbsp; &nbsp;//……</p><p>&nbsp;}</p><p><br/></p><p>表示PI只在main函數中有效,在func1中無(wú)效。</p><p><br/></p><p>2.3.2 特殊用法</p><p><br/></p><p>主要涉及C語(yǔ)言宏里#和##的用法,以及可變參數宏。</p><p><br/></p><p>2.3.2.1 字符串化操作符#</p><p><br/></p><p>在C語(yǔ)言的宏中,#的功能是將其后面的宏參數進(jìn)行字符串化操作(Stringfication),簡(jiǎn)單說(shuō)就是將宏定義中的傳入參數名轉換成用一對雙引號括起來(lái)參數名字符串。#只能用于有傳入參數的宏定義中,且必須置于宏定義體中的參數名前。例如:</p><p><br/></p><p>&nbsp;#define EXAMPLE(instr)&nbsp; &nbsp; &nbsp; printf(&quot;The input string is:\t%s\n&quot;, #instr)</p><p>&nbsp;#define EXAMPLE1(instr)&nbsp; &nbsp; &nbsp;#instr</p><p><br/></p><p>當使用該宏定義時(shí),example(abc)在編譯時(shí)將會(huì )展開(kāi)成printf(&quot;the input string is:\t%s\n&quot;,&quot;abc&quot;);string str=example1(abc)將會(huì )展成string str=&quot;abc&quot;。</p><p><br/></p><p>&nbsp;又如下面代碼中的宏:</p><p><br/></p><p>&nbsp; define WARN_IF(exp) do{ \</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;if(exp) \</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;fprintf(stderr, &quot;Warning: &quot; #exp&quot;\n&quot;); \</p><p><br/></p><p>&nbsp;} while(0)</p><p><br/></p><p>則代碼WARN_IF (divider == 0)會(huì )被替換為:</p><p><br/></p><p>do{</p><p>&nbsp; &nbsp; &nbsp;if(divider == 0)</p><p>&nbsp; &nbsp; &nbsp;</p><p>&nbsp; &nbsp; &nbsp; &nbsp;fprintf(stderr, &quot;Warning&quot; &quot;divider == 0&quot; &quot;\n&quot;);</p><p>&nbsp;} while(0)</p><p><br/></p><p>這樣,每次divider(除數)為0時(shí)便會(huì )在標準錯誤流上輸出一個(gè)提示信息。</p><p><br/></p><p>注意#宏對空格的處理:</p><p><br/></p><p>忽略傳入參數名前面和后面的空格。如str= example1(&nbsp; &nbsp;abc )會(huì )被擴展成 str=&quot;abc&quot;。</p><p>當傳入參數名間存在空格時(shí),編譯器會(huì )自動(dòng)連接各個(gè)子字符串,每個(gè)子字符串間只以一個(gè)空格連接。如str= example1( abc&nbsp; &nbsp; def)會(huì )被擴展成 str=&quot;abc def&quot;。</p><p><br/></p><p>2.3.2.2 符號連接操作符##</p><p><br/></p><p>&nbsp;##稱(chēng)為連接符(concatenator或token-pasting),用來(lái)將兩個(gè)Token連接為一個(gè)Token。注意這里連接的對象是Token就行,而不一定是宏的變量。例如:</p><p>&nbsp;#define PASTER(n)&nbsp; &nbsp; &nbsp;printf( &quot;token&quot; #n &quot; = %d&quot;, token##n)</p><p><br/></p><p>&nbsp;int token9 = 9;</p><p><br/></p><p>則運行PASTER(9)后輸出結果為token9 = 9。</p><p><br/></p><p>又如要做一個(gè)菜單項命令名和函數指針組成的結構體數組,并希望在函數名和菜單項命令名之間有直觀(guān)的、名字上的關(guān)系。那么下面的代碼就非常實(shí)用:</p><p><br/></p><p>struct command{</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;char * name;</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;void (*function)(void);</p><p><br/></p><p>&nbsp;};</p><p><br/></p><p>#define COMMAND(NAME)&nbsp; &nbsp;{NAME, NAME##_command}</p><p><br/></p><p>然后,就可用一些預先定義好的命令來(lái)方便地初始化一個(gè)command結構的數組:</p><p><br/></p><p>&nbsp;struct command commands[] = {</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;COMMAND(quit),</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;COMMAND(help),</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;//...</p><p><br/></p><p>&nbsp;}</p><p><br/></p><p>COMMAND宏在此充當一個(gè)代碼生成器的作用,這樣可在一定程度上減少代碼密度,間接地也可減少不留心所造成的錯誤。</p><p><br/></p><p>還可以用n個(gè)##符號連接n+1個(gè)Token,這個(gè)特性是#符號所不具備的。如:</p><p><br/></p><p>&nbsp;#define&nbsp; LINK_MULTIPLE(a, b, c, d)&nbsp; &nbsp; &nbsp; a##_##b##_##c##_##d</p><p><br/></p><p>&nbsp;typedef struct record_type LINK_MULTIPLE(name, company, position, salary);</p><p><br/></p><p>這里這個(gè)語(yǔ)句將展開(kāi)為typedef struct record_type name_company_position_salary。</p><p><br/></p><p>注意:</p><p><br/></p><p>當用##連接形參時(shí),##前后的空格可有可無(wú)。</p><p>連接后的實(shí)際參數名,必須為實(shí)際存在的參數名或是編譯器已知的宏定義。</p><p>凡是宏定義里有用&#39;#&#39;或&#39;##&#39;的地方,宏參數是不會(huì )再展開(kāi)。如:</p><p><br/></p><p>&nbsp;#define STR(s)&nbsp; &nbsp; &nbsp; &nbsp;#s</p><p><br/></p><p>&nbsp;#define CONS(a,b)&nbsp; &nbsp; int(a##e##b)</p><p><br/></p><p>則printf(&quot;int max: %s\n&quot;, STR(INT_MAX))會(huì )被展開(kāi)為printf(&quot;int max: %s\n&quot;, &quot;INT_MAX&quot;)。其中,變量INT_MAX為int型的最大值,其值定義在&lt;climits.h&gt;中。printf(&quot;%s\n&quot;, CONS(A, A))會(huì )被展開(kāi)為printf(&quot;%s\n&quot;, int(AeA)),從而編譯報錯。</p><p><br/></p><p>INT_MAX和A都不會(huì )再被展開(kāi),多加一層中間轉換宏即可解決這個(gè)問(wèn)題。加這層宏是為了把所有宏的參數在這層里全部展開(kāi),那么在轉換宏里的那一個(gè)宏(如_STR)就能得到正確的宏參數。</p><p><br/></p><p>#define _STR(s)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;#s&nbsp;</p><p><br/></p><p>#define STR(s)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _STR(s)&nbsp; &nbsp; &nbsp; &nbsp;// 轉換宏</p><p><br/></p><p>#define _CONS(a,b)&nbsp; &nbsp; &nbsp; int(a##e##b)</p><p><br/></p><p>#define CONS(a,b)&nbsp; &nbsp; &nbsp; &nbsp;_CONS(a,b)&nbsp; &nbsp; // 轉換宏</p><p><br/></p><p>則printf(&quot;int max: %s\n&quot;, STR(INT_MAX))輸出為int max: 0x7fffffff;而printf(&quot;%d\n&quot;, CONS(A, A))輸出為200。</p><p><br/></p><p>這種分層展開(kāi)的技術(shù)稱(chēng)為宏的Argument Prescan,參見(jiàn)附錄6.1。</p><p><br/></p><p><br/></p><p><br/></p><p>2.3.2.3 字符化操作符@#</p><p><br/></p><p>@#稱(chēng)為字符化操作符(charizing),只能用于有傳入參數的宏定義中,且必須置于宏定義體的參數名前。作用是將傳入的單字符參數名轉換成字符,以一對單引號括起來(lái)。</p><p><br/></p><p>&nbsp;#define makechar(x)&nbsp; &nbsp; #@x</p><p>&nbsp;a = makechar(b);</p><p><br/></p><p>展開(kāi)后變成a= &#39;b&#39;。&nbsp;</p><p><br/></p><p>2.3.2.4 可變參數宏</p><p><br/></p><p>在C語(yǔ)言宏中稱(chēng)為Variadic Macro,即變參宏。C99編譯器標準允許定義可變參數宏(Macros with a Variable Number of Arguments),這樣就可以使用擁有可變參數表的宏。</p><p><br/></p><p>可變參數宏的一般形式為:</p><p><br/></p><p>#define&nbsp; DBGMSG(format, ...)&nbsp; fprintf (stderr, format, __VA_ARGS__)</p><p><br/></p><p>省略號代表一個(gè)可以變化的參數表,變參必須作為參數表的最右一項出現。使用保留名__VA_ARGS__ 把參數傳遞給宏。在調用宏時(shí),省略號被表示成零個(gè)或多個(gè)符號(包括里面的逗號),一直到到右括號結束為止。當被調用時(shí),在宏體(macro body)中,那些符號序列集合將代替里面的__VA_ARGS__標識符。當宏的調用展開(kāi)時(shí),實(shí)際的參數就傳遞給fprintf ()。</p><p><br/></p><p>注意:可變參數宏不被ANSI/ISO C++所正式支持。因此,應當檢查編譯器是否支持這項技術(shù)。&nbsp;</p><p><br/></p><p>在標準C里,不能省略可變參數,但卻可以給它傳遞一個(gè)空的參數,這會(huì )導致編譯出錯。因為宏展開(kāi)后,里面的字符串后面會(huì )有個(gè)多余的逗號。為解決這個(gè)問(wèn)題,GNU CPP中做了如下擴展定義:</p><p><br/></p><p>#define&nbsp; DBGMSG(format, ...)&nbsp; fprintf (stderr, format, ##__VA_ARGS__)</p><p><br/></p><p>若可變參數被忽略或為空,##操作將使編譯器刪除它前面多余的逗號(否則會(huì )編譯出錯)。若宏調用時(shí)提供了可變參數,編譯器會(huì )把這些可變參數放到逗號的后面。</p><p><br/></p><p>同時(shí),GCC還支持顯式地命名變參為args,如同其它參數一樣。如下格式的宏擴展:</p><p><br/></p><p>#define&nbsp; DBGMSG(format, args...)&nbsp; fprintf (stderr, format, ##args)</p><p><br/></p><p>這樣寫(xiě)可讀性更強,并且更容易進(jìn)行描述。</p><p><br/></p><p>用GCC和C99的可變參數宏, 可以更方便地打印調試信息,如:</p><p><br/></p><p>&nbsp;#ifdef DEBUG</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;#define DBGPRINT(format, args...) \</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;fprintf(stderr, format, ##args)</p><p><br/></p><p>&nbsp;#else</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;#define DBGPRINT(format, args...)</p><p><br/></p><p>&nbsp;#endif</p><p><br/></p><p>這樣定義之后,代碼中就可以用dbgprint了,例如dbgprint (&quot;aaa [%s]&quot;, __FILE__)。</p><p><br/></p><p>結合第4節的“條件編譯”功能,可以構造出如下調試打印宏:</p><p>&nbsp;</p><p>&nbsp;#ifdef LOG_TEST_DEBUG</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; /* OMCI調試日志宏 */</p><p><br/></p><p>&nbsp; &nbsp; //以10進(jìn)制格式日志整型變量</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; #define PRINT_DEC(x)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf(#x&quot; = %d\n&quot;, x)</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; #define PRINT_DEC2(x,y)&nbsp; &nbsp; &nbsp; &nbsp;printf(#x&quot; = %d\n&quot;, y)</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;//以16進(jìn)制格式日志整型變量</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; #define PRINT_HEX(x)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf(#x&quot; = 0x%-X\n&quot;, x)</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; #define PRINT_HEX2(x,y)&nbsp; &nbsp; &nbsp; &nbsp;printf(#x&quot; = 0x%-X\n&quot;, y)</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; //以字符串格式日志字符串變量</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;#define PRINT_STR(x)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf(#x&quot; = %s\n&quot;, x)</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;#define PRINT_STR2(x,y)&nbsp; &nbsp; &nbsp; &nbsp;printf(#x&quot; = %s\n&quot;, y)</p><p><br/></p><p><br/></p><p>&nbsp; &nbsp; &nbsp;//日志提示信息</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;#define PROMPT(info)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf(&quot;%s\n&quot;, info)</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;//調試定位信息打印宏</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;#define&nbsp; TP&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;printf(&quot;%-4u - [%s&lt;%s&gt;]\n&quot;, __LINE__, __FILE__, __FUNCTION__);</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;//調試跟蹤宏,在待日志信息前附加日志文件名、行數、函數名等信息</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;#define TRACE(fmt, args...)\</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;do{\</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; &nbsp; printf(&quot;[%s(%d)&lt;%s&gt;]&quot;, __FILE__, __LINE__, __FUNCTION__);\</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; &nbsp; printf((fmt), ##args);\</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;}while(0)</p><p><br/></p><p>&nbsp;#else</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;#define PRINT_DEC(x)</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;#define PRINT_DEC2(x,y)</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;#define PRINT_HEX(x)</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;#define PRINT_HEX2(x,y)</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;#define PRINT_STR(x)</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;#define PRINT_STR2(x,y)</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;#define PROMPT(info)</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;#define&nbsp; TP</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;#define TRACE(fmt, args...)</p><p><br/></p><p>&nbsp;#endif</p><p>&nbsp;</p><p><br/></p><p>三&nbsp; 文件包含</p><p><br/></p><p>文件包含命令行的一般形式為:</p><p><br/></p><p>#include &quot;文件名&quot;</p><p><br/></p><p>通常,該文件是后綴名為&quot;h&quot;或&quot;hpp&quot;的頭文件。文件包含命令把指定頭文件插入該命令行位置取代該命令行,從而把指定的文件和當前的源程序文件連成一個(gè)源文件。</p><p><br/></p><p>在程序設計中,文件包含是很有用的。一個(gè)大程序可以分為多個(gè)模塊,由多個(gè)程序員分別編程。有些公用的符號常量或宏定義等可單獨組成一個(gè)文件,在其它文件的開(kāi)頭用包含命令包含該文件即可使用。這樣,可避免在每個(gè)文件開(kāi)頭都去書(shū)寫(xiě)那些公用量,從而節省時(shí)間,并減少出錯。</p><p><br/></p><p>對文件包含命令要說(shuō)明以下幾點(diǎn):</p><p><br/></p><p>包含命令中的文件名可用雙引號括起來(lái),也可用尖括號括起來(lái),如#include &quot;common.h&quot;和#include&lt;math.h&gt;。但這兩種形式是有區別的:使用尖括號表示在包含文件目錄中去查找(包含目錄是由用戶(hù)在設置環(huán)境時(shí)設置的include目錄),而不在當前源文件目錄去查找;</p><p><br/></p><p>使用雙引號則表示首先在當前源文件目錄中查找,若未找到才到包含目錄中去查找。用戶(hù)編程時(shí)可根據自己文件所在的目錄來(lái)選擇某一種命令形式。</p><p><br/></p><p>一個(gè)include命令只能指定一個(gè)被包含文件,若有多個(gè)文件要包含,則需用多個(gè)include命令。文件包含允許嵌套,即在一個(gè)被包含的文件中又可以包含另一個(gè)文件。</p><p>&nbsp;</p><p><br/></p><p>四&nbsp; 條件編譯</p><p><br/></p><p>一般情況下,源程序中所有的行都參加編譯。但有時(shí)希望對其中一部分內容只在滿(mǎn)足一定條件才進(jìn)行編譯,也就是對一部分內容指定編譯的條件,這就是“條件編譯”。有時(shí),希望當滿(mǎn)足某條件時(shí)對一組語(yǔ)句進(jìn)行編譯,而當條件不滿(mǎn)足時(shí)則編譯另一組語(yǔ)句。</p><p><br/></p><p>條件編譯功能可按不同的條件去編譯不同的程序部分,從而產(chǎn)生不同的目標代碼文件。這對于程序的移植和調試是很有用的。</p><p><br/></p><p>條件編譯有三種形式,下面分別介紹。</p><p><br/></p><p>4.1 #ifdef形式</p><p><br/></p><p>#ifdef&nbsp; 標識符&nbsp; (或#if defined標識符)</p><p><br/></p><p>&nbsp; &nbsp; 程序段1</p><p><br/></p><p>#else</p><p><br/></p><p>&nbsp; &nbsp; 程序段2</p><p><br/></p><p>#endif</p><p><br/></p><p><br/></p><p>如果標識符已被#define命令定義過(guò),則對程序段1進(jìn)行編譯;否則對程序段2進(jìn)行編譯。如果沒(méi)有程序段2(它為空),#else可以沒(méi)有,即可以寫(xiě)為:</p><p><br/></p><p>#ifdef&nbsp; 標識符&nbsp; (或#if defined標識符)</p><p><br/></p><p>&nbsp; &nbsp; 程序段</p><p><br/></p><p>#endif</p><p><br/></p><p>這里的“程序段”可以是語(yǔ)句組,也可以是命令行。這種條件編譯可以提高C源程序的通用性。</p><p><br/></p><p>【例6】</p><p><br/></p><p>#define NUM OK</p><p><br/></p><p>&nbsp;int main(void){</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;struct stu{</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int num;</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; char *name;</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; char sex;</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; float score;</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;}*ps;</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;ps=(struct stu*)malloc(sizeof(struct stu));</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;ps-&gt;num = 102;</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;ps-&gt;name = &quot;Zhang ping&quot;;</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;ps-&gt;sex = &#39;M&#39;;</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;ps-&gt;score = 62.5;</p><p><br/></p><p>&nbsp;#ifdef NUM</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;printf(&quot;Number=%d\nScore=%f\n&quot;, ps-&gt;num, ps-&gt;score); /*--Execute--*/</p><p><br/></p><p>&nbsp;#else</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;printf(&quot;Name=%s\nSex=%c\n&quot;, ps-&gt;name, ps-&gt;sex);</p><p><br/></p><p>&nbsp;#endif</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;free(ps);</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;return 0;</p><p><br/></p><p>&nbsp;}</p><p>&nbsp; &nbsp; &nbsp;</p><p>由于在程序中插入了條件編譯預處理命令,因此要根據NUM是否被定義過(guò)來(lái)決定編譯哪個(gè)printf語(yǔ)句。而程序首行已對NUM作過(guò)宏定義,因此應對第一個(gè)printf語(yǔ)句作編譯,故運行結果是輸出了學(xué)號和成績(jì)。</p><p><br/></p><p>程序首行定義NUM為字符串“OK”,其實(shí)可為任何字符串,甚至不給出任何字符串,即#define NUM也具有同樣的意義。只有取消程序首行宏定義才會(huì )去編譯第二個(gè)printf語(yǔ)句。</p><p><br/></p><p>4.2 #ifndef 形式</p><p><br/></p><p>#ifndef&nbsp; 標識符</p><p><br/></p><p>&nbsp; &nbsp; 程序段1</p><p><br/></p><p>#else</p><p><br/></p><p>&nbsp; &nbsp; 程序段2</p><p><br/></p><p>#endif</p><p><br/></p><p><br/></p><p>如果標識符未被#define命令定義過(guò),則對程序段1進(jìn)行編譯,否則對程序段2進(jìn)行編譯。這與#ifdef形式的功能正相反。</p><p><br/></p><p>“#ifndef&nbsp; 標識符”也可寫(xiě)為“#if&nbsp; !(defined 標識符)”。</p><p><br/></p><p>4.3 #if形式</p><p><br/></p><p>#if 常量表達式</p><p><br/></p><p>&nbsp; &nbsp; 程序段1</p><p><br/></p><p>#else</p><p><br/></p><p>&nbsp; &nbsp; 程序段2</p><p><br/></p><p>#endif</p><p><br/></p><p>如果常量表達式的值為真(非0),則對程序段1 進(jìn)行編譯,否則對程序段2進(jìn)行編譯。因此可使程序在不同條件下,完成不同的功能。</p><p><br/></p><p>【例7】輸入一行字母字符,根據需要設置條件編譯,使之能將字母全改為大寫(xiě)或小寫(xiě)字母輸出。</p><p><br/></p><p>#define CAPITAL_LETTER&nbsp; &nbsp;1</p><p><br/></p><p>&nbsp; int main(void){</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; char szOrig[] = &quot;C Language&quot;, cChar;</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; int dwIdx = 0;</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; while((cChar = szOrig[dwIdx++]) != &#39;\0&#39;)</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; {</p><p><br/></p><p>&nbsp; #if CAPITAL_LETTER</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if((cChar &gt;= &#39;a&#39;) &amp;&amp; (cChar &lt;= &#39;z&#39;)) cChar = cChar - 0x20;</p><p><br/></p><p>&nbsp; #else</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if((cChar &gt;= &#39;A&#39;) &amp;&amp; (cChar &lt;= &#39;Z&#39;)) cChar = cChar + 0x20;</p><p><br/></p><p>&nbsp;#endif</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;printf(&quot;%c&quot;, cChar);</p><p><br/></p><p>&nbsp; &nbsp; }</p><p>&nbsp; &nbsp; &nbsp;return 0;</p><p>&nbsp;}</p><p><br/></p><p>在程序第一行定義宏CAPITAL_LETTER為1,因此在條件編譯時(shí)常量表達式CAPITAL_LETTER的值為真(非零),故運行后使小寫(xiě)字母變成大寫(xiě)(C LANGUAGE)。</p><p><br/></p><p>本例的條件編譯當然也可以用if條件語(yǔ)句來(lái)實(shí)現。但是用條件語(yǔ)句將會(huì )對整個(gè)源程序進(jìn)行編譯,生成的目標代碼程序很長(cháng);而采用條件編譯,則根據條件只編譯其中的程序段1或程序段2,生成的目標程序較短。如果條件編譯的程序段很長(cháng),采用條件編譯的方法是十分必要的。</p><p><br/></p><p>4.4 實(shí)踐用例</p><p><br/></p><p>1. 屏蔽跨平臺差異</p><p><br/></p><p>在大規模開(kāi)發(fā)過(guò)程中,特別是跨平臺和系統的軟件里,可以在編譯時(shí)通過(guò)條件編譯設置編譯環(huán)境。</p><p><br/></p><p>例如,有一個(gè)數據類(lèi)型,在Windows平臺中應使用long類(lèi)型表示,而在其他平臺應使用float表示。這樣往往需要對源程序作必要的修改,這就降低了程序的通用性??梢杂靡韵碌臈l件編譯:</p><p><br/></p><p>&nbsp;#ifdef WINDOWS</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;#define MYTYPE long</p><p><br/></p><p>&nbsp;#else</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;#define MYTYPE float</p><p><br/></p><p>&nbsp;#endif</p><p><br/></p><p>如果在Windows上編譯程序,則可以在程序的開(kāi)始加上#define WINDOWS,這樣就編譯命令行&nbsp; &nbsp; #define MYTYPE long;</p><p><br/></p><p>如果在這組條件編譯命令前曾出現命令行#define WINDOWS 0,則預編譯后程序中的MYTYPE都用float代替。這樣,源程序可以不必作任何修改就可以用于不同類(lèi)型的計算機系統。</p><p><br/></p><p>2. 包含程序功能模塊</p><p><br/></p><p>例如,在程序首部定義#ifdef FLV:</p><p><br/></p><p>&nbsp;#ifdef FLV</p><p><br/></p><p>&nbsp; &nbsp; include&quot;fastleave.c&quot;</p><p><br/></p><p>&nbsp;#endif</p><p><br/></p><p>如果不許向別的用戶(hù)提供該功能,則在編譯之前將首部的FLV加一下劃線(xiàn)即可。</p><p><br/></p><p>3. 開(kāi)關(guān)調試信息</p><p><br/></p><p>調試程序時(shí),常常希望輸出一些所需的信息以便追蹤程序的運行。而在調試完成后不再輸出這些信息??梢栽谠闯绦蛑胁迦胍韵碌臈l件編譯段:</p><p><br/></p><p>&nbsp;#ifdef DEBUG</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;printf(&quot;device_open(%p)\n&quot;, file);</p><p><br/></p><p>&nbsp;#endif</p><p><br/></p><p>&nbsp;如果在它的前面有以下命令行#define DEBUG,則在程序運行時(shí)輸出file指針的值,以便調試分析。調試完成后只需將這個(gè)define命令行刪除即可,這時(shí)所有使用DEBUG作標識符的條件編譯段中的printf語(yǔ)句不起作用,即起到“開(kāi)關(guān)”一樣統一控制的作用。&nbsp;</p><p><br/></p><p>4. 避開(kāi)硬件的限制。</p><p><br/></p><p>有時(shí)一些具體應用環(huán)境的硬件不同,但限于條件本地缺乏這種設備,可繞過(guò)硬件直接寫(xiě)出預期結果:</p><p><br/></p><p>#ifndef TEST</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;i = dial();&nbsp; //程序調試運行時(shí)繞過(guò)此語(yǔ)句</p><p><br/></p><p>&nbsp;#else</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;i = 0;</p><p><br/></p><p>&nbsp;#endif</p><p><br/></p><p>調試通過(guò)后,再屏蔽TEST的定義并重新編譯即可。&nbsp; &nbsp;</p><p><br/></p><p>5. 防止頭文件重復包含</p><p><br/></p><p>頭文件(.h)可以被頭文件或C文件包含。由于頭文件包含可以嵌套,C文件就有可能多次包含同一個(gè)頭文件;或者不同的C文件都包含同一個(gè)頭文件,編譯時(shí)就可能出現重復包含(重復定義)的問(wèn)題。</p><p><br/></p><p>在頭文件中為了避免重復調用(如兩個(gè)頭文件互相包含對方),常采用這樣的結構:</p><p><br/></p><p>&nbsp;#ifndef&nbsp; &lt;標識符&gt;</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;#define&nbsp; &lt;標識符&gt;</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;//真正的內容,如函數聲明之類(lèi)</p><p><br/></p><p>&nbsp;#endif</p><p><br/></p><p>&lt;標識符&gt;可以自由命名,但一般形如__HEADER_H,且每個(gè)頭文件標識都應該是唯一的。</p><p><br/></p><p>事實(shí)上,不管頭文件會(huì )不會(huì )被多個(gè)文件引用,都要加上條件編譯開(kāi)關(guān)來(lái)避免重復包含。&nbsp;</p><p><br/></p><p>6. 在#ifndef中定義變量出現的問(wèn)題(一般不定義在#ifndef中)。</p><p><br/></p><p>&nbsp;</p><p>#ifndef PRECMPL</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;#define PRECMPL</p><p><br/></p><p>&nbsp; &nbsp; int var;</p><p>&nbsp; &nbsp;&nbsp;</p><p>&nbsp;#endif</p><p><br/></p><p>其中有個(gè)變量定義,在VC中鏈接時(shí)會(huì )出現變量var重復定義的錯誤,而在C中成功編譯。</p><p><br/></p><p>(1) 當第一個(gè)使用這個(gè)頭文件的.cpp文件生成.obj時(shí),var在里面定義;當另一個(gè)使用該頭文件的.cpp文件再次(單獨)生成.obj時(shí),var又被定義;然后兩個(gè)obj被第三個(gè)包含該頭文件.cpp連接在一起,會(huì )出現重復定義。</p><p><br/></p><p>(2) 把源程序文件擴展名改成.c后,VC按照C語(yǔ)言語(yǔ)法對源程序進(jìn)行編譯。在C語(yǔ)言中,遇到多個(gè)int var則自動(dòng)認為其中一個(gè)是定義,其他的是聲明。</p><p><br/></p><p>(3) C語(yǔ)言和C++語(yǔ)言連接結果不同,可能是在進(jìn)行編譯時(shí),C++語(yǔ)言將全局變量默認為強符號,所以連接出錯。C語(yǔ)言則依照是否初始化進(jìn)行強弱的判斷的(僅供參考)。</p><p><br/></p><p>解決方法:</p><p><br/></p><p>(1) 把源程序文件擴展名改成.c。</p><p><br/></p><p>&nbsp;(2) .h中只聲明 extern int var;,在.cpp中定義(推薦)</p><p><br/></p><p>//&lt;x.h&gt;</p><p><br/></p><p>&nbsp;#ifndef&nbsp; __X_H</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;#define&nbsp; __X_H</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;extern int var;</p><p><br/></p><p>&nbsp;#endif</p><p><br/></p><p>&nbsp;//&lt;x.c&gt;</p><p><br/></p><p>&nbsp;int var = 0;</p><p><br/></p><p>綜上,變量一般不要定義在.h文件中。</p><p><br/></p><p><br/></p><p>五&nbsp; 小結</p><p><br/></p><p>預處理功能是C語(yǔ)言特有的功能,它是在對源程序正式編譯前由預處理程序完成的。程序員在程序中用預處理命令來(lái)調用這些功能。</p><p><br/></p><p>宏定義是用一個(gè)標識符來(lái)表示一個(gè)字符串,這個(gè)字符串可以是常量、變量或表達式。在宏調用中將用該字符串代換宏名。</p><p><br/></p><p>宏定義可以帶有參數,宏調用時(shí)是以實(shí)參代換形參。而不是“值傳遞”。</p><p>為了避免宏替換時(shí)發(fā)生錯誤,宏定義中的字符串應加括號,字符串中出現的形式參數兩邊也應加括號。</p><p><br/></p><p>文件包含是預處理的一個(gè)重要功能,它可用來(lái)把多個(gè)源文件連接成一個(gè)源文件進(jìn)行編譯,結果將生成一個(gè)目標文件。</p><p><br/></p><p>條件編譯允許只編譯源程序中滿(mǎn)足條件的程序段,使生成的目標程序較短,從而減少了內存的開(kāi)銷(xiāo)并提高了程序的效率。</p><p><br/></p><p>使用預處理功能便于程序的修改、閱讀、移植和調試,也便于實(shí)現模塊化程序設計。</p><p>&nbsp;</p><p><br/></p><p>六 附錄</p><p>6.1 Argument Prescan</p><p>(摘自http://gcc.gnu.org/onlinedocs/cpp/Argument-Prescan.html)</p><p><br/></p><p>Macro arguments are completely macro-expanded before they are substituted into a macro body, unless they are stringified or pasted with other tokens. After substitution, the entire macro body, including the substituted arguments, is scanned again for macros to be expanded. The result is that the arguments are scanned twice to expand macro calls in them.</p><p><br/></p><p>宏參數被完全展開(kāi)后再替換入宏體,但當宏參數被字符串化(#)或與其它子串連接(##)時(shí)不予展開(kāi)。在替換之后,再次掃描整個(gè)宏體(包括已替換宏參數)以進(jìn)一步展開(kāi)宏。結果是宏參數被掃描兩次以展開(kāi)參數所(嵌套)調用的宏。</p><p><br/></p><p>若帶參數宏定義中的參數稱(chēng)為形參,調用宏時(shí)的實(shí)際參數稱(chēng)為實(shí)參,則宏的展開(kāi)可用以下三步來(lái)簡(jiǎn)單描述(該步驟與gcc摘錄稍有不同,但更易操作):</p><p><br/></p><p>1) 用實(shí)參替換形參,將實(shí)參代入宏文本中;</p><p><br/></p><p>2) 若實(shí)參也是宏,則展開(kāi)實(shí)參;</p><p><br/></p><p>3) 繼續處理宏替換后的宏文本,若宏文本也包含宏則繼續展開(kāi),否則完成展開(kāi)。</p><p><br/></p><p>其中第一步將實(shí)參代入宏文本后,若實(shí)參前遇到字符“#”或“##”,即使實(shí)參是宏也不再展開(kāi)實(shí)參,而當作文本處理。</p><p><br/></p><p>上述展開(kāi)步驟示例如下:</p><p><br/></p><p>#define TO_STRING(x)&nbsp; &nbsp; _TO_STRING(x)</p><p><br/></p><p>#define _TO_STRING(x)&nbsp; &nbsp;#x</p><p><br/></p><p>#define FOO&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;4</p><p><br/></p><p>則_TO_STRING(FOO)展開(kāi)為”FOO”;TO_STRING(FOO)展開(kāi)為_(kāi)TO_STRING(4),進(jìn)而展開(kāi)為”4”。相當于借助_TO_STRING這樣的中間宏,先展開(kāi)宏參數,延遲其字符化。</p><p><br/></p><p>6.2 宏的其他注意事項</p><p><br/></p><p>1. 避免在無(wú)作用域限定(未用{}括起)的宏內定義數組、結構、字符串等變量,否則函數中對宏的多次引用會(huì )導致實(shí)際局部變量空間成倍放大。</p><p><br/></p><p>&nbsp;2. 按照宏的功能、模塊進(jìn)行集中定義。即在一處將常量數值定義為宏,其他地方通過(guò)引用該宏,生成自己模塊的宏。嚴禁相同含義的常量數值,在不同地方定義為不同的宏,即使數值相同也不允許(維護修改后極易遺漏,造成代碼隱患)。</p><p><br/></p><p>3. 用只讀變量適當替代(類(lèi)似功能的)宏,例如將#define PIE 3.14改為const float PIE = 3.14。</p><p><br/></p><p>這樣做的好處如下:</p><p><br/></p><p>1) 預編譯時(shí)用宏定義值替換宏名,編譯時(shí)報錯不易理解;</p><p><br/></p><p>2) 跟蹤調試時(shí)顯示宏值,而不是宏名;</p><p><br/></p><p>3) 宏沒(méi)有類(lèi)型,不能做類(lèi)型檢查,不安全;</p><p><br/></p><p>4) 宏自身沒(méi)有作用域;</p><p><br/></p><p>5) 只讀變量和宏的效率同樣高。</p><p><br/></p><p>注意,C語(yǔ)言中只讀變量不可用于數組大小、變量(包括數組元素)初始化值以及case表達式。</p><p><br/></p><p>4. 用inline函數代替(類(lèi)似功能的)宏函數。好處如下:</p><p><br/></p><p>1) 宏函數在預編譯時(shí)處理,編譯出錯信息不易理解;</p><p><br/></p><p>2) 宏函數本身無(wú)法單步跟蹤調試,因此也不要在宏內調用函數。但某些編譯器(為了調試需要)可將inline函數轉成普通函數;</p><p><br/></p><p>3) 宏函數的入參沒(méi)有類(lèi)型,不安全;</p><p><br/></p><p>5) inline函數會(huì )在目標代碼中展開(kāi),和宏的效率一樣高;</p><p><br/></p><p>注意,某些宏函數用法獨特,不能用inline函數取代。當不想或不能指明參數類(lèi)型時(shí),宏函數更合適。</p><p><br/></p><p>5. 不帶參數的宏函數也要定義成函數形式,如#define HELLO( )&nbsp; printf(“Hello.”)。</p><p><br/></p><p>括號會(huì )暗示閱讀代碼者該宏是一個(gè)函數。</p><p><br/></p><p>6. 帶參宏內定義變量時(shí),應注意避免內外部變量重名的問(wèn)題:</p><p><br/></p><p>&nbsp;typedef struct{</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;int d;</p><p><br/></p><p>&nbsp; }T_TEST;</p><p><br/></p><p>&nbsp; T_TEST gtTest = {0};</p><p><br/></p><p>&nbsp;#define ASSIGN1(_d) do{ \</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;T_TEST t = {0}; \</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; t.d = _d; \</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; gtTest = t; \</p><p><br/></p><p>&nbsp; }while(0)</p><p><br/></p><p>&nbsp;#define ASSIGN2(_p) do{ \</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;int _d; \</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;_d = 5; \</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;(_p) = _d; \</p><p><br/></p><p>&nbsp;}while(0)</p><p><br/></p><p>若宏參數名或宏內變量名不加前綴下劃線(xiàn),則ASSIGN1(c)將會(huì )導致編譯報錯(t.d被替換為t.c),ASSIGN2(d)會(huì )因宏內作用域而導致外部的變量d值保持不變(而非改為5)。</p><p><br/></p><p>7. 不要用宏改寫(xiě)語(yǔ)言。例如:</p><p><br/></p><p>#define FOREVER&nbsp; &nbsp;for ( ; ; )</p><p><br/></p><p>&nbsp;#define BEGIN&nbsp; &nbsp; &nbsp;{</p><p><br/></p><p>&nbsp;#define END&nbsp; &nbsp; &nbsp; &nbsp;}</p><p><br/></p><p>C語(yǔ)言有完善且眾所周知的語(yǔ)法。試圖將其改變成類(lèi)似于其他語(yǔ)言的形式,會(huì )使讀者混淆,難于理解。</p><p><br/></p><p>6.3 do{…}while(0)妙用</p><p><br/></p><p>1. 函數中使用do{…}while(0)可替代goto語(yǔ)句。例如:</p><p><br/></p><p>goto寫(xiě)法</p><p><br/></p><p>替代寫(xiě)法</p><p><br/></p><p>bOk = func1();</p><p><br/></p><p>if(!bOk) goto errorhandle;&nbsp;</p><p><br/></p><p>bOk = func2();</p><p><br/></p><p>if(!bOk) goto errorhandle;&nbsp;</p><p><br/></p><p>bOk = func3();</p><p><br/></p><p>if(!bOk) goto errorhandle;</p><p><br/></p><p>&nbsp;</p><p><br/></p><p>//… …</p><p><br/></p><p>//執行成功,釋放資源并返回</p><p><br/></p><p>delete p;&nbsp; &nbsp;</p><p><br/></p><p>p = NULL;</p><p><br/></p><p>return true;</p><p><br/></p><p>&nbsp;</p><p><br/></p><p>errorhandle:</p><p><br/></p><p>delete p;&nbsp; &nbsp;</p><p><br/></p><p>p = NULL;</p><p><br/></p><p>return false;</p><p><br/></p><p>do{</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; //執行并進(jìn)行錯誤處理</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; bOk = func1();</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; if(!bOk) break;&nbsp;</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; bOk = func2();</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; if(!bOk) break;&nbsp;</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; bOk = func3();</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; if(!bOk) break;</p><p><br/></p><p>&nbsp;</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; // ..........</p><p><br/></p><p>&nbsp; &nbsp;}while(0);</p><p><br/></p><p>&nbsp;</p><p><br/></p><p>&nbsp; &nbsp; //釋放資源</p><p><br/></p><p>&nbsp; &nbsp; delete p;&nbsp; &nbsp;</p><p><br/></p><p>&nbsp; &nbsp; p = NULL;</p><p><br/></p><p>&nbsp; &nbsp; return bOk;</p><p><br/></p><p><br/></p><p>2. 宏定義中使用do{…}while(0)的原因及好處:</p><p><br/></p><p>1) 避免空的宏定義產(chǎn)生warning,如 #define DUMMY( ) do{}while(0)。</p><p><br/></p><p>2) 存在一個(gè)獨立的代碼塊,可進(jìn)行變量定義,實(shí)現比較復雜的邏輯處理。</p><p><br/></p><p>注意,該代碼塊內(即{…}內)定義的變量其作用域僅限于該塊。此外,為避免宏的實(shí)參與其內部定義的變量同名而造成覆蓋,最好在變量名前加上_(基于如下編程慣例:除非是庫,否則不應定義以_開(kāi)始的變量)。</p><p><br/></p><p>3) 若宏出現在判斷語(yǔ)句之后,可保證作為一個(gè)整體來(lái)實(shí)現。</p><p><br/></p><p>如#define SAFE_DELETE(p)&nbsp; delete p; p = NULL;,則以下代碼</p><p><br/></p><p>&nbsp;if(NULL != p)</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;SAFE_DELETE(p)</p><p><br/></p><p>&nbsp;else</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;DUMMY( );</p><p><br/></p><p>就有兩個(gè)問(wèn)題:</p><p><br/></p><p>a) 因為if分支后有兩條語(yǔ)句,else分支沒(méi)有對應的if,編譯失??;</p><p><br/></p><p>b) 假設沒(méi)有else,則SAFE_DELETE中第二條語(yǔ)句無(wú)論if判斷是否成立均會(huì )執行,這顯然違背程序設計的原始目的。</p><p><br/></p><p>那么,為了避免這兩個(gè)問(wèn)題,將宏直接用{}括起來(lái)是否可以?如:</p><p><br/></p><p>#define SAFE_DELETE(p)&nbsp; {delete p; p = NULL;}</p><p><br/></p><p>的確,上述問(wèn)題不復存在。但C/C++編程中,在每條語(yǔ)句后加分號是約定俗成的習慣,此時(shí)以下代碼</p><p><br/></p><p>&nbsp;if(NULL != p)</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;SAFE_DELETE(p);</p><p><br/></p><p>&nbsp;else</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;DUMMY( );</p><p><br/></p><p>其else分支就無(wú)法通過(guò)編譯(多出一個(gè)分號),而采用do{…}while(0)則毫無(wú)問(wèn)題。</p><p><br/></p><p>使用do{...} while(0)將宏包裹起來(lái),成為一個(gè)獨立的語(yǔ)法單元,從而不會(huì )與上下文發(fā)生混淆。同時(shí)因為絕大多數編譯器都能夠識別do{...}while(0)這種無(wú)用的循環(huán)并優(yōu)化,所以該法不會(huì )導致程序的性能降低。</p><p><br/></p><p>6.4 類(lèi)型定義符typedef</p><p><br/></p><p>C語(yǔ)言不僅提供了豐富的數據類(lèi)型,而且還允許由用戶(hù)自己定義類(lèi)型說(shuō)明符,也就是說(shuō)允許由用戶(hù)為數據類(lèi)型取“別名”。類(lèi)型定義符typedef即可用來(lái)完成此功能。</p><p><br/></p><p>typedef定義的一般形式為:</p><p><br/></p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;typedef 原類(lèi)型名&nbsp; 新類(lèi)型名</p><p><br/></p><p>其中原類(lèi)型名中含有定義部分,新類(lèi)型名一般用大寫(xiě)表示,以便于區別。&nbsp;</p><p><br/></p><p>例如,有整型量int a,b。其中int是整型變量的類(lèi)型說(shuō)明符。int的完整寫(xiě)法為integer,為增加程序的可讀性,可把整型說(shuō)明符用typedef定義為typedef&nbsp; int&nbsp; INTEGER。此后就可用INTEGER來(lái)代替int作整型變量的類(lèi)型說(shuō)明,如INTEGER a,b等效于int a,b。</p><p><br/></p><p>用typedef定義數組、指針、結構等類(lèi)型將帶來(lái)很大的方便,不僅使程序書(shū)寫(xiě)簡(jiǎn)單而且意義更為明確,因而增強了可讀性。</p><p><br/></p><p>例如,typedef char NAME[20]表示NAME是字符數組類(lèi)型,數組長(cháng)度為20。然后可用NAME 說(shuō)明變量,如NAME a1,a2,s1,s2完全等效于:char a1[20],a2[20],s1[20],s2[20]。</p><p><br/></p><p>又如:</p><p><br/></p><p>&nbsp;typedef struct{</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;char name[20];</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;int&nbsp; age;</p><p><br/></p><p>&nbsp; &nbsp; &nbsp;char sex;</p><p><br/></p><p>&nbsp;}STU;</p><p><br/></p><p>然后可用STU來(lái)定義結構變量:STU body1,body2;</p><p><br/></p><p>有時(shí)也可用宏定義來(lái)代替typedef的功能,但是宏定義是由預處理完成的,而typedef則是在編譯時(shí)完成的,后者更為靈活方便。</p><p><br/></p><p>此外,采用typedef重新定義一些類(lèi)型,可防止因平臺和編譯器不同而產(chǎn)生的類(lèi)型字節數差異,方便移植。如:</p><p><br/></p><p><br/></p><p>&nbsp; typedef unsigned char boolean;&nbsp; &nbsp; &nbsp; &nbsp;/* Boolean value type. */</p><p><br/></p><p>&nbsp; typedef unsigned long int uint32;&nbsp; &nbsp; /* Unsigned 32 bit value */</p><p><br/></p><p>&nbsp; typedef unsigned short uint16;&nbsp; &nbsp; &nbsp; &nbsp;/* Unsigned 16 bit value */</p><p><br/></p><p>&nbsp; typedef unsigned char uint8;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/* Unsigned 8 bit value */</p><p><br/></p><p>&nbsp; typedef signed long int int32;&nbsp; &nbsp; &nbsp; &nbsp;/* Signed 32 bit value */</p><p><br/></p><p>&nbsp; typedef signed short int16;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /* Signed 16 bit value */</p><p><br/></p><p>&nbsp; typedef signed char int8;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /* Signed 8 bit value */</p><p><br/></p><p><br/></p><p><br/></p><p>&nbsp; //下面的不建議使用</p><p><br/></p><p>&nbsp;typedef unsigned char byte;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /* Unsigned 8 bit value type. */</p><p><br/></p><p>&nbsp;typedef unsigned short word;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/* Unsinged 16 bit value type. */</p><p><br/></p><p>&nbsp;typedef unsigned long dword;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/* Unsigned 32 bit value type. */</p><p><br/></p><p>&nbsp;typedef unsigned char uint1;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/* Unsigned 8 bit value type. */</p><p><br/></p><p>&nbsp;typedef unsigned short uint2;&nbsp; &nbsp; &nbsp; &nbsp; /* Unsigned 16 bit value type. */</p><p><br/></p><p>&nbsp;typedef unsigned long uint4;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/* Unsigned 32 bit value type. */</p><p><br/></p><p>&nbsp;typedef signed char int1;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /* Signed 8 bit value type. */</p><p><br/></p><p>&nbsp;typedef signed short int2;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/* Signed 16 bit value type. */</p><p><br/></p><p>&nbsp;typedef long int int4;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/* Signed 32 bit value type. */</p><p><br/></p><p>&nbsp;typedef signed long sint31;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /* Signed 32 bit value */</p><p><br/></p><p>&nbsp;typedef signed short sint15;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/* Signed 16 bit value */</p><p><br/></p><p>&nbsp;typedef signed char sint7;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/* Signed 8 bit value */</p><p><br/></p>Sat, 15 Feb 2020 16:42:06 +0800如何降低直流穩壓電源輸出 “紋波與噪聲” ?http:///hangyexinwen/581.html<p>&nbsp; 紋波主要在五個(gè)方面:輸入低頻紋波、高頻紋波、寄生參數引起的共模紋波噪聲、功率器件開(kāi)關(guān)過(guò)程中產(chǎn)生的超高頻諧振噪聲和閉環(huán)調節控制引起的紋波噪聲。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 1低頻紋波是與輸出電路的濾波電容容量相關(guān)。電容的容量不可能無(wú)限制地增加,導致輸出低頻紋波的殘留。交流紋經(jīng) DC/DC 變換器衰減后,在直流穩壓電源輸出端表現為低頻噪聲,其大由 DC/DC 變換器的變比和控制系統的增益決定。電流型控制 DC/DC 變換器的紋波抑制比電壓型稍有提高。但其輸出端的低頻交流紋波仍較大。若要實(shí)現直流穩壓電源的低紋波輸出,則必須對低頻電源紋波采取濾波措施??刹捎们凹夘A穩壓和增大 DC/DC 變換器閉環(huán)增益來(lái)消除。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 低頻紋波抑制的幾種常用的方法:</p><p>&nbsp; &nbsp; &nbsp; &nbsp; a、加大輸出低頻濾波的電感,電容參數,使低頻紋波降低到所需的指標。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; b、采用前饋控制方法,降低低頻紋波分量。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 2高頻紋波噪聲來(lái)源于高頻功率開(kāi)關(guān)變換電路,在電路中,通過(guò)功率器件對輸入直流電壓進(jìn)行高頻開(kāi)關(guān)變換而后整流濾波再實(shí)現穩壓輸出的,在其輸出端含有與開(kāi)關(guān)工作頻率相同頻率的高頻紋波,其對外電路的影響大小主要和直流穩壓電源的變換頻率、輸出濾波器的結構和參數有關(guān),設計中盡量提高功率變換器的工作頻率,可以減少對高頻開(kāi)關(guān)紋波的濾波要求。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 高頻紋波抑制的目的是給高頻紋波提供通路,常用的方法有以下幾種:</p><p>&nbsp; &nbsp; &nbsp; &nbsp; a、提高直流穩壓電源工作頻率,以提高高頻紋波頻率,有利于抑制輸出高頻紋波</p><p>&nbsp; &nbsp; &nbsp; &nbsp; b、加大輸出高頻濾波器,可以抑制輸出高頻紋波。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; C、采用多級濾波。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 3由于功率器件與散熱器底板和變壓器原、副邊之間存在寄生電容,導線(xiàn)存在寄生電感,因此當矩形波電壓作用于功率器件時(shí),直流穩壓電源的輸出端因此會(huì )產(chǎn)生共模紋波噪聲。減小與控制功率器件、變壓器與機殼地之間的寄生電容,并在輸出側加共模抑制電感及電容,可減小輸出的共模紋波噪聲。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 減小輸出共模紋波噪聲的常用方法:</p><p>&nbsp; &nbsp; &nbsp; &nbsp; a、輸出采用專(zhuān)門(mén)設計的 EMI 濾波器。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; b、降低開(kāi)關(guān)毛刺幅度。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 4超高頻諧振噪聲主要來(lái)源于高頻整流二極管反向恢復時(shí)二極管結電容、功率器件開(kāi)關(guān)時(shí)功率器件結電容與線(xiàn)路寄生電感的諧振,頻率一般為 1-10MHz,通過(guò)選用軟恢復特性二極管、結電容小的開(kāi)關(guān)管和減少布線(xiàn)長(cháng)度等措施可以減少超高頻諧振噪聲。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; 直流穩壓電源都需對輸出電壓進(jìn)行閉環(huán)控制,調節器參數設計的不適當也會(huì )引起紋波。當輸出端波動(dòng)時(shí)通過(guò)反饋網(wǎng)絡(luò )進(jìn)入調節器回路,可能導致調節器的自激振蕩,引起附加紋波。此紋波電壓一般沒(méi)有固定的頻率。在開(kāi)關(guān)直流電源中,往往因調節器參數選擇不適當會(huì )引起輸出紋波的增大。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 這部分紋波可通過(guò)以下方法進(jìn)行抑制:</p><p>&nbsp; &nbsp; &nbsp; &nbsp; a、在調節器輸出增加對地的補償網(wǎng)絡(luò ),調節器的補償可抑制調節器自激引起的紋波增大。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; b、合理選擇閉環(huán)調節器的開(kāi)環(huán)放大倍數和閉環(huán)調節器的參數,開(kāi)環(huán)放大倍數過(guò)大有時(shí)會(huì )引起調節器的振蕩或自激,使輸出紋彼含量增加,過(guò)小的開(kāi)環(huán)放大倍數使輸出電壓穩定性變差及紋波含量增加.所以調節器的開(kāi)環(huán)放大倍數及閉環(huán)調節器的參數要合理選取,調試中要根據負載狀況進(jìn)行調節。</p><p>&nbsp; &nbsp; &nbsp; &nbsp; c、在反饋通道中不增加純滯后濾波環(huán)節.使延時(shí)滯后降到最小.以增加閉環(huán)調節的快速性和及時(shí)性,對抑制輸出電壓紋波是有益的。</p><p><br/></p>Sat, 15 Feb 2020 16:40:07 +0800如何實(shí)現外界擾動(dòng)下孤立交大功率直流電源混合微電網(wǎng)功率的自主平衡,并提高系統應對擾動(dòng)沖擊的抵御能力?http:///hangyexinwen/580.html<p>為實(shí)現外界擾動(dòng)下孤立交大功率直流電源混合微電網(wǎng)系統功率的自主平衡,其雙向AC/DC換流器的控制應同時(shí)考慮交流側頻率和大功率直流電源側電壓的運行狀態(tài),現有研究尚未闡明全網(wǎng)功率成比例分配時(shí),交流頻率和大功率直流電源電壓與雙向AC/DC換流器傳輸功率需滿(mǎn)足的平衡關(guān)系。與此同時(shí),在孤立混合微電網(wǎng)系統中,母線(xiàn)電壓由于沒(méi)有大電網(wǎng)的支撐而易于受到功率擾動(dòng)的影響。因此,研究適用于雙向AC/DC換流器的內外環(huán)控制策略,可以實(shí)現外界擾動(dòng)下孤立交大功率直流電源混合微電網(wǎng)功率的自主分配,并顯著(zhù)提高系統應對擾動(dòng)沖擊的抵御能力。</p><p>2</p><p><br/></p><p>論文所解決的問(wèn)題及意義 </p><p>本文通過(guò)對孤立混合微網(wǎng)中雙向AC/DC換流器交流側和大功率直流電源側的有功功率下垂控制方程進(jìn)行整合,將功率分配原則擴展至整個(gè)交大功率直流電源混合微網(wǎng)中,提出了基于全網(wǎng)功率成比例分配原則的雙向AC/DC換流器外環(huán)功率控制策略,實(shí)現了孤立混合微電網(wǎng)功率的自主平衡;同時(shí)在對雙向AC/DC換流器進(jìn)行電壓波動(dòng)分析的基礎上,提出了抑制電壓波動(dòng)的雙向AC/DC換流器改進(jìn)內環(huán)控制策略,在無(wú)需額外傳感器的情況下快速跟蹤系統的等效電流干擾并進(jìn)行抑制,增強了系統抗外界干擾的能力。</p><p>3</p><p><br/></p><p>論文重點(diǎn)內容  </p><p>(1)孤立交大功率直流電源混合微電網(wǎng)雙向AC/DC換流器外環(huán)功率控制策略</p><p><br/></p><p>在采用下垂控制的混合微電網(wǎng)中,對于通過(guò)雙向AC/DC換流器連接到交大功率直流電源母線(xiàn)上的交流和大功率直流電源子微網(wǎng)來(lái)說(shuō),可以分別將其看作為“交流整合電源”和“大功率直流電源整合電源”(如圖1所示),與其余并聯(lián)在母線(xiàn)上的分布式電源一樣,所整合電源通過(guò)雙向AC/DC換流器根據交流頻率/大功率直流電源電壓來(lái)確定其向對側子微網(wǎng)傳輸有功功率的大?。魅牖蛄鞒觯?。</p><p><br/></p><p><img src="http:///zb_users/upload/2020/02/202002151581755068256763.png" title="如何實(shí)現外界擾動(dòng)下孤立交大功率直流電源混合微電網(wǎng)功率的自主平衡,并提高系統應對擾動(dòng)沖擊的抵御能力?" alt="如何實(shí)現外界擾動(dòng)下孤立交大功率直流電源混合微電網(wǎng)功率的自主平衡,并提高系統應對擾動(dòng)沖擊的抵御能力?" width="400" height="127" border="0" vspace="0" style="width: 400px; height: 127px;"/></p><p>圖1 孤立混合微電網(wǎng)等效模型</p><p><br/></p><p>進(jìn)而可以推導出全網(wǎng)功率成比例分配的平衡關(guān)系式為:</p><p><br/></p><p>基于該平衡關(guān)系式的雙向AC/DC換流器有功控制策略可以在外界擾動(dòng)下充分發(fā)揮交大功率直流電源兩側功率的快速支撐能力,無(wú)論功率波動(dòng)發(fā)生在交流還是大功率直流電源側,所有分布式電源共同參與功率平衡以避免單個(gè)電源過(guò)載情況的發(fā)生。同時(shí)該策略自主調節交流和大功率直流電源母線(xiàn)間有功功率的流動(dòng)方向,無(wú)需在多種控制方式之間切換,可以滿(mǎn)足不同運行方式的需求。</p><p><br/></p><p>(2)孤立交大功率直流電源混合微電網(wǎng)雙向AC/DC換流器電壓擾動(dòng)抑制策略</p><p>在雙向AC/DC換流器常規雙環(huán)控制中,內環(huán)參考電流由外環(huán)功率的參考值給出。當發(fā)生外界功率突變引起換流器母線(xiàn)電壓產(chǎn)生偏差后,功率的參考值才會(huì )相應地變化以調整其傳輸功率的大小,因而會(huì )對換流器電壓造成較大的沖擊??赏茖У贸鋈缦碌膿Q流器電壓響應方程:</p><p><br/></p><p>利用干擾觀(guān)測環(huán)節(DOL)可以估計輸出電流的擾動(dòng)大小,其應用無(wú)需增加額外傳感器以及其他分布式電源或負載的電氣信息,減少了設備投資和通信成本,便于分布式電源的即插即用功能。擾動(dòng)電流的觀(guān)測方程為:</p><p><br/></p><p>通過(guò)增加擾動(dòng)觀(guān)測環(huán)節來(lái)快速跟蹤系統的等效負載電流干擾,進(jìn)而提出了基于擾動(dòng)補償的交大功率直流電源混合微電網(wǎng)雙向AC/DC換流器的內環(huán)電壓波動(dòng)抑制策略,控制框圖如圖2所示。</p><p><br/></p><p><img src="http:///zb_users/upload/2020/02/202002151581755087627423.png" title="如何實(shí)現外界擾動(dòng)下孤立交大功率直流電源混合微電網(wǎng)功率的自主平衡,并提高系統應對擾動(dòng)沖擊的抵御能力?" alt="如何實(shí)現外界擾動(dòng)下孤立交大功率直流電源混合微電網(wǎng)功率的自主平衡,并提高系統應對擾動(dòng)沖擊的抵御能力?" width="400" height="382" border="0" vspace="0" style="width: 400px; height: 382px;"/></p><p>圖2 基于擾動(dòng)補償的雙向AC/DC換流器改進(jìn)內環(huán)控制策略</p><p>4</p><p><br/></p><p>結論</p><p>本文針對孤立運行的交大功率直流電源混合微電網(wǎng),提出了基于全網(wǎng)功率成比例分配原則的雙向AC/DC換流器外環(huán)控制策略,以及抑制電壓波動(dòng)的改進(jìn)內環(huán)控制策略,得出的結論如下:</p><p>(1)本文提出的雙向AC/DC換流器外環(huán)功率控制策略以交流頻率和大功率直流電源電壓為輸入,充分發(fā)揮了外界擾動(dòng)下交大功率直流電源兩側功率的快速支撐能力,實(shí)現了混合微電網(wǎng)的功率平衡和自主分配;</p><p>(2)本文提出的改進(jìn)內環(huán)控制可以在無(wú)需額外傳感器的情況下快速跟蹤系統的等效電流干擾并對其進(jìn)行抑制,在保證理想穩態(tài)性能的同時(shí)提高了外界干擾沖擊下微電網(wǎng)的動(dòng)態(tài)性能;</p><p>(3)本文所提出的雙向AC/DC換流器功率控制策略依據各分布式電源的額定容量進(jìn)行功率分配,針對未來(lái)熱電聯(lián)供的復雜微電網(wǎng)能源系統,考慮發(fā)電效率、制熱效率、環(huán)境懲罰以及市場(chǎng)政策等眾多因素對系統功率進(jìn)行綜合管控,是下一步的研究方向。</p>Sat, 15 Feb 2020 16:23:00 +0800作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?http:///hangyexinwen/579.html<p><span style="color: #FF0000;"><strong><span style="font-size: 16px;">紋波</span></strong></span></p><p><span style="font-size: 16px;">紋波:是附著(zhù)于直流電平之上的包含周期性與隨機性成分的雜波信號。指在額定輸出電壓、電流的情況下,輸出電壓中的交流電壓的峰值。狹義上的紋波電壓,是指輸出直流電壓中含有的工頻交流成分。</span></p><p><span style="color: #FF0000;"><strong><span style="font-size: 16px;">噪聲</span></strong></span></p><p><span style="font-size: 16px;">噪聲:對于電子線(xiàn)路中所標稱(chēng)的噪聲,可以概括地認為,它是對目的信號以外的所有信號的一個(gè)總稱(chēng)。最初人們把造成收音機這類(lèi)音響設備所發(fā)出噪聲的那些電子信號,稱(chēng)為噪聲。但是,一些非目的的電子信號對電子線(xiàn)路造成的后果并非都和聲音有關(guān),因而,后來(lái)人們逐步擴大了噪聲概念。例如,把造成視屏幕有白斑條紋的那些電子信號也稱(chēng)為噪聲??赡芤哉f(shuō),電路中除目的的信號以外的一切信號,不管它對電路是否造成影響,都可稱(chēng)為噪聲。例如,電源電壓中的紋波或自激振蕩,可對電路造成不良影響,使音響裝置發(fā)出交流聲或導致電路誤動(dòng)作,但有時(shí)也許并不導致上述后果。對于這種紋波或振蕩,都應稱(chēng)為電路的一種噪聲。又有某一頻率的無(wú)線(xiàn)電波信號,對需要接收這種信號的接收機來(lái)講,它是正常的目的信號,而對另一接收機它就是一種非目的信號,即是噪聲。在電子學(xué)中常使用干擾這個(gè)術(shù)語(yǔ),有時(shí)會(huì )與噪聲的概念相混淆,其實(shí),是有區別的。噪聲是一種電子信號,而干擾是指的某種效應,是由于噪聲原因對電路造成的一種不良反應。而電路中存在著(zhù)噪聲,卻不一定就有干擾。在數字電路中。往往可以用示波器觀(guān)察到在正常的脈沖信號上混有一些小的尖峰脈沖是所不期望的,而是一種噪聲。但由于電路特性關(guān)系,這些小尖峰脈沖還不致于使數字電路的邏輯受到影響而發(fā)生混亂,所以可以認為是沒(méi)有干擾。</span></p><p><span style="font-size: 16px;">當一個(gè)噪聲電壓大到足以使電路受到干擾時(shí),該噪聲電壓就稱(chēng)為干擾電壓。而一個(gè)電路或一個(gè)器件,當它還能保持正常工作時(shí)所加的最大噪聲電壓,稱(chēng)為該電路或器件的抗干擾容限或抗擾度。一般說(shuō)來(lái),噪聲很難消除,但可以設法降低噪聲的強度或提高電路的抗擾度,以使噪聲不致于形成干擾。</span></p><p><span style="color: #FF0000;"><strong><span style="font-size: 16px;">諧波</span></strong></span></p><p><span style="font-size: 16px;">諧波:是指電流中所含有的頻率為基波的整數倍的電量,一般是指對周期性的非正弦電量進(jìn)行傅里葉級數分解,其余大于基波頻率的電流產(chǎn)生的電量。從廣義上講,由于交流電網(wǎng)有效分量為工頻單一頻率,因此任何與工頻頻率不同的成分都可以稱(chēng)之為諧波。</span></p><p><span style="font-size: 16px;">諧波產(chǎn)生的原因:由于正弦電壓加壓于非線(xiàn)性負載,當電流流經(jīng)負載時(shí),與所加的電壓不呈線(xiàn)性關(guān)系,基波電流發(fā)生畸變就形成非正弦電流,即電路中有諧波產(chǎn)生。主要非線(xiàn)性負載有UPS、高壓直流穩壓電源、整流器、變頻器、逆變器等。</span></p><p><span style="font-size: 16px;">今天此篇文章主要講解高壓直流穩壓電源中的紋波和噪聲</span></p><p><span style="font-size: 16px;">高壓直流穩壓電源(包括AC/DC轉換器、DC/DC轉換器、AC/DC模塊和DC/DC模塊)與線(xiàn)性電源相比較,最突出的優(yōu)點(diǎn)是轉換效率高,一般可達80%~85%,高的可達90%~97%;其次,高壓直流穩壓電源采用高頻變壓器替代了笨重的工頻變壓器,不僅重量減輕,體積也減小了,因此應用范圍越來(lái)越廣。但高壓直流穩壓電源的缺點(diǎn)是由于其開(kāi)關(guān)管工作于高頻開(kāi)關(guān)狀態(tài),輸出的紋波和噪聲電壓較大,一般為輸出電壓的1%左右(低的為輸出電壓的0.5%左右),最好產(chǎn)品的紋波和噪聲電壓也有幾十mV;而線(xiàn)性電源的調整管工作于線(xiàn)性狀態(tài),無(wú)紋波電壓,輸出的噪聲電壓也較小,其單位是μV。</span></p><p><span style="font-size: 16px;">簡(jiǎn)單地介紹高壓直流穩壓電源產(chǎn)生紋波和噪聲的原因和測量方法、測量裝置、測量標準及減小紋波和噪聲的措施。</span></p><p><span style="color: #FF0000;"><strong><span style="font-size: 16px;">紋波和噪聲產(chǎn)生的原因</span></strong></span></p><p><span style="font-size: 16px;">高壓直流穩壓電源輸出的不是純正的直流電壓,里面有些交流成分,這就是紋波和噪聲造成的。紋波是輸出直流電壓的波動(dòng),與高壓直流穩壓電源的開(kāi)關(guān)動(dòng)作有關(guān)。每一個(gè)開(kāi)、關(guān)過(guò)程,電能從輸入端被“泵到”輸出端,形成一個(gè)充電和放電的過(guò)程,從而造成輸出電壓的波動(dòng),波動(dòng)頻率與開(kāi)關(guān)的頻率相同。紋波電壓是紋波的波峰與波谷之間的峰峰值,其大小與高壓直流穩壓電源的輸入電容和輸出電容的容量及品質(zhì)有關(guān)。</span></p><p><span style="font-size: 16px;">噪聲的產(chǎn)生原因有兩種,一種是高壓直流穩壓電源自身產(chǎn)生的;另一種是外界電磁場(chǎng)的干擾(EMI),它能通過(guò)輻射進(jìn)入高壓直流穩壓電源或者通過(guò)電源線(xiàn)輸入高壓直流穩壓電源。</span></p><p><span style="font-size: 16px;">高壓直流穩壓電源自身產(chǎn)生的噪聲是一種高頻的脈沖串,由發(fā)生在開(kāi)關(guān)導通與截止瞬間產(chǎn)生的尖脈沖所造成,也稱(chēng)為開(kāi)關(guān)噪聲。噪聲脈沖串的頻率比開(kāi)關(guān)頻率高得多,噪聲電壓是其峰峰值。噪聲電壓的振幅很大程度上與高壓直流穩壓電源的拓撲、電路中的寄生狀態(tài)及PCB的設計有關(guān)。</span></p><p><span style="font-size: 16px;">利用示波器可以看到紋波和噪聲的波形,如圖1所示。紋波的頻率與開(kāi)關(guān)管頻率相同,而噪聲的頻率是開(kāi)關(guān)管的兩倍。紋波電壓的峰峰值和噪聲電壓的峰峰值之和就是紋波和噪聲電壓,其單位是mVp-p。</span></p><p><img src="http:///zb_users/upload/2020/02/202002101581321391398365.png" title="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?" alt="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?" width="400" height="73" border="0" vspace="0" style="width: 400px; height: 73px;"/></p><p><span style="font-size: 16px;">圖1 紋波和噪聲的波形</span></p><p><span style="color: #FF0000;"><strong><span style="font-size: 16px;">紋波和噪聲的測量方法</span></strong></span></p><p><span style="font-size: 16px;">紋波和噪聲電壓是高壓直流穩壓電源的主要性能參數之一,因此如何精準測量是一個(gè)十分重要問(wèn)題。目前測量紋波和噪聲電壓是利用寬頻帶示波器來(lái)測量的方法,它能精準地測出紋波和噪聲電壓值。</span></p><p><span style="font-size: 16px;">由于高壓直流穩壓電源的品種繁多(有不同的拓撲、工作頻率、輸出功率、不同的技術(shù)要求等),但是各生產(chǎn)廠(chǎng)家都采用示波器測量法,僅測量裝置上不完全相同,因此各廠(chǎng)對不同高壓直流穩壓電源的測量都有自己的標準,即企業(yè)標準。</span></p><p><span style="font-size: 16px;">用示波器測量紋波和噪聲的裝置的框圖如圖2所示。它由被測高壓直流穩壓電源、負載、示波器及測量連線(xiàn)組成。有的測量裝置中還焊上電感或電容、電阻等元件。</span></p><p><img src="http:///zb_users/upload/2020/02/202002101581321404156932.png" title="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?" alt="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?" width="400" height="205" border="0" vspace="0" style="width: 400px; height: 205px;"/></p><p><span style="font-size: 16px;">圖2 示波器測量框圖</span></p><p><span style="font-size: 16px;">從圖2來(lái)看,似乎與其他測波形電路沒(méi)有什么區別,但實(shí)際上要求不同。測紋波和噪聲電壓的要求如下:</span></p><p><br/></p><p><span style="font-size: 16px;">● 要防止環(huán)境的電磁場(chǎng)干擾(EMI)侵入,使輸出的噪聲電壓不受EMI的影響;</span></p><p><span style="font-size: 16px;">● 要防止負載電路中可能產(chǎn)生的EMI干擾;</span></p><p><span style="font-size: 16px;">● 對小型開(kāi)關(guān)型模塊電源,由于內部無(wú)輸出電容或輸出電容較小,所以在測量時(shí)要加上適當的輸出電容。</span></p><p><br/></p><p><span style="font-size: 16px;">為滿(mǎn)足第1條要求,測量連線(xiàn)應盡量短,并采用雙絞線(xiàn)(消除共模噪聲干擾)或同軸電纜;一般的示波器探頭不能用,需用專(zhuān)用示波器探頭;并且測量點(diǎn)應在電源輸出端上,若測量點(diǎn)在負載上則會(huì )造成極大的測量誤差。為滿(mǎn)足第2點(diǎn),負載應采用阻性假負載。</span></p><p><br/></p><p><span style="font-size: 16px;">經(jīng)常有這樣的情況發(fā)生,用戶(hù)買(mǎi)回的高壓直流穩壓電源或模塊電源,在測量紋波和噪聲這一性能指標時(shí),發(fā)現與產(chǎn)品技術(shù)規格上的指標不符,大大地超過(guò)技術(shù)規格上的性能指標要求,這往往是用戶(hù)的測量裝置不合適,測量的方法(測量點(diǎn)的選擇)不合適或采用通用的測量探頭所致</span></p><p><span style="color: #FF0000;"><strong><span style="font-size: 16px;">幾種測量裝置</span></strong></span></p><p><span style="font-size: 16px;">1雙絞線(xiàn)測量裝置</span></p><p><span style="font-size: 16px;">雙絞線(xiàn)測量裝置如圖3所示。采用300mm(12英寸)長(cháng)、#16AWG線(xiàn)規組成的雙絞線(xiàn)與被測高壓直流穩壓電源的+OUT及-OUT連接,在+OUT與-OUT之間接上阻性假負載。在雙絞線(xiàn)末端接一個(gè)4TμF電解電容(鉭電容)后輸入帶寬為50MHz(有的企業(yè)標準為20MHz)的示波器。在測量點(diǎn)連接時(shí),一端要接在+OUT上,另一端接到地平面端。</span></p><p><img src="http:///zb_users/upload/2020/02/202002101581321417286374.png" title="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?" alt="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?" width="400" height="160" border="0" vspace="0" style="width: 400px; height: 160px;"/></p><p><span style="font-size: 16px;">圖3 雙絞線(xiàn)測量裝置</span></p><p><br/></p><p><span style="font-size: 16px;">這里要注意的是,雙絞線(xiàn)接地線(xiàn)的末端要盡量的短,夾在探頭的地線(xiàn)環(huán)上。</span></p><p><span style="font-size: 16px;">2 平行線(xiàn)測量裝置</span></p><p><span style="font-size: 16px;">平行線(xiàn)測量裝置如圖4所示。圖4中,C1是多層陶瓷電容(MLCC),容量為1μF,C2是鉭電解電容,容量是10μF。兩條平行銅箔帶的電壓降之和小于輸出電壓值的2%。該測量方法的優(yōu)點(diǎn)是與實(shí)際工作環(huán)境比較接近,缺點(diǎn)是較容易撿拾EMI干擾。</span></p><p><img src="http:///zb_users/upload/2020/02/202002101581321432469267.png" title="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?" alt="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?" width="400" height="190" border="0" vspace="0" style="width: 400px; height: 190px;"/></p><p><span style="font-size: 16px;">圖4 平行線(xiàn)測量裝置</span></p><p><span style="font-size: 16px;">3 專(zhuān)用示波器探頭</span></p><p><span style="font-size: 16px;">圖5所示為一種專(zhuān)用示波器探頭直接與波測電源靠接。專(zhuān)用示波器探頭上有個(gè)地線(xiàn)環(huán),其探頭的尖端接觸電源輸出正極,地線(xiàn)環(huán)接觸電源的負極(GND),接觸要可靠。</span></p><p><img src="http:///zb_users/upload/2020/02/202002101581321446844792.png" title="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?" alt="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?" width="400" height="162" border="0" vspace="0" style="width: 400px; height: 162px;"/></p><p><span style="font-size: 16px;">圖5 示波器探頭的接法</span></p><p><span style="font-size: 16px;">這里順便提出,不能采用示波器的通用探頭,因為通用示波器探頭的地線(xiàn)不屏蔽且較長(cháng),容易撿拾外界電磁場(chǎng)的干擾,造成較大的噪聲輸出,虛線(xiàn)面積越大,受干擾的影響越大,如圖6所示。</span></p><p><img src="http:///zb_users/upload/2020/02/202002101581321459675078.png" title="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?" alt="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?" width="400" height="175" border="0" vspace="0" style="width: 400px; height: 175px;"/></p><p><span style="font-size: 16px;">圖6 通用探頭易造成干擾</span></p><p><span style="font-size: 16px;">4 同軸電纜測量裝置</span></p><p><span style="font-size: 16px;">這里介紹兩種同軸電纜測量裝置。圖7是在被測電源的輸出端接R、C電路后經(jīng)輸入同軸電纜(50Ω)后接示波器的AC輸入端;圖8是同軸電纜直接接電源輸出端,在同軸電纜的兩端串接1個(gè)0.68μF陶瓷電容及1個(gè)47Ω/1w碳膜電阻后接入示波器。T形BNC連接器和電容電阻的連接如圖9所示。</span></p><p><img src="http:///zb_users/upload/2020/02/202002101581321473142657.png" title="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?" alt="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?" width="400" height="150" border="0" vspace="0" style="width: 400px; height: 150px;"/></p><p><span style="font-size: 16px;">圖7 同軸電纜測量裝置1</span></p><p><img src="http:///zb_users/upload/2020/02/202002101581321486489488.png" title="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?" alt="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?" width="400" height="241" border="0" vspace="0" style="width: 400px; height: 241px;"/></p><p><span style="font-size: 16px;">圖8 同軸電纜測量裝置2</span></p><p><img src="http:///zb_users/upload/2020/02/202002101581321501531040.jpg" title="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?" alt="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?" width="400" height="232" border="0" vspace="0" style="width: 400px; height: 232px;"/></p><p><span style="font-size: 16px;">圖9 T形BNC連接器和電容電阻的連接</span></p><p><span style="color: #FF0000;"><strong><span style="font-size: 16px;">紋波和噪聲的測量標準</span></strong></span></p><p><span style="font-size: 16px;">以上介紹了多種測量裝置,同一個(gè)被測電源若采用不同的測量裝置,其測量的結果是不相同的,若能采用一樣的標準測量裝置來(lái)測,則測量的結果才有可比性。</span></p><p><img src="http:///zb_users/upload/2020/02/202002101581321512233649.png" title="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?" alt="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?" width="400" height="196" border="0" vspace="0" style="width: 400px; height: 196px;"/></p><p><span style="font-size: 16px;">圖10 測量標準的測量裝置</span></p><p><span style="font-size: 16px;">國家標準規定在被測電源輸出正、負端小于150mm處并聯(lián)兩個(gè)電容C2及C3,C2為22μF電解電容,C3為0.47μF薄膜電容。在這兩個(gè)電容的連接端接負載及不超過(guò)1.5m長(cháng)的50Ω同軸電纜,同軸電纜的另一端連接一個(gè)50Ω的電阻R和串接一個(gè)4700pF的電容C1后接入示波器,示波器的帶寬為100MHz。同軸電纜的兩端連接線(xiàn)應盡可能地短,以防止撿拾輻射的噪聲。另外,連接負載的線(xiàn)若越長(cháng),則測出的紋波和噪聲電壓越大,在這情況下有必要連接C2及C3。若示波器探頭的地線(xiàn)太長(cháng),則紋波和噪聲的測量不可能精確。</span></p><p><span style="font-size: 16px;">另外,測試應在溫室條件下,被測電源應輸入正常的電壓,輸出額定電壓及額定負載電流。</span></p><p><span style="color: #FF0000;"><strong><span style="font-size: 16px;">減小紋波和噪聲電壓的措施</span></strong></span></p><p><span style="font-size: 16px;">高壓直流穩壓電源除開(kāi)關(guān)噪聲外,在A(yíng)C/DC轉換器中輸入的市電經(jīng)全波整流及電容濾波,電流波形為脈沖,如圖11所示(圖a是全波整流、濾波電路,b是電壓及電流波形)。電流波形中有高次諧波,它會(huì )增加噪聲輸出。良好的高壓直流穩壓電源(AC/DC轉換器)在電路增加了功率因數校正(PFC)電路,使輸出電流近似正弦波,降低高次諧波,功率因數提高到0.95左右,減小了對電網(wǎng)的污染。電路圖如圖12所示。</span></p><p><img src="http:///zb_users/upload/2020/02/202002101581321526686887.png" title="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?" alt="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?" width="400" height="168" border="0" vspace="0" style="width: 400px; height: 168px;"/></p><p><span style="font-size: 16px;">圖11 高壓直流穩壓電源整流波形</span></p><p><img src="http:///zb_users/upload/2020/02/202002101581321541584953.png" title="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?" alt="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?" width="400" height="201" border="0" vspace="0" style="width: 400px; height: 201px;"/></p><p><span style="font-size: 16px;">圖12 高壓直流穩壓電源PFC電路</span></p><p><span style="font-size: 16px;">高壓直流穩壓電源或模塊的輸出紋波和噪聲電壓的大小與其電源的拓撲,各部分電路的設計及PCB設計有關(guān)。例如,采用多相輸出結構,可有效地降低紋波輸出?,F在的高壓直流穩壓電源的開(kāi)關(guān)頻率越來(lái)越高;低的是幾十kHz,一般是幾百kHz,而高的可達1MHz以上。因此產(chǎn)生的紋波電壓及噪聲電壓的頻率都很高,要減小紋波和噪聲最簡(jiǎn)單的辦法是在電源電路中加無(wú)源低通濾波器。</span></p><p><span style="font-size: 16px;">1 減少EMI的措施</span></p><p><span style="font-size: 16px;">可以采用金屬外殼做屏蔽減小外界電磁場(chǎng)輻射干擾。為減少從電源線(xiàn)輸入的電磁干擾,在電源輸入端加EMI濾波器,如圖13所示(EMI濾波器也稱(chēng)為電源濾波器)。</span></p><p><img src="http:///zb_users/upload/2020/02/202002101581321557491837.png" title="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?" alt="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?" width="400" height="225" border="0" vspace="0" style="width: 400px; height: 225px;"/></p><p><span style="font-size: 16px;">圖13 高壓直流穩壓電源加EMI濾波</span></p><p><span style="font-size: 16px;">2 在輸出端采用高頻性能好、ESR低的電容</span></p><p><span style="font-size: 16px;">采用高分子聚合物固態(tài)電解質(zhì)的鋁或鉭電解電容作輸出電容是最佳的,其特點(diǎn)是尺寸小而電容量大,高頻下ESR阻抗低,允許紋波電流大。它最適用于高效率、低電壓、大電流降壓式DC/DC轉換器及DC/DC模塊電源作輸出電容。例如,一種高分子聚合物鉭固態(tài)電解電容為68μF,其在20℃、100kHz時(shí)的等效串聯(lián)電阻(ESR)最大值為25mΩ,最大的允許紋波電流(在100kHz時(shí))為2400mArms,其尺寸為:7.3mm(長(cháng))×4.3mm(寬)×1.8mm(高),其型號為10TPE68M(貼片或封裝)。</span></p><p><br/></p><p><span style="font-size: 16px;">紋波電壓ΔVOUT為:</span></p><p><span style="font-size: 16px;">ΔVOUT=ΔIOUT×ESR&nbsp; &nbsp; &nbsp; &nbsp; (1)</span></p><p><span style="font-size: 16px;">若ΔIOUT=0.5A,ESR=25mΩ,則ΔVOUT=12.5mV。</span></p><p><span style="font-size: 16px;">若采用普通的鋁電解電容作輸出電容,額定電壓10V、額定電容量100μF,在20℃、120Hz時(shí)的等效串聯(lián)電阻為5.0Ω,最大紋波電流為70mA。它只能工作于10kHz左右,無(wú)法在高頻(100kHz以上的頻率)下工作,再增加電容量也無(wú)效,因為超過(guò)10kHz時(shí),它已成電感特性了。</span></p><p><span style="font-size: 16px;">某些開(kāi)關(guān)頻率在100kHz到幾百kHz之間的電源,采用多層陶電容(MLCC)或鉭電解電容作輸出電容的效果也不錯,其價(jià)位要比高分子聚合物固態(tài)電解質(zhì)電容要低得多。</span></p><p><span style="font-size: 16px;">3 采用與產(chǎn)品系統的頻率同步</span></p><p><span style="font-size: 16px;">為減小輸出噪聲,電源的開(kāi)關(guān)頻率應與系統中的頻率同步,即高壓直流穩壓電源采用外同步輸入系統的頻率,使開(kāi)關(guān)的頻率與系統的頻率相同。</span></p><p><span style="font-size: 16px;">4 避免多個(gè)模塊電源之間相互干擾</span></p><p><span style="font-size: 16px;">在同一塊PCB上可能有多個(gè)模塊電源一起工作。若模塊電源是不屏蔽的、并且靠的很近,則可能相互干擾使輸出噪聲電壓增加。為避免這種相互干擾可采用屏蔽措施或將其適當遠離,減少其相互影響的干擾。</span></p><p><span style="font-size: 16px;">5 增加LC濾波器</span></p><p><span style="font-size: 16px;">為減小模塊電源的紋波和噪聲,可以在DC/DC模塊的輸入和輸出端加LC濾波器,如圖14所示。圖14左圖是單輸出,圖14右圖是雙輸出。</span></p><p><img src="http:///zb_users/upload/2020/02/202002101581321581515147.png" title="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?" alt="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?" width="400" height="57" border="0" vspace="0" style="width: 400px; height: 57px;"/></p><p><span style="font-size: 16px;">圖14 在DC/DC模塊中加入LC濾波器</span></p><p><span style="font-size: 16px;">在表1及表2中列出1W DC/DC模塊的VIN端和VOUT端在不同輸出電壓時(shí)的電容值。要注意的是,電容量不能過(guò)大而造起動(dòng)問(wèn)題,LC的諧振頻率必須與開(kāi)關(guān)頻率要錯開(kāi)以避免相互干擾,L采用μH極的,其直流電阻要低,以免影響輸出電壓精度。</span></p><p><br/></p><p><img src="http:///zb_users/upload/2020/02/202002101581321596988697.png" style="width: 400px; height: 191px;" title="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?" width="400" height="191" border="0" vspace="0" alt="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?"/></p><p><img src="http:///zb_users/upload/2020/02/202002101581321596175790.png" style="width: 400px; height: 191px;" title="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?" width="400" height="191" border="0" vspace="0" alt="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?"/></p><p><span style="font-size: 16px;">表1和表2</span></p><p><span style="font-size: 16px;">6 增加LDO</span></p><p><span style="font-size: 16px;">在高壓直流穩壓電源或模塊電源輸出后再加一個(gè)低壓差線(xiàn)性穩壓器(LDO)能大幅度地降低輸出噪聲,以滿(mǎn)足對噪聲特別有要求的電路需要(見(jiàn)圖15),輸出噪聲可達μV級。</span></p><p><img src="http:///zb_users/upload/2020/02/202002101581321617416336.png" title="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?" alt="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?" width="400" height="178" border="0" vspace="0" style="width: 400px; height: 178px;"/></p><p><span style="font-size: 16px;">圖15 在電源中加入LDO</span></p><p><span style="font-size: 16px;">由于LDO的壓差(輸入與輸出電壓的差值)僅幾百mV,則在高壓直流穩壓電源的輸出略高于LDO幾百mV就可以輸出標準電壓了,并且其損耗也不大。</span></p><p><span style="font-size: 16px;">7 增加有源EMI濾波器及有源輸出紋波衰減器</span></p><p><span style="font-size: 16px;">有源EMI濾波器可在150kHz~30MHz間衰減共模和差模噪聲,并且對衰減低頻噪聲特別有效。在250kHz時(shí),可衰減60dB共模噪聲及80dB差模噪聲,在滿(mǎn)載時(shí)效率可達99%。</span></p><p><span style="font-size: 16px;">輸出紋波衰減器可在1~500kHz范圍內減低電源輸出紋波和噪聲30dB以上,并且能改善動(dòng)態(tài)響應及減小輸出電容。</span></p><p><span style="font-size: 16px;">很多人在測試紋波和噪聲時(shí)往往會(huì )出現上百mv,或者幾百mv,遠遠比說(shuō)明書(shū)提供的紋波值大很多,這主要是測試方法不正確造成的。造成對紋波測試的幾點(diǎn)誤區。</span></p><p><span style="font-size: 16px;">誤區一:測試帶寬的選擇,帶寬越大測試越準確</span></p><p><span style="font-size: 16px;">這種認為是不正確的。輸出紋波的頻率和電源的開(kāi)關(guān)頻率相同,而開(kāi)關(guān)頻率目前一般從幾十KHZ到幾MHZ,另外由開(kāi)關(guān)器件所造成的干擾也小于20MHZ,帶寬限制在20MHZ,也是避免外界的高頻噪聲影響紋波的測試。一般情況下,模塊使用說(shuō)明書(shū)都會(huì )提到該模塊在測試紋波時(shí)所選用的示波器測試帶寬。通常沒(méi)有特殊說(shuō)明,紋波測試的帶寬一般設定為20MHZ。目前市面上的示波器都有20MHZ帶寬限制功能。</span></p><p><span style="font-size: 16px;">誤區二:測試方法的選擇</span></p><p><span style="font-size: 16px;">測試方法的選擇在目前是存在較大爭議的,同一個(gè)模塊采用不同的測試方法會(huì )得到不同的結果。目前行業(yè)內普遍流行的有靠測法、雙絞線(xiàn)法、平行線(xiàn)法、50歐同軸電纜測試四種方法,其目的只有一個(gè),就是真實(shí)客觀(guān)的測試模塊的輸出紋波。而用戶(hù)在使用中因為種種客觀(guān)因素一般采用的是甩線(xiàn)法,就是拿示波器探頭、地線(xiàn)夾直接接在模塊的輸出管腳測試,這種方法不能說(shuō)不正確,但會(huì )對測試結果帶來(lái)很大的不同,一般可達到上百或者幾百毫伏的紋波。&nbsp;</span></p><p><span style="font-size: 16px;">示波器探頭的地線(xiàn)長(cháng)度約13cm,自身電感約為80nH,共模電流會(huì )在地線(xiàn)夾子上產(chǎn)生一定量不可忽略的尖峰電壓。在實(shí)際測試時(shí),地線(xiàn)夾通常會(huì )以環(huán)形出現,所以很容易接收到空間輻射。測試端子和地線(xiàn)夾構成的環(huán)路就像天線(xiàn)一樣在工作,地線(xiàn)環(huán)的面積越大,開(kāi)關(guān)過(guò)程中獲取的噪聲就越大,影響到紋波的正確測試。為減小地線(xiàn)夾過(guò)長(cháng)所造成的影響,探頭應該直接靠在輸出管腳兩端,這樣信號和地相連處的地線(xiàn)環(huán)面積就很小了,這就是靠測法。測試時(shí)去掉示波器探頭的地線(xiàn)夾和探頭帽子,直接靠在輸出管腳上進(jìn)行測試,如果輸出管腳間距稍大,示波器探頭不能直接靠上,可以用自制地線(xiàn)環(huán)進(jìn)行測試,如下圖所示。</span></p><p><img src="http:///zb_users/upload/2020/02/202002101581321696750555.png" style="width: 400px; height: 152px;" title="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?" width="400" height="152" border="0" vspace="0" alt="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?"/></p><p><img src="http:///zb_users/upload/2020/02/202002101581321696580550.jpg" style="width: 400px; height: 175px;" title="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?" width="400" height="175" border="0" vspace="0" alt="作為高壓直流穩壓電源電路設計工程師的你分得清什么是諧波、紋波、噪聲?"/></p><p><span style="font-size: 16px;">(左)使用地線(xiàn)夾直接測試 (右)采用靠測法測試</span></p><p><span style="font-size: 16px;">對于一些需要低紋波輸出的特定場(chǎng)合,需要采取特定的設計方案,采用甩線(xiàn)法測試也能得到比較小的紋波。西安偉京電子制造有限公司推出了兩款輸入16VDC—40VDC,輸出5VDC、12VDC、15VDC、±5VDC、±12VDC、±15VDC 六種輸出電壓,輸出功率15W,內置輸入濾波器輸出低紋波的高可靠軍用電源模塊,一種采用全金屬氣密性封裝,一種采用優(yōu)良導熱灌封膠的五面體金屬結構,兩種模塊采用甩線(xiàn)法測試20MHZ帶寬,紋波在20—50mv,并且該模塊不用外加濾波器可以通過(guò)GJB151-97中CE102的要求。</span></p><p><span style="color: #FF0000;"><strong><span style="font-size: 16px;">關(guān)于測試帶寬高壓直流穩壓電源電路設計工程師的問(wèn)答</span></strong></span></p><p><span style="font-size: 16px;">高壓直流穩壓電源電路設計工程師疑問(wèn)</span></p><p><span style="font-size: 16px;">測試電源紋波和噪聲的時(shí)候,選擇20MHZ的帶寬是為了測試電源自身是否滿(mǎn)足要求,對于電源這種低頻信號而言,20MHZ帶寬已經(jīng)足夠了。有一疑問(wèn):為什么不在示波器上選擇全帶寬?選擇全帶寬是怕受到高頻信號的干擾,而無(wú)法測試出電源本身的問(wèn)題?但是電源對于電路板而言很重要,如果高頻信號也對此有大的干擾,那么電路板就不能正常工作,是不是也應當測試高頻信號對電源的干擾?</span></p><p><span style="font-size: 16px;">我個(gè)人認為,為了準確的測量電源紋波信號,就需要把直流以上的噪聲完全測試出來(lái),所以不進(jìn)行帶寬限制是最好的,不知道我這個(gè)觀(guān)點(diǎn)是否正確?我的問(wèn)題的出發(fā)點(diǎn)就是想盡量準確的把IC端電源噪聲測量出來(lái)。如果來(lái)一個(gè)20M的 帶寬限制,其測試到的結果明顯偏小,就反應不了真實(shí)的情況。此時(shí),很有可能隨著(zhù)IC的門(mén)電路的翻轉,電源上有20M以上,且幅度比較大的噪聲存在,這個(gè)噪聲有可能使IC的輸出特性變差。如果我測不到這個(gè)噪聲,我就可能無(wú)法找出合適的電容來(lái)把這個(gè)噪聲濾掉,從而不能解決電源噪聲引起的問(wèn)題。不知我的這個(gè)理解是否正確?</span></p><p><span style="font-size: 16px; color: #00B0F0;">高壓直流穩壓電源電路設計工程師1</span></p><p><span style="font-size: 16px;">選擇20M的目的只是要將紋波測試出來(lái),這個(gè)是電源的指標。但是對于單板來(lái)講,測試電壓的紋波還是需要使用全帶寬去測試,驗證單板電源的穩定性。</span></p><p><span style="font-size: 16px; color: #00B0F0;">高壓直流穩壓電源電路設計工程師2</span></p><p><span style="font-size: 16px;">因為電源的紋波和噪聲主要來(lái)自開(kāi)關(guān)管,而電源的開(kāi)關(guān)管工作在40多KHz,所以選擇20MHz的帶寬來(lái)測試。</span></p><p><span style="font-size: 16px; color: #00B0F0;">高壓直流穩壓電源電路設計工程師3</span></p><p><span style="font-size: 16px;">擾在電路板中主要指的是EMI問(wèn)題,從能量的角度考慮,電源的能量是最強的,它可以產(chǎn)生很強的磁場(chǎng),對其它信號的干擾最大,而高頻信號的電壓一般在700mv左右,且信號能產(chǎn)生的磁場(chǎng)很弱,相對于電源而言,對電源的影響很小,可以不計。</span></p><p><span style="font-size: 16px; color: #00B0F0;">高壓直流穩壓電源電路設計工程師4</span></p><p><span style="font-size: 16px;">對于電源紋波和噪聲,個(gè)人認為電源紋波應該使用20MHz的帶寬來(lái)測試,而測試噪聲的時(shí)候,要使用全帶寬的來(lái)測試。原因是:對于紋波來(lái)講,是電源輸出的時(shí)候,電源自身的開(kāi)關(guān)頻率引起的,而在測試的時(shí)候使用20MHz的帶寬,就是為了把高頻的噪聲去掉,為了抓到真實(shí)的紋波。而對噪聲來(lái)講,要分選取的測試點(diǎn),一般測試芯片的電源輸入的是放在芯片的接收端,在接受端測試實(shí)際的電源噪聲,一般是有一定的范圍要求的,如果超過(guò)這個(gè)要求,也是需要處理的。而在問(wèn)題中擔心高頻噪聲在電源自身有影響,這個(gè)基本不用擔心,在電源的輸出端一般都是有小的濾波電容進(jìn)行濾除高頻的噪聲,如果測試電源輸出端有很大的噪聲,建議需要處理一下,用小電容將這部分濾掉。</span></p><p><span style="font-size: 16px; color: #00B0F0;">高壓直流穩壓電源電路設計工程師5</span></p><p><span style="font-size: 16px;">要把紋波和噪聲分開(kāi)來(lái)看,紋波是由電容的充放電,PWM調解產(chǎn)生(當然,這里也有一部分低頻噪聲),一次電源的波紋還和50HZ的工頻有關(guān)。就像問(wèn)題中所說(shuō)的那樣,電源的頻率很低,20MHZ保證測出來(lái)的是電源本身的問(wèn)題,而不是高頻干擾。而在噪聲的測試中,是要求把示波器打到全帶寬的,這樣來(lái)捕獲全帶寬下高壓直流穩壓電源的噪聲。而在定義噪聲的指標時(shí),一般要考慮噪聲和直流壓降一起對后端用電芯片的影響,也就是說(shuō),噪聲要占用直流壓降的工作范圍。因此,的確要測試高頻信號對后端用電芯片的影響,而這一影響,就用噪聲來(lái)體現。以上是我對紋波噪聲的理解,里面會(huì )有一錯誤和遺漏的地方,請指出,謝謝!</span></p><p><span style="font-size: 16px; color: #00B0F0;">高壓直流穩壓電源電路設計工程師6</span></p><p><span style="font-size: 16px;">對于電源噪聲,我認為在單獨的對電源電路進(jìn)行測試時(shí),需要進(jìn)行20MHz限制,這樣可以發(fā)現電源本身有沒(méi)有問(wèn)題,整版的測試需要在電源OK的基礎上進(jìn)行。一般情況下,我們會(huì )在IC的power腳都會(huì )加0.1uF進(jìn)行退耦處理,這個(gè)處理其實(shí)就是對耦合到電源上的高頻雜波的濾除。當然,如果可以在全帶寬的情況通過(guò)spec要求,這個(gè)就更好了。其實(shí)談到0.1uF的退耦,我有個(gè)疑惑,為什么目前電路速度越來(lái)越快,但是0.1uF雷打不動(dòng)?0.1uF究竟對哪個(gè)頻段工作最有效?在整版都跑1G/2.5G甚至10G的情況下,有沒(méi)有必要將這顆電容值減???期待得到你的幫助,謝謝!</span></p><p><span style="font-size: 16px; color: #00B0F0;">高壓直流穩壓電源電路設計工程師7</span></p><p><span style="font-size: 16px;">紋波和噪聲的測試首選使用同軸電纜紋波需要選擇20M帶寬,噪聲的測試需要使用全頻帶,因為有時(shí)信號需要以電源平面作為參考面走線(xiàn),必要時(shí) 使用頻譜分析儀分析高頻噪聲的頻段。</span></p><p><span style="font-size: 16px; color: #00B0F0;">高壓直流穩壓電源電路設計工程師8</span></p><p><span style="font-size: 16px;">示波器在模擬前端和數字化過(guò)程中會(huì )存在垂直噪聲,示波器是測量?jì)x器,示波器帶寬越寬,垂直噪聲就越大,而嚴重的垂直噪聲會(huì )影響如下幾點(diǎn):&nbsp; &nbsp; &nbsp; &nbsp;</span></p><p><span style="font-size: 16px;">1.引入幅度測量誤差;&nbsp;</span></p><p><span style="font-size: 16px;">&nbsp;2.引入sin(x)/x波形重建不確定度;&nbsp;</span></p><p><span style="font-size: 16px;">3.引入作為輸入信號沿壓擺率函數的定時(shí)誤差(抖動(dòng));&nbsp; &nbsp; &nbsp;&nbsp;</span></p><p><span style="font-size: 16px;">4.造成可觀(guān)測到的不良胖波形;</span></p><p><span style="font-size: 16px;">因此,不將示波器設置成全帶寬,恰恰是避免,示波器的本底噪聲加入到電源中。&nbsp;</span></p><p><span style="font-size: 16px;">&nbsp; &nbsp; 我覺(jué)得,高頻信號不會(huì )對電源產(chǎn)生干擾,電源或者更多的是地,會(huì )是高頻信號串擾的一個(gè)載體。電路設計中,會(huì )在電源出,并上10uf、1uf并聯(lián)起來(lái)的電容,正式為了避免高頻信號通過(guò)電源串擾到電路其他地方。</span></p><p><span style="font-size: 16px; color: #00B0F0;">高壓直流穩壓電源電路設計工程師9</span></p><p><br/></p><p><span style="font-size: 16px;">一般認為5M以下為電源紋波,這個(gè)紋波主要是電源的貢獻(關(guān)于這塊,我認同問(wèn)題中說(shuō)法)。對于紋波的要求一般是1%以下;&nbsp; &nbsp; &nbsp;5M以上一般認為是噪聲,也就是問(wèn)題中說(shuō)的高頻信號,對于噪聲一般是要求3%~5%。個(gè)人認為噪聲主要是來(lái)自板上器件,這個(gè)噪聲主要還是針對電源網(wǎng)絡(luò )而言。&nbsp;</span></p><p><span style="font-size: 16px;">所以個(gè)人認為示波器設置20M測試的紋波測的是電源模塊輸出電源的質(zhì)量,而示波器的全帶寬測的是整個(gè)電源網(wǎng)絡(luò )的電源質(zhì)量,所以對電源質(zhì)量要求比較高的器件(如鎖相環(huán),A/D等)全帶寬的測試也是有必要的。</span></p><p><span style="font-size: 16px; color: #00B0F0;">高壓直流穩壓電源電路設計工程師10</span></p><p><br/></p><p><span style="font-size: 16px;">示波器測量電源紋波時(shí),因為使用接地線(xiàn)很長(cháng)的示波器探針、或者讓由探針和接地線(xiàn)形成的回路靠近功率變壓器和開(kāi)關(guān)元件等情況,使示波器耦合進(jìn)了一些高頻干擾,這是由示波器本身的原因引入的,并不是電源輸出的紋波成分,為了測量準確,所以要將對帶寬有所限制,不能選擇全帶寬。&nbsp;</span></p><p><span style="font-size: 16px;">選擇全帶寬是怕受到高頻信號的干擾,而無(wú)法測試出電源本身的問(wèn)題。&nbsp;</span></p><p><span style="font-size: 16px;">為了保證電路板和電源正常工作,根據實(shí)際情況一般要采取在電源輸出端或(和)電路板輸入端加低通濾波、關(guān)鍵部件屏蔽等措施。電源的抗干擾能力最終也是通過(guò)測量紋波和噪聲反映出來(lái)</span></p><p><span style="font-size: 16px; color: #00B0F0;">高壓直流穩壓電源電路設計工程師11</span></p><p><span style="font-size: 16px;">這個(gè)疑問(wèn)很有道理的,在我們測試中,我們知道電源板內基本都是低頻信號,&nbsp; 最高頻莫過(guò)于控制芯片的時(shí)鐘。當然不可否定電源其他干擾源的影響,這些在EMC實(shí)驗中都會(huì )做實(shí)驗的;另外,電源輸出測試,我們也測試20M帶寬、200M帶寬下信號和紋波,這我們都有標準的, 兩個(gè)帶寬下得測試只是在示波器帶寬切換而已,非常容易,測試一下,但也無(wú)妨。</span></p><p><span style="font-size: 16px; color: #00B0F0;">高壓直流穩壓電源電路設計工程師12</span></p><p><br/></p><p><span style="font-size: 16px;">關(guān)于電源(模塊電源)噪聲和紋波的測量:&nbsp;</span></p><p><span style="font-size: 16px;">測試方法是:紋波測試是采用20MHZ限制帶寬測試,時(shí)間格設置在高壓直流穩壓電源PWM頻率左右。紋波是抓高壓直流穩壓電源輸出電壓的波動(dòng)。噪聲測試必須采用全帶寬測試,要求時(shí)間格在200nS/DIV;一般是抓比開(kāi)關(guān)頻率高的雜波或者余波。&nbsp;</span></p><p><span style="font-size: 16px;">在系統板卡的模塊上一般來(lái)說(shuō),紋波影響芯片的基本性能和穩定性。噪聲影響收發(fā)數據可靠性,丟包,錯包概率。</span></p><p><span style="font-size: 16px; color: #00B0F0;">高壓直流穩壓電源電路設計工程師13</span></p><p><br/></p><p><span style="font-size: 16px;">我對這一次的問(wèn)題很感興趣,因為我在測我電路板上的高壓直流穩壓電源的時(shí)候 就發(fā)現開(kāi)關(guān)噪聲很大,這種噪聲不同于紋波,在開(kāi)關(guān)狀態(tài)變化時(shí)均會(huì )出現, 通過(guò)很多努力,均未能消除。后來(lái),采用接地環(huán)測試,也就是縮短試波器探 頭的接地線(xiàn)之后,發(fā)現測量到的開(kāi)關(guān)噪聲就減小了很多。由此判斷,我之前 測到的噪聲應該是高壓直流穩壓電源的空間干擾。后來(lái)聽(tīng)別人說(shuō),測紋波是要把示波 器的帶寬調到20MHz, 我想可能是因為,測試電源時(shí)主要是測其電路上的指 標,故使用20MHz帶寬,可濾除空間干擾。&nbsp;</span></p><p><span style="font-size: 16px;">不知道是這個(gè)原因嗎?</span></p><p><span style="font-size: 16px; color: #00B0F0;">高壓直流穩壓電源電路設計工程師14</span></p><p><span style="font-size: 16px;">關(guān)于這個(gè)問(wèn)題,我的看法是:選擇全帶寬是怕受到高頻信號的干擾,而無(wú)法測試出電源本身的問(wèn)題。但這個(gè)高頻信號是從場(chǎng)空間通過(guò)示波器探頭耦合進(jìn)去的,并不是電源自身產(chǎn)生的。所以電源供電的電路板可以正常工作,測試電源時(shí)也無(wú)須測試高頻信號對電源的干擾。但是現在有的高壓直流穩壓電源為了提高效率,單位功率等指標,將開(kāi)關(guān)頻率做得很高,如Vicor的電源好多開(kāi)關(guān)頻率都在1MHz左右,此時(shí)對電臺等對頻段敏感的應用,就需要全波段考查,否則會(huì )引起頻段混疊,電臺收發(fā)出錯。</span></p><p><span style="font-size: 16px; color: #00B0F0;">高壓直流穩壓電源電路設計工程師15</span></p><p><span style="font-size: 16px;">業(yè)界一般都是使用20MHz帶寬測量的電源模塊/DC-DC等主供電設備電源輸出噪聲的,如果測量IC管腳處的噪聲,則另當別論。電源噪聲(紋波): 噪聲包含很多種的成分(底噪,文波等),是一個(gè)籠統的說(shuō)法。紋波代表有固定頻率的波, 在電源里主要是開(kāi)關(guān)頻率對應的噪聲(紋波),故有時(shí)電源噪聲和紋波通用。一點(diǎn)個(gè)人見(jiàn)解,未必準確。</span></p><p><span style="font-size: 16px; color: #00B0F0;">高壓直流穩壓電源電路設計工程師16</span></p><p><br/></p><p><span style="font-size: 16px;">其實(shí)在實(shí)際的工程開(kāi)發(fā)測試在中,測試是更有針對性的,所以,以下觀(guān)點(diǎn)我不是很贊同。實(shí)際的測試中會(huì )包括兩部分:紋波測試機噪聲測試。而噪聲測試就是你所提到的不做帶寬限制,最大可能獲取真實(shí)情況。</span></p><p><span style="font-size: 16px; color: #00B0F0;">高壓直流穩壓電源電路設計工程師17</span></p><p><br/></p><p><span style="font-size: 16px;">您好!我前幾天在公司內組織過(guò)一次紋波測試方面的討論,感覺(jué)精確的測量紋波對操作者的要求比較高,需要考慮的因素很多,導致測試的一致性較差。同樣的一個(gè)電路,換個(gè)人測,結果偏差就會(huì )較大,花了很大力氣測出來(lái)的結果卻不能讓人信服!&nbsp;</span></p><p><span style="font-size: 16px;">我想問(wèn)個(gè)問(wèn)題,網(wǎng)上有人提到日本的一個(gè)紋波測量標準 JEITA-RC9131A,它的適用性怎么樣?謝謝!</span></p><p><span style="font-size: 16px; color: #00B0F0;">高壓直流穩壓電源電路設計工程師18</span><span style="font-size: 16px;">(來(lái)自三星)</span></p><p><br/></p><p><span style="font-size: 16px;">大家知道,對于電源系統來(lái)說(shuō)(PDS),主要包括Source端(VRM) 和Sink端 (Chip)對于Source端來(lái)講,我們測試的是電源輸出的紋波,示波器選擇20MHZ的原因是在Source端有很多電源本身的Noise Source,比如說(shuō)FET,還有電感,如果用全帶寬的話(huà),幾乎大部分Noise Source都會(huì )耦合到探頭上面來(lái),這樣的話(huà)我們根本測試不到真正電源輸出紋波。&nbsp; &nbsp; 對于Sink端來(lái)講,相對就比較負責,我們不僅要考慮電源模塊本身的Noise,還要考慮PDS中的其他因素,比如Power Plane的諧振,比如其他noise(VDC之類(lèi))耦合到Power Plane,比如芯片本身的SSN等等,這個(gè)時(shí)候如果我們用20MHZ帶寬的話(huà),反而會(huì )遺漏掉很多電源NOISE,從而影響PI效果。&nbsp;</span></p><p><span style="font-size: 16px;">所以,我覺(jué)得在Power Source端,應該用20MHZ帶寬去測試,而在SINK端得PI測試,則需要全帶寬去測試(當然,也不能用太高的帶寬,從經(jīng)驗來(lái)看,1GHz~2.5GHz的示波器比較合適。</span></p><p><span style="font-size: 16px; color: #00B0F0;">高壓直流穩壓電源電路設計工程師19</span><span style="font-size: 16px;">(來(lái)自ZTE)</span></p><p><br/></p><p><span style="font-size: 16px;">對于單純的電源產(chǎn)品,20MHz已經(jīng)足夠了,這是因為電源主要的功能是輸出一個(gè)恒定的電壓,基本上是一個(gè)直流環(huán)境,過(guò)程中不會(huì )涉及到更高速的電路;對于數字電路板上的電源,我個(gè)人還是覺(jué)得高一點(diǎn)帶寬比較好。我們可以從設計角度想一下,隨著(zhù)用電器件內驅動(dòng)、接收開(kāi)關(guān)變化,電源網(wǎng)絡(luò )上的電流也會(huì )隨之變化,電流的變化也引起了電壓的波動(dòng),這一部分的噪聲占電源噪聲的很大比重。為了抑制這種噪聲,我們會(huì )在電源網(wǎng)絡(luò )上放置一定規格、數量的去耦電容,來(lái)保證這個(gè)電源網(wǎng)絡(luò )的阻抗在有效頻率內是低于目標阻抗的,從而確保電源噪聲是滿(mǎn)足要求的,這個(gè)要求是兩維的。對應的,電源噪聲也應該是兩維的:噪聲大小和有效頻率。這個(gè)有效頻率設置到多大沒(méi)有定論,但是目前主流的數字電路板上去耦一般會(huì )設計到百兆數量級,我個(gè)人覺(jué)得數字電路板上的電源噪聲測試帶寬應該是與此一個(gè)數量級。</span></p><p><span style="font-size: 16px; color: #00B0F0;">高壓直流穩壓電源電路設計工程師20</span><span style="font-size: 16px;">(來(lái)自ZTE)</span></p><p><br/></p><p><span style="font-size: 16px;">看了郵件,覺(jué)得電源噪聲說(shuō)法太籠統,看文章的內容,題目應該是:PDN的?I噪聲測量。有兩層含義:其一,測試點(diǎn)在非理想電源地平面上,非電源模塊側;其二,噪聲來(lái)源應該是IC的開(kāi)關(guān)造成的。 要把評價(jià)電源模塊噪聲特性與評價(jià)PDN的概念區分開(kāi)來(lái)。&nbsp;</span></p><p><span style="font-size: 16px;">電源噪聲/電源紋波的說(shuō)法容易產(chǎn)生歧義,電源工程師關(guān)心的是電源模塊本身的噪聲與紋波指標,SI/PI工程師更關(guān)注PDN(電源分配網(wǎng)絡(luò ))的噪聲指標,這個(gè)噪聲是由于IC的開(kāi)關(guān)造成的,業(yè)界也稱(chēng)為?I噪聲,有個(gè)經(jīng)典的公式說(shuō)明PDN的噪聲來(lái)源:其一是dI,其二是供電回路電感L(在回路非理想時(shí),阻抗不為零,電感是一定有的),PI設計就是盡可能控制這個(gè)L。&nbsp;&nbsp;</span></p><p><span style="font-size: 16px;">PDN的測試結果應該是含高壓直流穩壓電源模塊噪聲的,高壓直流穩壓電源本身的噪聲在頻域和?I噪聲是可以區分開(kāi)來(lái)的。</span></p>Mon, 10 Feb 2020 15:47:41 +0800高頻開(kāi)關(guān)電源這二十多個(gè)指標你都了解嗎?http:///hangyexinwen/578.html<p>高頻開(kāi)關(guān)電源并不是一個(gè)簡(jiǎn)單的小盒子,它相當于有源器件的心臟,源源不斷的向元器件提供能量。 高頻開(kāi)關(guān)電源的好壞,直接影響到元器件的性能。高頻開(kāi)關(guān)電源的設計、制造及品質(zhì)管理等測試需要精密的電子儀器設備來(lái)模擬高頻開(kāi)關(guān)電源供應器實(shí)際工作時(shí)之各項特性(亦即為各項規格),并驗證通過(guò)后才能投入使用。</p><p>工程師在設計或者測評高頻開(kāi)關(guān)電源時(shí)須知考慮以下要素:</p><p><img src="http:///zb_users/upload/2020/02/202002101581320597878512.jpg" title="高頻開(kāi)關(guān)電源這二十多個(gè)指標你都了解嗎?" alt="高頻開(kāi)關(guān)電源這二十多個(gè)指標你都了解嗎?" width="400" height="196" border="0" vspace="0" style="width: 400px; height: 196px;"/></p><p>一. 描述輸入電壓影響輸出電壓幾個(gè)指標形式</p><p>  1. 絕對穩壓系數</p><p>  A.絕對穩壓系數:表示負載不變時(shí),穩壓高頻開(kāi)關(guān)電源輸出直流變化量△U0與輸入電網(wǎng)變化量△Ui之比。即:K=△U0/△Ui。</p><p>  B. 相對穩壓系數:表示負載不變時(shí),穩壓器輸出直流電壓△Uo的相對變化量△Uo與輸出電網(wǎng) Ui 的相對變化量Ui之比。即:S=△Uo/Uo /△Ui/Ui。</p><p>  2. 電網(wǎng)調整率</p><p>它表示輸入電網(wǎng)電壓由額定值變化±10%時(shí),穩壓高頻開(kāi)關(guān)電源輸出電壓的相對變化量,有時(shí)也以絕對值表示。</p><p>  3. 電壓穩定度</p><p>  負載電流保持為額定范圍內的任何值,輸入電壓在規定的范圍內變化所引起的輸出電壓相對變化△Uo/Uo百分值),稱(chēng)為穩壓器的電壓穩定度。</p><p>二. 負載對輸出電壓影響的幾種指標形式</p><p><br/></p><p>1. 負載調整率(也稱(chēng)電流調整率)</p><p>  在額定電網(wǎng)電壓下,負載電流從零變化到最大時(shí),輸出電壓的最大相對變化量,常用百分數表示,有時(shí)也用絕對變化量表示。</p><p>  2. 輸出電阻(也稱(chēng)等效內阻或內阻)</p><p>  在額定電網(wǎng)電壓下,由于負載電流變化△IL引起輸出電壓變化△Uo,則輸出電阻為Ro=|△Uo/△IL| 歐。</p><p>三. 紋波電壓的幾個(gè)指標形式</p><p>  1. 最大紋波電壓</p><p>  在額定輸出電壓和負載電流下,輸出電壓的紋波(包括噪聲)的絕對值的大小,通常以峰峰值或有效值表示。</p><p>  2. 紋波系數 Y(%)</p><p>  在額定負載電流下,輸出紋波電壓的有效值Urms與輸出直流電壓 Uo 之比,即y=Umrs/Uo x100%</p><p>  3. 紋波電壓抑制比</p><p>  在規定的紋波頻率(例如 50Hz)下,輸出電壓中的紋波電壓 Ui~與輸出電壓中的紋波電壓 Uo~之比,即:紋波電壓抑制比=Ui~/Uo~ 。</p><p>   這里聲明一下:噪聲不同于紋波。紋波是出現在輸出端子間的一種與輸入頻率和開(kāi)關(guān)頻率同步的成分,用峰-峰(peak to peak)值表示,一般在輸出電壓的 0.5%以下;噪聲是出現在輸出端子間的紋波以外的一種高頻成分,也用峰-峰(peak to peak)值表示,一般在輸出電壓的 1%左右。紋波噪聲是二者的合成,用峰-峰(peak to peak)值表示,一般在輸出電壓的 2%以下。</p><p>四. 沖擊電流</p><p>  沖擊電流是指輸入電壓按規定時(shí)間間隔接通或斷開(kāi)時(shí),輸入電流達到穩定狀態(tài)前所通過(guò)的最大瞬間電流。一般是 20A——30A。</p><p>五. 過(guò)流保護</p><p>  過(guò)流保護是一種高頻開(kāi)關(guān)電源負載保護功能,以避免發(fā)生包括輸出端子上的短路在內的過(guò)負載輸出電流對高頻開(kāi)關(guān)電源和負載的損壞。過(guò)流的給定值一般是額定電流的 110%——130%。</p><p>六. 過(guò)壓保護</p><p>  過(guò)壓保護是一種對端子間過(guò)大電壓進(jìn)行負載保護的功能。一般規定為輸出電壓的 130%——150%。</p><p>七. 輸出欠壓保護</p><p>  當輸出電壓在標準值以下時(shí),檢測輸出電壓下降或為保護負載及防止誤操作而停止高頻開(kāi)關(guān)電源并發(fā)出報警信號,多為輸出電壓的 80%——30%左右。</p><p>八. 過(guò)熱保護</p><p>  在高頻開(kāi)關(guān)電源內部發(fā)生異?;蛞蚴褂貌划敹垢哳l開(kāi)關(guān)電源溫升超標時(shí)停止高頻開(kāi)關(guān)電源的工作并發(fā)出報警信號。</p><p>九. 溫度漂移和溫度系數</p><p>  溫度漂移:環(huán)境溫度的變化影響元器件的參數的變化,從而引起穩壓器輸出電壓變化。常用溫度系數表示溫度漂移的大小。</p><p>  絕對溫度系數:溫度變化1攝氏度引起輸出電壓值的變化△UoT,單位是 V/℃或毫伏每攝氏度。</p><p>  相對溫度系數:溫度變化 1 攝氏度引起輸出電壓相對變化△UoT/Uo,單位是 V/℃。</p><p>十. 漂移</p><p>  穩壓器在輸入電壓、負載電流和環(huán)境溫度保持一定的情況下,元件參數的穩定性也會(huì )造成輸出電壓的變化,慢變化叫漂移,快變化叫噪聲,介于兩者之間叫起伏。</p><p>  表示漂移的方法有兩種:</p><p>  1. 在指定的時(shí)間內輸出電壓值的變化△Uot。</p><p>  2. 在指定時(shí)間內輸出電壓的相對變化△Uot/Uo。</p><p>  考察漂移的時(shí)間可以定為 1 分鐘、10 分鐘、1 小時(shí)、8 小時(shí)或更長(cháng)。只在精度較高的穩壓器中,才有溫度系數和溫漂兩項指標。</p><p>十一. 響應時(shí)間</p><p>  響應時(shí)間是指負載電流突然變化時(shí),穩壓器的輸出電壓從開(kāi)始變化到達新的穩定值的一段調整時(shí)間。在直流穩壓器中,則是用在矩形波負載電流時(shí)的輸出電壓波形來(lái)表示這個(gè)特性,稱(chēng)為過(guò)度特。</p><p>十二. 失真</p><p>  失真這是交流穩壓器特有的。是指輸出波形不是正 波形,產(chǎn)生波形畸變,稱(chēng)為畸變。</p><p>十三. 噪聲</p><p>  按30Hz——18kHZ 的可聽(tīng)頻率規定,這對高頻開(kāi)關(guān)電源的轉換頻率不成問(wèn)題,但對帶風(fēng)扇的高頻開(kāi)關(guān)電源要根據需要加以規定。</p><p><br/></p><p>十四. 輸入噪聲</p><p>  為使高頻開(kāi)關(guān)電源工作保持正常狀態(tài),要根據額定輸入條件,按由允許輸入外并疊加于工業(yè)用頻率的脈沖狀電壓(0——peak)制定輸入噪聲指標。一般外加脈沖寬度為 100——800us,外加電壓 1000V。</p><p>十五. 浪涌</p><p>  這是在輸入電壓,以 1 分鐘以上的間隔按規定次數加一種浪涌電壓,以避免發(fā)生絕緣破壞、閃絡(luò )、電弧等異?,F象。通信設備等規定的數值為數千伏,一般為 1200V。</p><p>十六. 靜電噪聲</p><p>  指在額定輸入條件下,外加到高頻開(kāi)關(guān)電源框體的任意部分時(shí),全輸出電路能保持正常工作狀態(tài)的一種重復脈沖狀的靜電。一般保證 5——10KV 以?xún)取?lt;/p><p>十七. 穩定度</p><p>  允許使用條件下,輸出電壓最大相對變化△Uo/Uo。</p><p>十八. 電氣安全要求(GB 4943-90)</p><p>  1. 高頻開(kāi)關(guān)電源結構的安全要求</p><p>  1) 空間要求</p><p>   UL、CSA、VDE 安全規范強調了在帶電部分之間和帶電部分與非帶電金屬部分之間的表面、空間的距離要求。UL、CSA要求:極間電壓大于等于 250VAC 的高壓導體之間,以及高壓導體與非帶電金屬部分之間(這里不包括導線(xiàn)間),無(wú)論在表面間還是在空間,均應有 0.1 英寸的距離;VDE 要求交流線(xiàn)之間有 3mm 的徐變或 2mm 的凈空隙;IEC 要求:交流線(xiàn)間有 3mm 的凈空間隙及在交流線(xiàn)與接地導體間的 4mm 的凈空間隙。另外,VDE、IEC要求在高頻開(kāi)關(guān)電源的輸出和輸入之間,至少有 8mm 的空間間距。</p><p>  2) 電介質(zhì)實(shí)驗測試方法(打高壓:輸入與輸出、輸入和地、輸入 AC 兩級之間)</p><p>  3) 漏電流測量</p><p>   漏電流是流經(jīng)輸入側地線(xiàn)的電流,在高頻開(kāi)關(guān)電源中主要是通過(guò)靜噪濾波器的旁路電容器泄露電流。UL、CSA 均要求暴露的不帶電的金屬部分均應與大地相接,漏電流測量是通過(guò)將這些部分與大地之間接一個(gè) 1.5K 歐的電阻,其漏電流應該不大于 5 毫安。VDE 允許:用 1.5K 歐的電阻與 150nP 電容并接。并施加 1.06倍額定使用電壓,對數據處理設備,漏電流應不大于 3.5 毫安。一般是 1 毫安左右。</p><p>  4) 絕緣電阻測試</p><p>  VDE 要求:輸入和低電壓輸出電路之間應有 7M 歐的電阻,在可接觸到的金屬部分和輸入之間,應有 2M 歐的電阻或加 500V 直流電壓持續 1 分鐘。</p><p>  5) 印制電路板要求</p><p>  要求是 UL 認證的 94V-2 材料或比此更好的材料。</p><p>  2. 對高頻開(kāi)關(guān)電源變壓器結構的安全要求</p><p>  1) 變壓器的絕緣</p><p>  變壓器的繞組使用的銅線(xiàn)應為漆包線(xiàn),其他金屬部分應涂有瓷、漆等絕緣物質(zhì)。</p><p>  2) 變壓器的介電強度</p><p>  在實(shí)驗中不應出現絕緣層破裂和飛弧現象。</p><p>  3) 變壓器的絕緣電阻</p><p>  變壓器繞組間的絕緣電阻至少為 10M 歐,在繞組與磁心、骨架、屏蔽層間施加 500 伏直流電壓,持續 1 分鐘,不應出現擊穿、飛弧現象。</p><p>  4) 變壓器濕度電阻</p><p>   變壓器必須在放置于潮濕的環(huán)境之后,立即進(jìn)行絕緣電阻和介電強度實(shí)驗,并滿(mǎn)足要求。潮濕環(huán)境一般是:相對濕度為 92%(公差為 2%),溫度穩定在 20 到 30 攝氏度之間,誤差允許 1%,需在內放置至少 48 小時(shí)之后,立即進(jìn)行上述實(shí)驗。此時(shí)變壓器的本身溫度不應該較進(jìn)入潮濕環(huán)境之前測試高出 4 攝氏度。</p><p>  5) VDE 關(guān)于變壓器溫度特性的要求</p><p>  6) UL、CSA 關(guān)于變壓器溫度特性的要求。</p><p>  注:IEC——International ElectrotechnICal Commission</p><p>  VDE——Verbandes Deutcher ElectrotechnICer</p><p>  UL——Underwriters’ Laboratories</p><p>  CSA——CANadian Standards Association</p><p>  FCC—— Federal CommunICations Commission</p><p>十九. 無(wú)線(xiàn)電騷擾(按照 GB 9254-1998 測試)</p><p>  1. 高頻開(kāi)關(guān)電源端子騷擾電壓限值</p><p>  2. 輻射騷擾限值</p><p>二十.電磁兼容性試驗</p><p>  電磁兼容性試驗(electromagnetIC compatiblity EMC)</p><p>  電磁兼容性是指設備或系統在共同的電磁環(huán)境中能正常工作且不對該環(huán)境中 任何事物構成不能承受的電磁干擾的能力。</p><p>   電磁干擾波一般有兩種傳播途徑,要按各個(gè)途徑進(jìn)行評價(jià)。一種是以波長(cháng)長(cháng)的頻帶向高頻開(kāi)關(guān)電源線(xiàn)傳播,給發(fā)射區以干擾的途徑,一般在 30MHz 以下。這種波長(cháng)長(cháng)的頻率在附屬于電子設備的高頻開(kāi)關(guān)電源線(xiàn)的長(cháng)度范圍內還不滿(mǎn) 1 個(gè)波長(cháng),其輻射到空間的量也很少,由此可掌握發(fā)生于高頻開(kāi)關(guān)電源線(xiàn)上的電壓,進(jìn)而可充分評估干擾的大小,這種噪聲叫做傳導噪聲。</p><p>  當頻率達到 30MHz 以上,波長(cháng)也會(huì )隨之變短。這時(shí)如果只對發(fā)生于高頻開(kāi)關(guān)電源線(xiàn)的噪聲源電壓進(jìn)行評價(jià),就與實(shí)際干擾不符。因此,采用了通過(guò)直接測定傳播到空間的干擾波評價(jià)噪聲大小的 方法,該噪聲就叫做輻射噪聲。測定輻射噪聲的方法有上述按電場(chǎng)強度對傳播空間的干擾波進(jìn)行直接測定的方法和測定泄露到高頻開(kāi)關(guān)電源線(xiàn)上的功率的方法。</p><p>  電磁兼容性試驗包括以下試驗:</p><p> ?、?磁場(chǎng)敏感度:(抗擾性)設備、分系統或系統暴露在電磁輻射下的不希望有的響應程度。敏感度電平越小,敏感性越高,抗擾性越差。固定頻率、峰峰值的磁場(chǎng)</p><p> ?、?靜電放電敏感度:具有不同靜電電位的物體相互靠近或直接接觸引起的電荷轉移。300PF 電容充電到-15000V,通過(guò) 500 歐電阻放電??沙?,但放完后要正常。數據傳遞、儲存,不能丟</p><p> ?、?高頻開(kāi)關(guān)電源瞬態(tài)敏感度:包括尖峰信號敏感度(0.5us 10us 2 倍)、電壓瞬態(tài)敏感度(10%-30%,30S 恢復)、頻率瞬態(tài)敏感度(5%-10%,30S 恢復)。</p><p> ?、?輻射敏感度:對造成設備降級的輻射干擾場(chǎng)的度量。(14K-1GHz,電場(chǎng)強度為 1V/M)</p><p> ?、?傳導敏感度:當引起設備不希望有的響應或造成其性能降級時(shí),對在高頻開(kāi)關(guān)電源、控制或信號線(xiàn)上的干擾信號或電壓的度量。(30Hz-50KHZ 3V ,50K-400M 1V)</p><p> ?、?非工作狀態(tài)磁場(chǎng)干擾:包裝箱 4.6m 磁通密度小于 0.525uT,0.9m 0.525Ut。</p><p> ?、?工作狀態(tài)磁場(chǎng)干擾:上、下、左、右交流磁通密度小于 0.5mT。</p><p> ?、?傳導干擾:沿著(zhù)導體傳播的干擾。10KHz-30MHz 60(48)dBuV。</p><p> ?、?輻射干擾:通過(guò)空間以電磁波形式傳播的電磁干擾。10KHz-1000MHz 30 屏蔽室60(54)uV/m。</p><p>二十一.環(huán)境實(shí)驗</p><p>   環(huán)境試驗是將產(chǎn)品或材料暴露到自然或人工環(huán)境中,從而對它們在實(shí)際上可能遇到的貯存、運輸和使用條件下的性能作出評價(jià)。包括低溫、 高溫、恒定濕熱、交變濕熱、 沖撞(沖擊和碰撞)、振動(dòng)、恒加速、貯存、長(cháng)霉、腐蝕大氣(例如鹽霧)、砂塵、空氣壓力(高壓或低壓)、溫度變化、可燃性、密封、水、輻射(太陽(yáng)或核)、 錫焊、接端強度、噪聲(微打65DB)等。</p><p><br/></p>Mon, 10 Feb 2020 15:42:39 +0800作為大功率直流電源電路設計工程師知道電阻的噪聲嗎?http:///hangyexinwen/577.html<p>電阻器的固有噪聲,是指其自身產(chǎn)生的噪聲,包括熱噪聲和過(guò)剩噪聲。<br/></p><p>熱噪聲</p><p>電阻器的熱噪聲電壓可以表示為:</p><p><img src="http:///zb_users/upload/2020/02/202002101581320348710680.png" title="作為大功率直流電源電路設計工程師知道電阻的噪聲嗎?" alt="作為大功率直流電源電路設計工程師知道電阻的噪聲嗎?" width="400" height="60" border="0" vspace="0" style="width: 400px; height: 60px;"/></p><p>R是電阻,T是絕對溫度,B是頻率帶寬,k是玻爾茲曼常數。在一定的溫度和阻值之下,就產(chǎn)生了熱噪聲。</p><p>熱噪聲屬于電阻器的本征噪聲,無(wú)法避免也無(wú)法消除。</p><p>電阻的戴維寧噪聲模型由噪聲電壓源和純電阻構成,如圖1所示。</p><p><img src="http:///zb_users/upload/2020/02/202002101581320363884132.jpg" title="作為大功率直流電源電路設計工程師知道電阻的噪聲嗎?" alt="作為大功率直流電源電路設計工程師知道電阻的噪聲嗎?" width="400" height="298" border="0" vspace="0" style="width: 400px; height: 298px;"/></p><p>&nbsp;</p><p>噪聲電壓大小與電阻阻值,帶寬和溫度(開(kāi)爾文)的平方根成比例關(guān)系。大功率直流電源電路設計工程師通常會(huì )量化其每1Hz帶寬內的噪聲,也就是其頻譜密度。電阻噪聲在理論上是一種“白噪聲”,即噪聲大小在帶寬內是均等的,在每個(gè)相同帶寬內的噪聲都是相同的。</p><p><br/></p><p>總噪聲等于每個(gè)噪聲的平方和再開(kāi)平方。大功率直流電源電路設計工程師常常提到的頻譜密度的單位是 V/root-Hz 。對于1Hz帶寬,這個(gè)數值就等于噪聲大小。對于白噪聲,頻譜密度與帶寬開(kāi)方后的數值相乘,可以計算出帶寬內總白噪聲的大小。為了測量和量化總噪聲,需要限制帶寬。如果不知道截止頻率,就不知道應該積分到多寬的頻帶。</p><p><img src="http:///zb_users/upload/2020/02/202002101581320391723341.jpg" title="作為大功率直流電源電路設計工程師知道電阻的噪聲嗎?" alt="作為大功率直流電源電路設計工程師知道電阻的噪聲嗎?" width="400" height="157" border="0" vspace="0" style="width: 400px; height: 157px;"/></p><p>大功率直流電源電路設計工程師都知道頻譜圖是以頻率的對數為x軸的伯德圖。在伯德圖上,同樣寬度右側的帶寬比左側要大得多。從總噪聲來(lái)看,伯德圖的右側或許比左側更重要。</p><p><br/></p><p>電阻噪聲服從高斯分布,高斯分布是描述振幅分布的概率密度函數。服從高斯分布是因為電阻噪聲是由大量的小的隨機事件產(chǎn)生的。中央極限定理解釋了它是如何形成高斯分布的。交流噪聲的均方根電壓幅值等于高斯分布在±1σ范圍內分布的振幅。對于均方根電壓為1V的噪聲,瞬時(shí)電壓在±1V范圍內的概率為68% (±1σ) 。人們常常認為白噪聲和高斯分布之間有某種關(guān)聯(lián),事實(shí)上它們沒(méi)有關(guān)聯(lián)。比如,濾波電阻的噪聲,不是白噪聲但仍然服從高斯分布。二進(jìn)制噪聲不服從高斯分布,但卻是白噪聲。電阻噪聲既是白噪聲也同時(shí)服從高斯分布。</p><p><img src="http:///zb_users/upload/2020/02/202002101581320410154334.jpg" title="作為大功率直流電源電路設計工程師知道電阻的噪聲嗎?" alt="作為大功率直流電源電路設計工程師知道電阻的噪聲嗎?" width="400" height="184" border="0" vspace="0" style="width: 400px; height: 184px;"/></p><p>純理論研究者會(huì )認為高斯噪聲并沒(méi)有定義峰峰值,而它是無(wú)窮的。這是對的,高斯分布曲線(xiàn)兩側是無(wú)限伸展的,因此任何電壓峰值都是有可能的。實(shí)際中,很少有電壓尖峰超過(guò)±3倍的均方根電壓值。許多人用6倍的均方根電壓值來(lái)近似峰峰值的大小。為了留有足夠的裕度,甚至可以用8倍的均方根電壓值來(lái)近似峰峰值的大小。</p><p><br/></p><p>一個(gè)有趣的問(wèn)題是,兩個(gè)電阻串聯(lián)的噪聲之和等于這兩個(gè)電阻和的噪聲。相似的,兩個(gè)電阻并聯(lián)的噪聲之和等于這兩個(gè)電阻并聯(lián)后電阻的噪聲。如果不是這樣,那么在串聯(lián)或者并聯(lián)電阻時(shí)就會(huì )出問(wèn)題。還好它確實(shí)是這樣的。</p><p><br/></p><p>一個(gè)高阻值電阻不會(huì )因為自身噪聲電壓而產(chǎn)生電弧和火花。電阻的寄生電容并聯(lián)在電阻兩端,將限制其帶寬和端電壓。相似的,你可以想象絕緣體上產(chǎn)生的高噪聲電壓也會(huì )被其寄生電容和周?chē)膶w分流。</p><p><br/></p><p>過(guò)剩噪聲</p><p>實(shí)際電阻的固有噪聲往往遠大于熱噪聲,超過(guò)熱噪聲幅度的噪聲稱(chēng)為過(guò)剩噪聲。與熱噪聲不同,過(guò)剩噪聲來(lái)源于電阻內部結構不連續性和非完整性,與電阻類(lèi)型有非常大的關(guān)系。</p><p>線(xiàn)繞電阻內部為體金屬,不連續性很小,是過(guò)剩噪聲最小的電阻;</p><p>合成材料的電阻內部結構不連續,是過(guò)剩噪聲最大電阻;</p><p>固有噪聲:線(xiàn)繞&nbsp; &nbsp;優(yōu)于&nbsp; &nbsp;金屬氧化膜&nbsp; &nbsp; 優(yōu)于&nbsp; &nbsp;金屬膜&nbsp; &nbsp;優(yōu)于&nbsp; 碳膜&nbsp; &nbsp;優(yōu)于&nbsp; 玻璃釉&nbsp; &nbsp;優(yōu)于&nbsp; &nbsp;合成膜&nbsp; &nbsp;優(yōu)于&nbsp; &nbsp;合成實(shí)心</p>Mon, 10 Feb 2020 15:33:16 +0800高壓直流穩壓電源內部元器件結構如何?http:///hangyexinwen/576.html<p>高壓直流穩壓電源不像處理器,可以看規格知性能;高壓直流穩壓電源也不像顯卡,由一顆關(guān)鍵的GPU來(lái)決定檔次。一款好的高壓直流穩壓電源除了滿(mǎn)足功率需求以外,還必須考量穩定、節能、靜音、安全等多方面的因素。在沒(méi)有專(zhuān)業(yè)設備進(jìn)行檢測的情況下,我們只有了解一些高壓直流穩壓電源的基本原理和元器件知識,才能做到對高壓直流穩壓電源“一目了然”。</p><p><br/></p><p>抓住關(guān)鍵,不再眼暈</p><p><br/></p><p>從外面看起來(lái),高壓直流穩壓電源的個(gè)頭也就比一塊“板磚”大一點(diǎn),但它“肚子”里裝的東西可著(zhù)實(shí)不少。拆開(kāi)外殼,我們能看到數以百計的、各式各樣的電子元器件和復雜交錯的線(xiàn)纜,不免讓人眼暈。俗話(huà)說(shuō)“擒賊先擒王”,在觀(guān)察高壓直流穩壓電源時(shí),我們也應該著(zhù)重留意以下幾個(gè)部分。</p><p><br/></p><p>某高壓直流穩壓電源的內部結構圖,序號1~6分別標識出了大家應該著(zhù)重觀(guān)察的部分。</p><p><br/></p><p>一、二級EMI濾波電路。這部分的作用是將外部電網(wǎng)進(jìn)入的市電進(jìn)行過(guò)濾,得到比較純凈的交流電供后續使用。</p><p>PFC電路。它的作用是在交流電轉換成直流電的過(guò)程中減少諧波,降低對室內電網(wǎng)和市電電網(wǎng)的干擾,減少市電損耗。</p><p>高壓濾波電容。它的作用是凈化高壓直流電,為后續的高低壓轉換提供相對“純凈”的電流。</p><p>高壓直流穩壓電源拓撲。拓撲就是指高壓直流穩壓電源的整體結構,它直接影響到高壓直流穩壓電源的轉換效率。</p><p>低壓濾波電路的電感線(xiàn)圈。其作用是穩定輸出端的電壓和電流,與電腦硬件系統的穩定使用有直接的關(guān)系。</p><p>散熱片。在變壓器和開(kāi)關(guān)電路進(jìn)行電壓轉換時(shí),會(huì )產(chǎn)生大量的熱量,因此需要散熱片迅速轉移熱量。</p><p><br/></p><p>二級EMI濾波電路</p><p><br/></p><p>國家3C認證強制要求上市的高壓直流穩壓電源必須通過(guò)EMI防電磁輻射認證,因此合格的高壓直流穩壓電源都應該具有EMI濾波電路。</p><p><br/></p><p>一級EMI濾波電路位于高壓直流穩壓電源接口處,做工更好的電路還具有獨立PCB板和電感線(xiàn)圈。</p><p><br/></p><p>二級EMI濾波電路通常在高壓直流穩壓電源的主PCB板上,由電感線(xiàn)圈和電容等元器件組成。</p><p><br/></p><p>某劣質(zhì)高壓直流穩壓電源上的二級EMI濾波電路唱了“空城計”</p><p>不過(guò)低端高壓直流穩壓電源往往只有一級EMI濾波電路,稍好一點(diǎn)的高壓直流穩壓電源都應該具有完整的一、二級EMI濾波電路。</p><p><br/></p><p>PFC電路</p><p><br/></p><p>PFC電路分為被動(dòng)式和主動(dòng)式兩種,現在大部分高壓直流穩壓電源都是采用的主動(dòng)式PFC。</p><p><img src="http:///zb_users/upload/2019/11/201911011572595306268344.png" title="高壓直流穩壓電源內部元器件結構如何?" alt="高壓直流穩壓電源內部元器件結構如何?" width="400" height="260" border="0" vspace="0" style="width: 400px; height: 260px;"/></p><p>被動(dòng)式PFC均采用這種“大個(gè)頭”的電感</p><p><br/></p><p><br/></p><p>主動(dòng)式PFC的電感線(xiàn)圈往往位于高壓濾波電容的前方</p><p><br/></p><p>被動(dòng)式PFC的功率因數普遍在0.7左右,主動(dòng)式PFC的功率因數則高達0.9以上,明顯優(yōu)于被動(dòng)式PFC。兩者的分辨也相當容易。</p><p><br/></p><p>高壓濾波電容</p><p><br/></p><p>哪些是高壓濾波電容?很簡(jiǎn)單,高壓直流穩壓電源里面最高、最大的電容即是(1~2顆)。比較電容時(shí),原則上只能與同類(lèi)型的高壓直流穩壓電源相比,因為在相同功率下,被動(dòng)式PFC高壓直流穩壓電源所需的電容容量比主動(dòng)式要大。在同級比較時(shí),我們可以看到高壓濾波電容的容量、耐壓值和耐溫值,理論上這三項數值越大越好。</p><p><br/></p><p>高壓直流穩壓電源采用主動(dòng)式PFC,因此使用容量為330μF的高壓濾波電容就能滿(mǎn)足需求。該電容的耐壓值為400V,耐溫值為85℃。</p><p><br/></p><p>高壓直流穩壓電源拓撲</p><p>簡(jiǎn)單說(shuō)來(lái),在前幾年高壓直流穩壓電源的拓撲可分為半橋式和正激式兩種,現在基本以正激式為主。半橋式是傳統的高壓直流穩壓電源結構,通常轉換效率不高;而正激式結構轉換效率容易做到80%以上。</p><p><br/></p><p>傳統的半橋式拓撲</p><p><br/></p><p>正激式拓撲有助于提高轉換效率</p><p><br/></p><p>在進(jìn)行分辨時(shí),我們不妨采用排除法:在半橋式高壓直流穩壓電源的中央,必定有三個(gè)變壓器,并且一大兩小,排成一條直線(xiàn);如果你的高壓直流穩壓電源不是這種結構,那么恭喜你,這多半是正激式高壓直流穩壓電源。</p><p><br/></p><p>低壓慮波電路的電感線(xiàn)圈</p><p><br/></p><p>在低壓濾波電路部分,我們主要看電感線(xiàn)圈的大小、匝數和顏色。自然是線(xiàn)圈越大、匝數越多越好;至于顏色,理論上從優(yōu)到劣分別為灰色、黑色、淺綠色和黃色,電感越好損耗越小。</p><p><br/></p><p>低壓濾波電路部分主要看電感線(xiàn)圈</p><p><br/></p><p>散熱片</p><p><br/></p><p>散熱片的作用不需多說(shuō),發(fā)熱量較大的開(kāi)關(guān)管和肖特基管都常常安裝在散熱片上。目前市售高壓直流穩壓電源普遍采用鋁質(zhì)散熱片,通常越厚越好;同時(shí)為了在有限的空間內擴大散熱面積,大部分散熱片都開(kāi)有鰭片,理論上鰭片越多越好。</p>Fri, 01 Nov 2019 16:01:15 +0800可程控直流穩壓電源的壽命到底是誰(shuí)來(lái)決定的?http:///hangyexinwen/575.html<p>可程控直流穩壓電源的壽命就如同人的壽命一樣是無(wú)法預知準確的年限,但是很多大數據分析報告中有平均壽命的概念??沙炭刂绷鞣€壓電源也一樣,影響其壽命的因數很多,所以一般可程控直流穩壓電源的壽命都是以平均無(wú)故障時(shí)間來(lái)衡量的</p><p><br/></p><p>可程控直流穩壓電源的壽命主要由內部元器件和PCB的使用壽命以及整個(gè)焊接和裝配的工藝確定的。在設計上要保證可程控直流穩壓電源元器件的參數選擇,在生產(chǎn)上要保證整個(gè)焊接和裝配的一致性及可操作性。這樣可以從源頭保證了可程控直流穩壓電源的穩定性和可靠性。</p><p><br/></p><p>保證可程控直流穩壓電源壽命的關(guān)鍵環(huán)節!</p><p><br/></p><p>我們要減少故障發(fā)生的可能性,來(lái)保證可程控直流穩壓電源長(cháng)期穩定的工作。那就需要把控好可程控直流穩壓電源生命周期中的兩個(gè)重要環(huán)節:可程控直流穩壓電源的研發(fā)、可程控直流穩壓電源的生產(chǎn)??沙炭刂绷鞣€壓電源研發(fā)需要保證可程控直流穩壓電源的性能滿(mǎn)足我們的規格書(shū)要求,保證在可程控直流穩壓電源正常生命周期中的可程控直流穩壓電源性能指標??沙炭刂绷鞣€壓電源模塊類(lèi)產(chǎn)品對生產(chǎn)流程及工藝管控要求很高,需要高品質(zhì)的生產(chǎn)設備及管理,才能達到預期的產(chǎn)品品質(zhì)。</p><p><br/></p><p>保證可程控直流穩壓電源壽命的關(guān)鍵物料!</p><p><br/></p><p>可程控直流穩壓電源壽命與使用元器件之間也滿(mǎn)足木桶效應,必須所有器件壽命都達到規定壽命才能保證可程控直流穩壓電源的最終使用壽命。一般關(guān)鍵器件受到的電應力大,發(fā)熱量高,機器內部溫度上升快,溫度對器件壽命影響較大,所以對器件的壽命最終評估尤為重要。那么我們可程控直流穩壓電源里有哪些關(guān)鍵器件需要尤為關(guān)注呢?</p><p><br/></p><p>1. 電解電容器</p><p><br/></p><p>電解電容在可程控直流穩壓電源器件中是對溫度最為敏感的器件,從這個(gè)角度講,電解電容器的好壞也一定程度上決定了可程控直流穩壓電源裝置的壽命,AC-DC可程控直流穩壓電源產(chǎn)品表現的最為突出。</p><p><br/></p><p>2. 初級開(kāi)關(guān)管(MOS管)</p><p><br/></p><p>此類(lèi)開(kāi)關(guān)器件,處于高速開(kāi)關(guān)狀態(tài),所受電壓應力及電流應力較高。開(kāi)關(guān)損耗導致的發(fā)熱也會(huì )是器件加速老化,同時(shí)也容易受到外部高壓干擾而擊穿損壞。</p><p><br/></p><p>3. 高頻功率變壓器</p><p><br/></p><p>高頻變壓器在能量傳輸時(shí),內部的損耗會(huì )導致其發(fā)熱,散發(fā)的熱量也會(huì )影響變壓器材料的壽命。常見(jiàn)的變壓器故障有絕緣層擊穿、繞組燒毀、銅線(xiàn)斷裂等。</p><p><br/></p><p>4. 多層陶瓷電容</p><p><br/></p><p>貼片陶瓷電容最容易出現問(wèn)題的地方是電容的焊點(diǎn)處,其可能會(huì )由于一些應力作用而崩裂。為了盡量減少發(fā)生的可能性,建議盡量避免多個(gè)陶瓷電容的并聯(lián)使用?! ?lt;/p><p><br/></p><p>5. 輸出整流二極管</p><p><br/></p><p>二極管主要承受兩大電應力,包括反向耐壓及正向電流,同時(shí)二極管也是發(fā)熱器件。為了保證此器件的使用壽命,我們會(huì )在設計時(shí)流出足夠的裕量,最終保證可程控直流穩壓電源的批量性能。</p><p><br/></p><p>6. 光電耦合器</p><p><br/></p><p>電流傳輸比(CTR)隨著(zhù)時(shí)間的推移會(huì )逐漸減少,為了保持環(huán)路穩定,發(fā)光二極管的電流會(huì )不斷增大,最終會(huì )達到其極限值,導致光耦損壞。</p><p><br/></p><p>綜上所述,可程控直流穩壓電源模塊的價(jià)值不在與模塊本身,而在于保證批量品質(zhì)的工藝水平。消費者所需要的也是可程控直流穩壓電源的安全可靠性,從而減少產(chǎn)品的生產(chǎn)及維護成本。</p><p><br/></p>Fri, 01 Nov 2019 15:59:46 +0800同步整流可改善反激式高頻開(kāi)關(guān)電源的交叉調整率http:///hangyexinwen/574.html<p>當選擇一個(gè)可從單高頻開(kāi)關(guān)電源產(chǎn)生多輸出的系統拓撲時(shí),反激式高頻開(kāi)關(guān)電源是一個(gè)明智的選擇。由于每個(gè)變壓器繞組上的電壓與該繞組中的匝數成比例,因此可以通過(guò)匝數來(lái)輕松設置每個(gè)輸出電壓。在理想情況下,如果調節其中一個(gè)輸出電壓,則所有其他輸出將按照匝數進(jìn)行縮放,并保持穩定。</p><p><br/></p><p>然而,在現實(shí)情況中,寄生元件會(huì )共同降低未調節輸出的負載調整。在本高頻開(kāi)關(guān)電源小貼士中,我將進(jìn)一步探討寄生電感的影響,以及如何使用同步整流代替二極管來(lái)大幅提高反激式高頻開(kāi)關(guān)電源的交叉調整率。</p><p><br/></p><p>例如,一個(gè)反激式高頻開(kāi)關(guān)電源可分別從一個(gè)48V輸入產(chǎn)生兩個(gè)1 A的12V輸出,如圖1的簡(jiǎn)化仿真模型所示。理想的二極管模型具有零正向壓降,電阻可忽略不計。變壓器繞組電阻可忽略不計,只有與變壓器引線(xiàn)串聯(lián)的寄生電感才能建模。這些電感是變壓器內的漏電感,以及印刷電路板(PCB)印制線(xiàn)和二極管內的寄生電感。當設置這些電感時(shí),兩個(gè)輸出相互跟蹤,因為當二極管在開(kāi)關(guān)周期的1-D部分導通時(shí),變壓器的全耦合會(huì )促使兩個(gè)輸出相等。</p><p><br/></p><p><img src="http:///zb_users/upload/2019/11/201911011572595036637284.jpg" title="同步整流可改善反激式高頻開(kāi)關(guān)電源的交叉調整率" alt="同步整流可改善反激式高頻開(kāi)關(guān)電源的交叉調整率" width="400" height="293" border="0" vspace="0" style="width: 400px; height: 293px;"/></p><p>圖1該反激式簡(jiǎn)化模型模擬了漏電感對輸出電壓調節的影響。</p><p>&nbsp;</p><p>現在考慮一下,當您將100 nH的漏電感引入變壓器的兩根二次引線(xiàn),并且將3μH的漏電與初級繞組串聯(lián)時(shí),將會(huì )發(fā)生什么。這些電感可在電流路徑中建立寄生電感,其中包括變壓器內部的漏電感以及PCB和其他元件中的電感。</p><p><br/></p><p>當初始場(chǎng)效應晶體管(FET)關(guān)斷時(shí),初始漏電感仍然有電流流動(dòng),而次級漏電感開(kāi)啟初始條件為0 A的1-D周期。變壓器磁芯上出現基座電壓,所有繞組共用。該基座電壓使初級漏電中的電流斜降至0 A,并使次級漏電電流斜升以將電流傳輸到負載。</p><p><br/></p><p><br/></p><p><img src="http:///zb_users/upload/2019/11/201911011572595051184379.jpg" title="同步整流可改善反激式高頻開(kāi)關(guān)電源的交叉調整率" alt="同步整流可改善反激式高頻開(kāi)關(guān)電源的交叉調整率" width="400" height="406" border="0" vspace="0" style="width: 400px; height: 406px;"/></p><p>圖2</p><p><br/></p><p>當兩個(gè)重載輸出時(shí),電流在整個(gè)1-D周期持續流動(dòng),輸出電壓平衡良好,如圖2所示。然而,當一個(gè)重載輸出和另一個(gè)輕載輸出時(shí),輕載輸出上的輸出電容傾向于從該基座電壓發(fā)生峰值充電;因為電流迅速回升到零,其輸出二極管將停止導通,。請參見(jiàn)圖3中的波形。這些寄生電感的峰值充電交叉調節影響通常比整流器正向壓降單獨引起的要差得多。</p><p>&nbsp;</p><p>圖2當對兩個(gè)輸出施加重載時(shí),在整個(gè)1-D周期內,次級繞組電流在兩個(gè)次級繞組中流動(dòng)。您可以看到上方紅色跡線(xiàn)上的基座電壓。</p><p>&nbsp;</p><p><br/></p><p><img src="http:///zb_users/upload/2019/11/201911011572595067134230.jpg" title="同步整流可改善反激式高頻開(kāi)關(guān)電源的交叉調整率" alt="同步整流可改善反激式高頻開(kāi)關(guān)電源的交叉調整率" width="400" height="405" border="0" vspace="0" style="width: 400px; height: 405px;"/></p><p>圖3重載次級1和輕載次級2?;妷簩Υ渭?的輸出電容器進(jìn)行峰值充電。</p><p>&nbsp;</p><p>無(wú)論負載如何,同步整流器有助于通過(guò)在整個(gè)1-D周期內強制電流流入兩個(gè)繞組來(lái)減輕此問(wèn)題。圖4顯示了具有與圖3相同負載條件的波形,但用理想的同步整流器代替了理想的二極管。由于同步整流器在基座電壓降低后保持良好狀態(tài),因此即使出現嚴重不平衡的負載,兩個(gè)輸出電壓也能很好地相互跟蹤。</p><p><br/></p><p>雖然次級2的平均電流非常小,但均方根(RMS)含量仍然可以相當高。這是因為,與圖3中的理想二極管不同,同步整流器在整個(gè)1-D周期期間可強制連續電流流動(dòng)。有趣的是,電流在這一周期的大部分時(shí)間內必須是負的,以保證低平均電流。</p><p><br/></p><p>顯然,您犧牲更佳的調節以實(shí)現更高的循環(huán)電流。然而,這并不一定意味著(zhù)總損耗會(huì )更高。同步整流器的正向壓降通常遠低于二極管,因此同步整流器在較高負載下的效率通常要好得多。</p><p>&nbsp;</p><p><img src="http:///zb_users/upload/2019/11/201911011572595085906305.jpg" title="同步整流可改善反激式高頻開(kāi)關(guān)電源的交叉調整率" alt="同步整流可改善反激式高頻開(kāi)關(guān)電源的交叉調整率" width="400" height="404" border="0" vspace="0" style="width: 400px; height: 404px;"/></p><p>圖4 用同步整流器代替二極管以強制電流在兩個(gè)次級繞組中流動(dòng),并消除基座電壓的峰值充電。</p><p>&nbsp;</p><p>您可以在圖5中看到對交叉調節的影響。1號輸出上的負載在1A時(shí)保持穩定,而2號輸出上的負載則在10 mA到1A之間起伏。在低于100 mA的負載下,當使用二極管時(shí),由于基座電壓峰值充電的影響,交叉調節嚴重降低。</p><p>請記住,您之所以只看到漏電感的影響,是因為在這些模擬中使用的是理想的二極管和理想的同步整流器。當考慮電阻和整流器的正向壓降影響時(shí),使用同步整流器的優(yōu)勢會(huì )進(jìn)一步凸顯。</p><p><br/></p><p>因此,為了在多輸出反激式高頻開(kāi)關(guān)電源中實(shí)現卓越的交叉調節效果,請考慮使用同步整流器。此外,您還可能提高高頻開(kāi)關(guān)電源的效率。查看TI用于PoE應用參考設計的40V至60V輸入40W雙輸出隔離反激式轉換器(4.33A時(shí)6V)和3類(lèi)雙輸出隔離反激式轉換器,以作為使用同步整流器的反激式高頻開(kāi)關(guān)電源示例。</p><p>&nbsp;</p><p><img src="http:///zb_users/upload/2019/11/201911011572595111787566.jpg" title="同步整流可改善反激式高頻開(kāi)關(guān)電源的交叉調整率" alt="同步整流可改善反激式高頻開(kāi)關(guān)電源的交叉調整率" width="400" height="283" border="0" vspace="0" style="width: 400px; height: 283px;"/></p><p>圖5</p><p><br/></p><p>圖5該圖顯示了兩個(gè)輸出之間的交叉調節,其中1號輸出上的1-A負載保持穩定,而2號輸出上的負載不斷變化,從而凸顯了同步整流器如何減輕漏電感的影響。</p>Fri, 01 Nov 2019 15:55:45 +0800如何治理配電臺區三相不平衡?http:///hangyexinwen/573.html<p>傳統配電臺區治理三相不平衡時(shí),忽視了換相對負荷的影響,換相開(kāi)關(guān)壽命以及配電臺區的經(jīng)濟性等問(wèn)題。針對上述問(wèn)題,本文提出了一種基于負荷預測的配電臺區三相不平衡治理方法。采用K-means算法對歷史日負荷進(jìn)行聚類(lèi),利用支持向量機對已經(jīng)做過(guò)統計歸類(lèi)處理的歷史數據進(jìn)行短期負荷預測,并計算對應配電變壓器運行時(shí)三相負荷電流的不平衡度。建立了以配電臺區三相電流不平衡度最小,換相開(kāi)關(guān)切換次數最少為目標的最優(yōu)換相數學(xué)模型,通過(guò)遺傳算法獲得最優(yōu)換相方案。</p><p><br/></p><p>該方法有效減少了線(xiàn)損、降低了三相負荷不平衡度以及緩解了配電臺區三相負荷不平衡問(wèn)題。</p><p><br/></p><p><br/></p><p>我國配電網(wǎng)自動(dòng)化程度低,單相負荷多,尤其農村地區,電力用戶(hù)繁雜且疏于規劃,單相負荷分配不均衡,配電臺區存在嚴重的三相負荷不平衡問(wèn)題。</p><p><br/></p><p>當前,國內外治理三相負荷不平衡問(wèn)題的方法主要有:①無(wú)功補償裝置投切電容器組;②相間電容轉移有功功率;③換相開(kāi)關(guān)裝置調整負荷等。其中,靜止無(wú)功發(fā)生器和相間跨接電力電容器等無(wú)功補償裝置,沒(méi)有從根本上解決三相負荷不平衡問(wèn)題;負荷自動(dòng)調相裝置價(jià)錢(qián)昂貴且控制終端與換相開(kāi)關(guān)之間通信復雜,難以在配電臺區中推廣應用;人工調相操作具有一定的延時(shí)和滯后性。配電臺區三相不平衡治理存在運維成本高,時(shí)間滯后等問(wèn)題。</p><p><br/></p><p>隨著(zhù)科學(xué)技術(shù)的進(jìn)步,智能算法發(fā)展逐漸成熟,支持向量機(support vector machine, SVM)算法廣泛應用在小樣本、系統非線(xiàn)性等復雜的情況下,同時(shí)克服了神經(jīng)網(wǎng)絡(luò )經(jīng)驗風(fēng)險最小化的局限。K- means算法的聚類(lèi)效果與同類(lèi)內氣象數據的相似度成正比,與類(lèi)間的相似度成反比關(guān)系,同時(shí)收斂速度快,實(shí)現容易。</p><p><br/></p><p>遺傳算法具有強魯棒性和自適應性,高搜索能力和對目標函數依賴(lài)程度低的優(yōu)點(diǎn),適合解決換相最優(yōu)解的問(wèn)題?;诰垲?lèi)分析和支持向量機算法的負荷預測可以精確預測出未來(lái)一段時(shí)間內負荷的用電數據;遺傳算法在電力系統最優(yōu)方案篩選方面的應用更為廣泛。然而這些技術(shù)在三相不平衡負荷調整方面卻鮮有應用。</p><p><br/></p><p>綜上所述,本文提出一種新的配電臺區三相負荷不平衡治理方法?;谪摵深A測結果,對三相不平衡問(wèn)題嚴重的配電臺區,利用目標函數搭建最優(yōu)換相數學(xué)模型,然后采用改進(jìn)遺傳算法篩選得出配電臺區負荷最優(yōu)換相方案,最大限度降低配電臺區三相電流不平衡度的同時(shí)盡可能縮小開(kāi)關(guān)調整次數,提高配電臺區供電經(jīng)濟性和安全性以及換相裝置的使用壽命,從根源上治理三相不平衡問(wèn)題。</p><p><br/></p><p><img src="http:///zb_users/upload/2019/10/201910091570588554263307.png" title="如何治理配電臺區三相不平衡?" alt="如何治理配電臺區三相不平衡?" width="500" height="584" border="0" vspace="0" style="width: 500px; height: 584px;"/></p><p>圖1&nbsp; 負荷預測流程圖</p><p><br/></p><p><img src="http:///zb_users/upload/2019/10/201910091570588566484808.png" title="如何治理配電臺區三相不平衡?" alt="如何治理配電臺區三相不平衡?" width="500" height="751" border="0" vspace="0" style="width: 500px; height: 751px;"/></p><p>圖2&nbsp; 遺傳算法換相尋優(yōu)流程圖</p><p><br/></p><p>總結</p><p>本文提出了基于負荷預測的三相負荷不平衡治理方法。通過(guò)負荷預測獲得各時(shí)刻的三相電流不平衡度,確定需提前進(jìn)行負荷調整的時(shí)刻,采用改進(jìn)遺傳算法獲得負荷最優(yōu)調整方案。案例分析結果表明該方法可以提前調整負荷所在相序,避免了由于未能及時(shí)調整負荷所帶來(lái)的加劇三相負荷不平衡程度的后果,同時(shí)減少了線(xiàn)路損耗,延長(cháng)了換相開(kāi)關(guān)的使用壽命,提高了配電臺區的經(jīng)濟性及供電可靠性。</p>Wed, 09 Oct 2019 10:34:15 +0800