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