• 8個經驗搞定開關電源PCBLayout

    素材來源:八號線攻城獅 其實對於一個開關電源工程師而言 PCB的繪製其實是對一款產品的影響至關重要的部分,如果你不能很好的Layout的話,整個電源很有可能不能正常工作,最小問題也是穩波或者EMC過不去。 這是別人家的成品開關電源,模組,今天以這個電源模組的設計重點跟大家聊聊。 1 經驗一:安規走線間距 這個是寫在協議裏面的,如果你不按照這個做,耐壓測試一定是過不了的,因為高電壓,會直接空氣擊穿。注意保險絲之前的距離是比較遠的,要求3mm以上,這就是為啥保險絲都會放在電路最前端的原因。 第二個要注意的是就算安規沒有寫,如果兩根走線太近,正常工作也依然會擊穿的,兩根1mm間距的PCB外層耐壓是200V,所以一般220v交流或者310V直流的走線距離至少2mm以上,一般都是在2.5mm以上的。 這些器件都是有安規要求的,説白了,就是兩個器件有最小尺寸需求的,太小的器件其實是不可能過安規的,這就是所謂的開關電源PCB工程師實質上是帶着鐐銬在跳舞的原因。 開關電源變壓器的骨架,同樣是為了符合安規所以要有嚴格的把關。尤其是初級,到次級的距離,小功率變壓器是必須飛線的。 飛線的長度也要被管控,如果飛線太短,耐壓可能會受到影響,而如果飛線太長,會有可能對外輻射電磁信號,EMC過不了,所以需要在規格書裏面詳細寫清楚,PCB繪製的時候,飛線的焊盤一定要注意,不能太妖孽。  2 經驗二:電流走向 這個其實很少有真的被提及,其實原因也很簡單。很多人不注意啊。 注意這裏保險絲之後,接壓敏電阻VR1再接x2電容的走線,完全是繞了一個彎這是為什麼? 理由很簡單,不讓電流在PCB上面有回頭路可以走。電流只走阻抗最小的部分,如果直接覆銅,必經的元器件就有可能會被跳過,所以這樣做不可以。 同樣的,這裏的電解電容,一樣是為了避免電流繞過必經的電容,直接流到負載上。 雖然畫法不同,但是實際起到的作用是一樣的。 這就是一個錯誤的案例,紅色L火線先接了共模電感,再接的x2電容,共模電感到x2電容的這段線就會產生一個奇妙的現象,電流來回走,變成了一根天線,x2電流充電的時候,導線內部電流是正向,電容放電的時候,導線內部的電流是反向的,這不是天線是什麼? 3 經驗三:最小高壓主電流回路 這就是實際佈線時候的佈局,大家可以參考一下,JT1是飛線,直接把310V正電壓引入了變壓器。 4 經驗四:獨立電壓採樣走線 開關電源的採樣電壓一定要和開關電源的大電流走線分開。要從開關電源輸出電源的最末端去獨立拉線採樣,這樣可以避免負載電流對採樣線上形成的干擾。 採樣電路在最末端。直接從負載輸出端取電壓,採樣走線上不走大電流,避免了各種採樣誤差。 5 經驗五:PCB載流能力 眾所周知PCB的過電流能力是有限的,但是PCB上的電流究竟能過多少呢? 上面這個表格可以給你一個詳細的參考。看過表格,你應該知道了對於小功率開關電源而言,高壓側的走線完全沒有必要搞的很粗,除非是為了為器件提供散熱,否則1mm一般是足夠的,最多2mm多數情況都能夠勝任了。 但是對於低壓側,大電流怎麼辦? 一方面是增加線寬,一方面是通過去掉部分阻焊層,並在鋼網層製造窗口,讓導線上錫水。導線的載流能力就會得到相應的增加。(注意一定要在Paste鋼網層開孔,否則不會真的上焊錫的,切記切記) 6 經驗六:PCB過孔散熱的技巧 許多時候我們需要通過PCB線路板來散熱,這個時候我們會打一些過孔,然後把熱量傳遞到PCB的反面去。 這時候有一個小技巧,那就是孔塞可以增加熱傳導的效率,但是孔塞有一個常見最大孔塞直徑,一般是過孔直徑不大於0.45mm、我保險一點一般都是取0.4mm直徑 7 經驗七:放電管的繪製 一般在開關電源的高壓側與低壓側之間會有一個放電管,用來釋放靜電。 許多工程師都會最後在PCB Layout的時候手工繪製。 而我的建議是直接做成一個封裝,然後和PCB關聯調用,這樣不會破壞PCB的聯動性。 只是説你需要繪製兩個異形封裝罷了。還算比較容易。 注意這裏只需要去掉阻焊層,千萬不要在中間繪製鋼網層,因為這裏是不需要上錫的,只有焊盤需要上錫 8 經驗八:元器件封裝 一般而言,元器件一律按照IPC-SM-782A封裝標準制作,對於個別需要承受高壓的採樣電阻單獨對待,因為電阻焊盤之間的間距和耐壓有關,所以焊盤需要適當拉開一些,但是同時又不能拉的太開,避免不必要的焊接不良率。 這是控制器用來直接連接高壓的採樣分壓電阻,如果間距不符合要求,很有可能就會耐壓不夠擊穿。貼片電阻器也是有耐壓的,不過耐壓不夠就要加大封裝。 這些差不多就是在開關電源設計時候的,全部PCB繪製經驗了。 説實話,開關電源的繪製一路被人忽悠過來,這裏面半桶水的人太多了,很多都是玄學,而這些都是相對來説算是靠譜一些的,試驗後驗證過的經驗,這也是那些開關電源製作大牛們的血淚教訓,很多時候他們當然不希望別人知道,這也沒有辦法,今天分享出來就是希望能有更少的人去走這些彎路,能給大家一些幫助。 【遞四方香港】 電源防反接電路的幾種實現方案 【遞四方香港】 知道了電容的這些作用,就可以玩轉電容 【遞四方香港】 為什麼Y電容容量基本都不大於0.1uF? 【遞四方香港】 華為內部資料:電容的介紹和深入認識 【遞四方香港】 封裝圖鑑:掌握這17種元器件PCB封裝,設計板子就容易多了! 【遞四方香港】 八層板PCB設計,電腦主板設計分析 免責聲明:本文內容由21ic獲得授權後發佈,版權歸原作者所有,本平台僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平台立場,如有問題,請聯繫我們,謝謝!

    時間:2020-11-24 關鍵詞: PCB 開關電源

  • 知道了電容的這些作用,就可以玩轉電容

    電容是電路設計中最為普通的常用器件,屬於無源元件,常常在高速電路中扮演重要角色。它的作用和用途多種多樣,如:在旁路、去藕、濾波、儲能方面的作用;在完成振盪、同步以及時間常數的作用等。 01 隔直流 電容的作用之一,阻止直流通過而讓交流通過。   02 旁路(去耦) 電容的另一個作用,為交流電路中某些並聯的元件提供低阻抗通路。       ▶旁路電容 旁路電容,又稱為退耦電容,是為某個器件提供能量的儲能器件。它利用了電容的頻率阻抗特性(理想電容的頻率特性隨頻率的升高,阻抗降低),就像一個水塘,它能使輸出電壓輸出均勻,降低負載電壓波動。旁路電容要儘量靠近負載器件的供電電源管腳和地管腳,這是阻抗要求。   在畫PCB時候特別要注意,只有靠近某個元器件時候才能抑制,電壓或其他輸信號因過大而導致的地電位抬高和噪聲。即把直流電源中的交流分量,通過電容耦合到電源地中,起到了淨化直流電源的作用。如下圖為旁路電容,畫圖時候要儘量靠近IC1.   ▶去藕電容 去耦電容是把輸出信號的干擾作為濾除對象。去耦電容相當於電池,利用其充放電,使得放大後的信號不會因電流的突變而受干擾。它的容量根據信號的頻率、抑制波紋程度而定,去藕電容就是起到一個“電池”的作用,滿足驅動電路電流的變化,避免相互間的耦合干擾。下圖為去耦電容。     ▶兩者區別 旁路電容實際也是去藕合的,只是旁路電容一般是指高頻旁路,也就是給高頻的開關噪聲提高一條低阻抗泄防途徑。高頻旁路電容一般比較小,根據諧振頻率一般取 0.1F、0.01F等;而去耦合電容的容量一般較大,可能是10F或者更大,依據電路中分佈參數、以及驅動電流的變化大小來確定。   旁路是把輸入信號中的干擾作為濾除對象,而去耦是把輸出信號的干擾作為濾除對象,防止干擾信號返回電源。 03 耦合 電容的還有耦合作用,即作為兩個電路之間的連接,允許交流信號通過並傳輸到下一級電路 。   用電容做耦合的元件,是為了將前級信號傳遞到後一級,並且隔斷前一級的直流對後一級的影響,使電路調試簡單,性能穩定。   如果不加電容交流信號放大不會改變,只是各級工作點需重新設計,由於前後級影響,調試工作點非常困難,在多級時幾乎無法實現。   04 濾波  這個對電路而言很重要,CPU背後的電容基本都是這個作用。   即頻率f越大,電容的阻抗Z越小。當低頻時,電容C由於阻抗Z比較大,有用信號可以順利通過;當高頻時,電容C由於阻抗Z已經很小了,相當於把高頻噪聲短路到GND上去了。     濾波作用:理想電容,電容越大,阻抗越小,通過的頻率也越高。電解電容一般都是超過1uF,其中的電感成份很大,因此頻率高後反而阻抗會大。   我們經常看見,有時會看到有一個電容量較大的電解電容並聯了一個小電容,其實大的電容通低頻,小電容通高頻,這樣才能充分濾除高低頻。電容頻率越高則衰減越大,電容像一個水塘,幾滴水不足以引起它的很大變化,也就是説電壓波動不是很大的時候,電壓可以緩衝,如下圖。   05 温度補償 針對其它元件對温度的適應性不夠帶來的影響,而進行補償,改善電路的穩定性。     由於定時電容的容量決定了行振盪器的振盪頻率,所以要求定時電容的容量非常穩定,不隨環境濕度變化而變化,這樣才能使行振盪器的振盪頻率穩定。因此採用正、負温度係數的電容釋聯,進行温度互補。   當工作温度升高時,C1的容量在增大,而C2的容量在減小,兩隻電容並聯後的總容量為兩隻電容容量之和,由於一個容量在增大而另一個在減小,所以總容量基本不變。   同理,在温度降低時,一個電容的容量在減小而另一個在增大,總的容量基本不變,穩定了振盪頻率,實現温度補償目的。 06 計時 電容器與電阻器配合使用,確定電路的時間常數。     輸入信號由低向高跳變時,經過緩衝1後輸入RC電路。電容充電的特性使B點的信號並不會跟隨輸入信號立即跳變,而是有一個逐漸變大的過程。當變大到一定程度時,緩衝2翻轉,在輸出端得到了一個延遲的由低向高的跳變。   時間常數:以常見的RC串聯構成積分電路為例,當輸入信號電壓加在輸入端時,電容上的電壓逐漸上升。而其充電電流則隨着電壓的上升而減小,電阻R和電容C串聯接入輸入信號VI,由電容C輸出信號V0,當RC (τ)數值與輸入方波寬度tW之間滿足:τ>>tW,這種電路稱為積分電路。   07 調諧 對與頻率相關的電路進行系統調諧,比如手機、收音機、電視機。   變容二極管的調諧電路   因為lc調諧的振盪電路的諧振頻率是lc的函數,我們發現振盪電路的最大與最小諧振頻率之比隨着電容比的平方根變化。此處電容比是指反偏電壓最小時的電容與反偏電壓最大時的電容之比。因而,電路的調諧特徵曲線(偏壓一諧振頻率)基本上是一條拋物線。 08 整流 在預定的時間開或者關半閉導體開關元件。     09 儲能 儲存電能,用於必須要的時候釋放。例如相機閃光燈,加熱設備等。如今某些電容的儲能水平己經接近鋰電池的水準,一個電容儲存的電能可以供一個手機使用一天。     一般地,電解電容都會有儲能的作用。對於專門的儲能作用的電容,電容儲能的機理為雙電層電容以及法拉第電容,其主要形式為超級電容儲能。   其中超級電容器是利用雙電層原理的電容器,當外加電壓加到超級電容器的兩個極板上時,與普通電容器一樣,極板的正電極存儲正電荷,負極板存儲負電荷;在超級電容器的兩極板上電荷產生的電場作用下,在電解液與電極間的界面上形成相反的電荷,以平衡電解液的內電場。這種正電荷與負電荷在兩個不同相之間的接觸面上,以正負電荷之間極短間隙排列在相反的位置上,這個電荷分佈層叫做雙電層,因此電容量非常大。 精彩文章推薦: 運算放大器和比較器有什麼區別? 為什麼Y電容容量基本都不大於0.1uF? RS485接口EMC電路設計方案 技術貼:STM32串口通信波特率如何計算 高速PCB設計EMI的九大規則,工程師必看 八層板PCB設計,電腦主板設計分析 免責聲明:本文內容由21ic獲得授權後發佈,版權歸原作者所有,本平台僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平台立場,如有問題,請聯繫我們,謝謝!

    時間:2020-11-24 關鍵詞: 元器件 電容

  • 解了這14道C語言謎題後,所有人卻都笑了!

    素材來源:電子世家- 巧學模電數電單片機 本文展示了14個C語言的迷題以及答案,代碼應該是足夠清楚的,而且有相當的一些例子可能是我們日常工作可能會見得到的。通過這些迷題,希望你能更瞭解C語言。 如果你不看答案,不知道是否有把握回答各個謎題?讓我們來試試。 1 下面的程序並不見得會輸出"hello-std-out",你知道為什麼嗎? #include #include int main() { while(1) { fprintf(stdout,"hello-std-out"); fprintf(stderr,"hello-std-err"); sleep(1); } return 0; } 參考答案 stdout和stderr是不同設備描述符。stdout是塊設備,stderr則不是。對於塊設備,只有當下面幾種情況下才會被輸入:遇到回車;緩衝區滿;flush被調用。而stderr則不會。 2 下面的程序看起來是正常的,使用了一個逗號表達式來做初始化。可惜這段程序是有問題的。你知道為什麼嗎? #include int main() { int a = 1,2; printf("a : %d\n",a); return 0; } 參考答案 這個程序會得到編譯出錯(語法出錯)。逗號表達式是沒錯,可是在初始化和變量聲明時,逗號並不是逗號表達式的意義。這點要區分,要修改上面這個程序,你需要加上括號:"int a = (1,2);"。 3 下面的程序會有什麼樣的輸出呢? #include int main() { int i=43; printf("%d\n",printf("%d",printf("%d",i))); return 0; } 參考答案 程序會輸出4321,你知道為什麼嗎?要知道為什麼,你需要知道printf的返回值是什麼。printf返回值是輸出的字符個數。 4 下面的程序會輸出什麼? #include int main() { float a = 12.5; printf("%d\n", a); printf("%d\n", (int)a); printf("%d\n", *(int *)&a); return 0; } 參考答案 該項程序輸出:"0 12 1095237632"。 原因是:浮點數是4個字節,12.5f轉成二進制是:01000001010010000000000000000000,十六進制是:0x41480000,十進制是:1095237632。所以,第二和第三個輸出相信大家也知道是為什麼了。 而對於第一個,為什麼會輸出0,我們需要了解一下float和double的內存佈局,如下: • float: 1位符號位(s)、8位指數(e),23位尾數(m,共32位)。 • double: 1位符號位(s)、11位指數(e),52位尾數(m,共64位)。 然後,我們還需要了解一下printf由於類型不匹配,所以,會把float直接轉成double,注意,12.5的float和double的內存二進制完全不一樣。別忘了在x86芯片下使用是的反字節序,高位字節和低位字位要反過來。所以: • float版:0x41480000 (在內存中是:00 00 48 41)。 • double版:0x4029000000000000 (在內存中是:00 00 00 00 00 00 29 40)。 而我們的%d要求是一個4字節的int,對於double的內存佈局,我們可以看到前四個字節是00,所以輸出自然是0了。這個示例向我們説明printf並不是類型安全的,這就是為什麼C++要引如cout的原因了。 5 下面,我們再來看一個交叉編譯的事情,下面的兩個文件可以編譯通過嗎?如果可以通過,結果是什麼? //file1.cint arr[80]; //file2.cextern int *arr; int main() { arr[1] = 100; printf("%d\n", arr[1]); return 0; } 參考答案 該程序可以編譯通過,但運行時會出錯。為什麼呢?原因是,在另一個文件中用 extern int *arr來外部聲明一個數組並不能得到實際的期望值,因為他們的類型並不匹配。所以導致指針實際並沒有指向那個數組。 注意:一個指向數組的指針,並不等於一個數組。 修改:"extern int arr[]"。 6 請説出下面的程序輸出是多少?並解釋為什麼?(注意,該程序並不會輸出"b is 20") #include int main() { int a=1; switch(a) { int b=20; case 1: printf("b is %d\n",b); break; default: printf("b is %d\n",b); break; } return 0; } 參考答案 該程序在編譯時,可能會出現一條warning: unreachable code at beginning of switch statement。我們以為進入switch後,變量b會被初始化,其實並不然,因為switch-case語句會把變量b的初始化直接就跳過了。所以,程序會輸出一個隨機的內存值。 7 請問下面的程序會有什麼潛在的危險? #include int main() { char str[80]; printf("Enter the string:"); scanf("%s",str); printf("You entered:%s\n",str); return 0; } 參考答案 本題很簡單了。這個程序的潛在問題是,如果用户輸入了超過80個長度的字符,那麼就會有數組越界的問題了,你的程序很有可能會crash了。 8 請問下面的程序輸出什麼? #include int main() { int i; i = 10; printf("i : %d\n",i); printf("sizeof(i++) is: %d\n",sizeof(i++)); printf("i : %d\n",i); return 0; } 參考答案 如果你覺得輸出分別是:10,4,11。那麼你就錯了。 錯在了第三個,第一個是10沒有什麼問題,第二個是4,也沒有什麼問題,因為是32位機上一個int有4個字節。但是第三個為什麼輸出的不是11呢?居然還是10?原因是,sizeof不是一個函數,是一個操作符,其求i++的類型的size,這是一件可以在程序運行前(編譯時)完全的事情,所以,sizeof(i++)直接就被4給取代了,在運行時也就不會有了i++這個表達式。 9 請問下面的程序的輸出值是什麼? #include #include #define SIZEOF(arr) (sizeof(arr)/sizeof(arr[0])) #define PrintInt(expr) printf("%s:%d\n",#expr,(expr)) int main() { /* The powers of 10 */ int pot[] = { 0001, 0010, 0100, 1000       }; int i; for(i=0;i

    時間:2020-11-24 關鍵詞: 嵌入式 C語言

  • RS485接口EMC電路設計方案

    一、原理圖 1.  RS485接口6KV防雷電路設計方案 圖1  RS485接口防雷電路 接口電路設計概述: RS485用於設備與計算機或其它設備之間通訊,在產品應用中其走線多與電源、功率信號等混合在一起,存在EMC隱患。 本方案從EMC原理上,進行了相關的抑制干擾和抗敏感度的設計,從設計層次解決EMC問題。 2.電路EMC設計説明: (1) 電路濾波設計要點: L1為共模電感,共模電感能夠對衰減共模干擾,對單板內部的干擾以及外部的干擾都能抑制,能提高產品的抗干擾能力,同時也能減小通過429信號線對外的輻射,共模電感阻抗選擇範圍為120Ω/100MHz ~2200Ω/100MHz,典型值選取1000Ω/100MHz; C1、C2為濾波電容,給干擾提供低阻抗的迴流路徑,能有效減小對外的共模電流以同時對外界干擾能夠濾波;電容容值選取範圍為22PF~1000pF,典型值選取100pF;若信號線對金屬外殼有絕緣耐壓要求,那麼差分線對地的兩個濾波電容需要考慮耐壓; 當電路上有多個節點時要考慮降低或去掉濾波電容的值。C3為接口地和數字地之間的跨接電容,典型取值為1000pF, C3容值可根據測試情況進行調整; (2) 電路防雷設計要點: 為了達到IEC61000-4-5或GB17626.5標準,共模6KV,差模2KV的防雷測試要求,D4為三端氣體放電管組成第一級防護電路,用於抑制線路上的共模以及差模浪湧干擾,防止干擾通過信號線影響下一級電路; 氣體放電管標稱電壓VBRW要求大於13V,峯值電流IPP要求大於等於143A; 峯值功率WPP要求大於等於1859W; PTC1、PTC2為熱敏電阻組成第二級防護電路,典型取值為10Ω/2W; 為保證氣體放電管能順利的導通,泄放大能量必須增加此電阻進行分壓,確保大部分能量通過氣體放電管走掉;  D1~D3為TSS管(半導體放電管)組成第三級防護電路,TSS管標稱電壓VBRW要求大於8V,峯值電流IPP要求大於等於143A;峯值功率WPP要求大於等於1144W; 3.接口電路設計備註: 如果設備為金屬外殼,同時單板可以獨立的劃分出接口地,那麼金屬外殼與接口地直接電氣連接,且單板地與接口地通過1000pF電容相連; 如果設備為非金屬外殼,那麼接口地PGND與單板數字地GND直接電氣連接。 二. PCB設計 1.  RS485接口電路佈局 圖1  RS485接口濾波及防護電路佈局 方案特點: (1)防護器件及濾波器件要靠近接口位置處擺放且要求擺放緊湊整齊,按照先防護後濾波的規則,走線時要儘量避免走線曲折的情況; (2) 共模電感與跨接電容要置於隔離帶中。 方案分析: (1)接口及接口濾波防護電路周邊不能走線且不能放置高速或敏感的器件; (2) 隔離帶下面投影層要做掏空處理,禁止走線。 2.  RS485接口電路分地設計 方案特點: (1)為了抑制內部單板噪聲通過RS485接口向外傳導輻射,也為了增強單板對外部干擾的抗擾能力,在RS485接口處增加濾波器件進行抑制,以濾波器件位置大小為界,劃分出接口地; (2)隔離帶中可以選擇性的增加電容作為兩者地之間的連接,電容C4、C5取值建議為1000pF,信號線上串聯共模電感CM與電容濾波,並與接口地並聯GDT和TVS管進行防護;且所有防護器件都靠近接口放置,共模電感CM置於隔離帶內,具體佈局如圖示。 方案分析: (1)當接口與單板存在相容性較差或不相容的電路時,需要在接口與單板之間進行“分地”處理,即根據不同的端口電壓、電平信號和傳輸速率來分別設置地線。“分地”,可以防止不相容電路的迴流信號的疊加,防止公共地線阻抗耦合; (2)“分地”現象會導致迴流信號跨越隔離帶時阻抗變大,從而引起極大的EMC風險,因此在隔離帶間通過電容來給信號提供迴流路徑。 相關文章推薦: RS485的上下拉電阻如何選擇? RS485方向切換如何設計電路?介紹5種方案及優劣勢分析 RS485是硬件接口,那麼他是怎麼實現數據通訊的呢?Modbus-RTU協議解析 一個小電路引起的疑惑:RS485電路 免責聲明:本文內容由21ic獲得授權後發佈,版權歸原作者所有,本平台僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平台立場,如有問題,請聯繫我們,謝謝!

    時間:2020-11-24 關鍵詞: 電子電路 PCB

  • 運算放大器和比較器有什麼區別?

    運算放大器和電壓比較器在原理符號上確實是一樣的,都有5個引腳,其中兩個引腳為電源+和電源-,還有兩個引腳為同相輸入端(+)和反向輸入端(-),最後一個引腳是輸出端。 但是它們的功能是不一樣的,運放的功能及用途更復雜,而比較器就相對簡單得多。 電壓比較器 下面簡單講解一下比較器的基本原理,比較器的原理挺簡單,目的是比較兩個輸入端的電壓大小,若正輸入端的電壓為a,負輸入端的電壓為b,則當a>b時,輸出為高電平(邏輯1);當a<b時,輸出為低電平(邏輯0)。 下面結合原理圖進行説明,如下圖原理圖,比較器輸入端的電壓為IN1、IN2,供電為VCC/GND,上拉電阻1K,上拉電壓為VCC。 當輸入電壓IN1>IN2時,即正輸入端的電壓較高,輸出高電平(VCC); 當輸入電壓IN2>IN1時,即負輸入端的電壓較高,輸出低電平(0V)。 比較器的用途很廣,可用於比較熱敏電阻、光敏傳感器等電壓信號,用於離散量控制,比如通過比較器採集光敏電阻的電壓判斷白天還是夜晚等,比較器還可以用於模擬量負反饋電路當中,比如電壓調節等。 運算放大器 運放的用途很多,基本的運放電路有同相比例放大電路、反相比例放大電路、加法器、減法器、差分比例運算電路、微分電路、積分電路等,掌握這些基本的集成運放電路原理,基本上可以區分電路圖中符號一樣的電路符號屬於比較器還是運放。 一般情況下,運放都會在輸出端與輸入端之間串聯一個電阻用於反饋,而一般情況下電壓比較器輸出端與輸入端之間是沒有電阻的,絕大部分電路都可以通過此區別來區分,但是也有特殊情況,這要根據具體原理具體分析了。 比如 運放也可以當比較器使用 ,其輸出端與輸入端之間開環(不接反饋電阻),使用運放當比較器其別在於不用上拉電阻,當IN1>IN2時,輸出電壓為VCC(運放電源電壓),當IN1<IN2時,輸出電壓為0。 總結 專業基礎紮實,掌握電壓比較器和運放的基本電路之後,基本上直接就能夠判別原理屬於運放還是比較器,只有少量的特殊情況需要具體分析,通過專業知識分析其原理很快就能夠判別其屬於運放還是比較器。 相關文章推薦: 模擬電路的精髓:運放,該如何選型? 學會虛斷和虛短,運放電路就不難! 差分運放,PT100採集處理電路設計 模電老司機這樣説:學會“虛短”和“虛斷”,運放電路分析不求人 單比較器設計的滯回電路如何改變滯回回差? 合理使用運算放大器,方便你我他! 免責聲明:本文內容由21ic獲得授權後發佈,版權歸原作者所有,本平台僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平台立場,如有問題,請聯繫我們,謝謝!

    時間:2020-11-24 關鍵詞: 運算放大器 比較器

  • 技術貼:STM32串口通信波特率如何計算?

    波特率的計算 STM32下的波特率和串口外設時鐘息息相關,USART 1的時鐘來源於APB2,USART 2-5的時鐘來源於APB1。在STM32中,有個波特率寄存器USART_BRR,如下: STM32串口波特率通過USART_BRR進行設置,STM32的波特率寄存器支持分數設置,以提高精確度。USART_BRR的前4位用於表示小數,後12位用於表示整數。但是它還不是我們想要設置的波特率,想要設置我們串口的波特率大小還需要進行計算。其實有關波特率的計算是下面這一條表達式: 從上面的表達式,我們引入了一個新量USARTDIV,它表示對串口的時鐘源fck進行分頻。假設我們已知道了波特率和fck時鐘頻率的大小,那麼通過上式便可以計算出USARTDIV的具體大小,然後再通過USART的值大小對波特率寄存器進行設置。 USARTDIV通過上面的表達式得出,是一個帶有小數的浮點數(如27.75)。將小數部分和整數部分分開,分別得到一個整數值n(如27)和一個小數值m(如0.75)。有了這兩個值我們便可以填寫USART_BRR寄存器進而設置我們串口波特率大小了。 將整數部分m(27 = 0x1B)直接寫入USART_BRR的後12位部分;將小數部分n乘以16後得到的整數值(如0.75 x 16 = 12 = 0xC)寫入USART_BRR前4位部分,最後USART_BRR的值為0x1BC。 注意:如果小數部分乘以16之後仍帶有小數,則要四捨五入去除小數部分得到一個新的整數,再將其寫入USART_BRR的前四位。 為什麼在計算波特率的公式中要乘以16 我們知道串口通信是通過TXD和RXD這兩條線進行通信的,當接收器的RXD連接着發送器的TXD,接收器的TXD連接着發送器的RXD,接收器和發送器可以通過RXD和TXD互傳數據。當接收器檢測到RXD這條線的電平被拉為低電平,立即開始接收發送器發送過來的數據,剛剛那個低電平只是一個告知接收器可以接收數據的起始位而已。 在數據的傳輸中,信號可能受到一些干擾而產生一些抖動,如下圖。如果接收端只對這些信號數據採樣一次,那麼它有可能採樣到的是抖動的不準的數據,進而使數據傳輸不準確,所以接收端在採樣數據線上的數據,通常都要採樣多次,然後通過比較獲得準確的數據。 前面已經説過,USARTDIV,它表示對串口的時鐘源fck進行分頻,而這16表示的正是1bit數據的採樣次數。為什麼呢? 將這個表達式的分子分母倒過來,可以得到下面這條表達式 每一位的傳輸時間只有1/TX_baud,這個總時間除以16,所以每採樣一次的時間正好是T1,即新分頻後的週期。而初始的串口時鐘信號來自於APBx,APBx時鐘信號需要經過分頻才會等於T1,所以才需要分頻USARTDIV。 精彩文章推薦: STM32基礎分析——PWM配置 STM32單片機:獨立看門狗、窗口看門狗的配置 STM32如何配置外部中斷? stm32-hal庫開發簡介 STM32定時器如何配置? 如何高效閲讀《STM32參考手冊》?大神來教你! STM32只會用庫函數,不會用寄存器,能寫好程序嗎? 免責聲明:本文內容由21ic獲得授權後發佈,版權歸原作者所有,本平台僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平台立場,如有問題,請聯繫我們,謝謝!

    時間:2020-11-24 關鍵詞: 單片機 數字信號

  • 華為內部資料:電容的介紹和深入認識

    無源濾波元器件中,電容是一個很重要的基本元器件,但應用中由於對電容的認識不深,存在一些不正確的使用而造成問題。本文主要針對常用的三類電容(鋁電容、鉭電容和陶瓷電容),從電容結構、製造工藝入手,結合濾波模型關注的參數性能進行深入的剖析,最後引出如何正確可靠應用電容。結構上採取每類電容一大章,每一章三小節分析:第一小節簡單介紹電容的結構和生產加工工藝流程;第二小節為電容主要性能參數的變化特點,涉及到如何應用等方面;第三小節介紹電容使用中的物理可靠性問題需要關注的地方。同時附錄還對三類電容在參數、特性及應用上做了深入的比較。 精彩文章推薦: 初學不識“電容”意,再看已是電老炮 設計電路如何確定使用多大的電容?記住四種情況就夠了 電阻和電容並聯的幾個作用 為什麼要進行電容補償?如何補償? 免責聲明:本文內容由21ic獲得授權後發佈,版權歸原作者所有,本平台僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平台立場,如有問題,請聯繫我們,謝謝!

    時間:2020-11-24 關鍵詞: 元器件 電容

  • 高速PCB設計EMI的九大規則,工程師必看!

    隨着信號上升沿時間的減小及信號頻率的提高,電子產品的EMI問題越來越受到電子工程師的關注,幾乎60%的EMI問題都可以通過高速PCB來解決。 以下 是九大規則: 01 規則一:高速信號走線屏蔽規則 在高速的PCB設計中,時鐘等關鍵的高速信號線,走線需要進行屏蔽處理,如果沒有屏蔽或只屏蔽了部分,都會造成EMI的泄漏。建議屏蔽線,每1000mil,打孔接地。 02 規則二:高速信號的走線閉環規則 由於PCB板的密度越來越高,很多PCB LAYOUT工程師在走線的過程中,很容易出現一種失誤,即時鐘信號等高速信號網絡,在多層的PCB走線的時候產生了閉環的結果,這樣的閉環結果將產生環形天線,增加EMI的輻射強度。 03 規則三:高速信號的走線開環規則 規則二提到高速信號的閉環會造成EMI輻射,然而開環同樣會造成EMI輻射。 時鐘信號等高速信號網絡,在多層的PCB走線的時候一旦產生了開環的結果,將產生線形天線,增加EMI的輻射強度。 04 規則四:高速信號的特性阻抗連續規則 高速信號,在層與層之間切換的時候必須保證特性阻抗的連續,否則會增加EMI的輻射。也就是説,同層的佈線的寬度必須連續,不同層的走線阻抗必須連續。 05 規則五:高速PCB設計的佈線方向規則 相鄰兩層間的走線必須遵循垂直走線的原則,否則會造成線間的串擾,增加EMI輻射。 簡而言之,相鄰的佈線層遵循橫平豎垂的佈線方向,垂直的佈線可以抑制線間的串擾。 06 規則六: 高速PCB設計中的拓撲結構規則 在高速PCB設計中,線路板特性阻抗的控制和多負載情況下的拓撲結構的設計,直接決定着產品的成功還是失敗。 圖示為菊花鏈式拓撲結構,一般用於幾Mhz的情況下為益。高速PCB設計中建議使用後端的星形對稱結構。 07 規則七:走線長度的諧振規則 檢查信號線的長度和信號的頻率是否構成諧振,即當佈線長度為信號波長1/4的時候的整數倍時,此佈線將產生諧振,而諧振就會輻射電磁波,產生干擾。 08 規則八:迴流路徑規則 所有的高速信號必須有良好的迴流路徑。儘可能地保證時鐘等高速信號的迴流路徑最小。否則會極大的增加輻射,並且輻射的大小和信號路徑和迴流路徑所包圍的面積成正比。 09 規則九:器件的退耦電容擺放規則 退耦電容的擺放的位置非常的重要。擺放不合理根本起不到退耦的效果。其原則是:靠近電源的管腳,並且電容的電源走線和地線所包圍的面積最小。 相關文章推薦: EMC相關:有效降低傳導輻射干擾的技巧 EMC抗干擾設計——RS485 接口的電磁兼容設計 什麼是電氣間隙,什麼是爬電距離,PCB為什麼要開槽? 電磁繼電器的幾個參數,瞭解完就會用繼電器 模擬量傳感器如何抗干擾,有哪些措施? PCB板邊緣的敏感線為何容易ESD干擾 如何選用電源濾波器,電源濾波器有哪些重要參數? 免責聲明:本文內容由21ic獲得授權後發佈,版權歸原作者所有,本平台僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平台立場,如有問題,請聯繫我們,謝謝!

    時間:2020-11-24 關鍵詞: 電磁 PCB

  • 封裝圖鑑:掌握這17種元器件PCB封裝,設計板子就容易多了!

    素材來源:張飛實戰電子 元器件封裝的構建是PCB設計中的一個重要環節,小小的一個錯誤很可能導致整個板子都不能工作以及工期的嚴重延誤。常規器件的封裝庫一般CAD工具都有自帶,也可以從器件原廠的設計文檔、參考設計源圖中獲取。 封裝名稱與圖形如下: 01 晶體管 02 晶振 03 電感 04 接插件 05 Discrete Components 06 電容 07 可變電容 08 數碼管 09 可調電阻 010 電阻 011 排阻 012 繼電器 013 撥碼開關 014 跳線 015 集成電路 016 1.5mmBGA 017 1mmBGA 018 1.27mm BGA 良好合格的一個器件封裝,應該需要滿足以下幾個條件: 1、設計的焊盤,應能滿足目標器件腳位的長、寬和間距的尺寸要求。特別是要注意:器件引腳本身產生的尺寸誤差,在設計時要考慮進去--- 特別是精密、細節的器件和接插件。不然,有可能會導致不同批次來料的同型號器件,雖然焊接加工良率高,但卻發生大的生產品質問題!因此,焊盤的兼容性設計(合適、通用於多數大廠家的器件焊盤尺寸設計),是很重要的! 關於這一點,最簡單的要求和檢驗方法就是:把實物的目標器件放到PCB板的焊盤上進行觀察,如果器件的每個引腳都處在相應的焊盤區域裏。那這個焊盤的封裝設計,基本上是沒有多大問題。反之,如果部分引腳不在焊盤裏,那就不太好。 2、設計的焊盤,應該有明顯的方向標識,最好是通用、易辨別的方向極性標識。不然,在沒有合格的PCBA實物樣品做參考的時候,第三方(SMT工廠或私人外包)來做焊接加工,就容易發生極性焊反,焊錯的問題! 3、設計的焊盤,應該能符合具體那個PCB線路廠本身的加工參數、要求和工藝。比如,能設計的焊盤線大小、線間距、字符長寬是多少等等。如果PCB尺寸較大,建議大家按市面流行、通用的PCB工廠的工藝進行設計,以因品質或商業合作問題而發生更換PCB供應商的時候,可選擇的PCB廠家太少而耽擱了生產進度。 精彩文章推薦: 電容實物、封裝,區分正負極的方法 電子入門基礎知識之:封裝 八層板PCB設計,電腦主板設計分析 太美了!PCB佈線怎麼可以這麼美? PCB迴流是什麼?如何解決? PCB大神的那些專屬技巧和風騷走位 免責聲明:本文內容由21ic獲得授權後發佈,版權歸原作者所有,本平台僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平台立場,如有問題,請聯繫我們,謝謝!

    時間:2020-11-24 關鍵詞: 電路板 PCB

  • C語言中的三目運算符是啥?有何用處?

    一般來説,C語言中的三目運算符為 a?b:c 即有三個參與運算的量。 由條件運算符組成條件表達式的一般形式為: 表達式1? 表達式2:表達式3 求值規則為:如果表達式1的值為真,則以表達式2 的值作為條件表達式的值,否則以表達式2的值作為整個條件表達式的值。條件表達式通常用於賦值語句之中。 例如條件語句: if(a>b) max=a;else max=b; 可用條件表達式寫為 max=(a>b)?a:b; 執行該語句的語義是: 如a>b為真,則把a賦予max,否則把b 賦予max。 在我們使用條件表達式時,還應注意以下幾點: (1)條件運算符的運算優先級低於關係運算符和算術運算符,但高於賦值符。因此 max=(a>b)?a:b可以去掉括號而寫為 max=a>b?a:b (2)條件運算符?和:是一對運算符,不能分開單獨使用。 (3)條件運算符的結合方向是自右至左。 例如: a>b?a:c>d?c:d應理解為a>b?a:(c>d?c:d) 這也就是條件表達式嵌套的情形,即其中的表達式3又是一個條件表達式。 void main(){int a,b,max;printf("\n input two numbers: ");scanf("%d%d",&a,&b);printf("max=%d",a>b?a:b);//對於“三目運算符是什麼”,可以理解為if() 語句一;else 語句二;a? b : c} 三目運算符簡單好用。 相關文章推薦: 都説C語言的精髓是指針,但是指針太難懂了,怎麼辦? 求求你,別再寫這麼多if...else...了 根據時序編程,單片機驅動74HC595實現數碼管顯示 大佬故事:初中開始學編程,大學畢業後直接進微軟... 免責聲明:本文內容由21ic獲得授權後發佈,版權歸原作者所有,本平台僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平台立場,如有問題,請聯繫我們,謝謝!

    時間:2020-11-24 關鍵詞: 嵌入式 C語言

  • 八層板PCB設計,電腦主板設計分析

    來源於網絡的前輩PCB作品 學好PCB設計的方法之一就是通過前輩的作品學習前輩的設計方法和技巧。 我們能在前輩的作品中學到元件佈局、板層設置、線路佈線 板層設置 1. 信號層(TOP) 第一層信號層,又叫頂層,實物打板回來是能夠看得見的一層,可以擺放電子元件的一層。由上圖可見這層佈線比較多。原因之一就是電子元件的擺放在同一層,走線的過程中不需要設置過孔轉換層。這樣可以避免過孔阻礙其他層的走線。在多層板佈線反而要注意過孔的設置。 2. 電源層(VCC) 在這層沒有看到走線。是因為這一層都是電源網絡。在設計時使用特定的線進行電源分割,前提需要在電子元件佈局的時候把同一電壓的電子元件擺放在一個區域內,通過過孔連接到這一層的相同區域,所以不需要走線。 3. 信號層(Inner Layer3) 這層主要走信號線,其次還有一些電源走線。下圖圖中比較大一點的走線就是電源線,小的為信號線。 4. 信號層(Inner Layer4) 這層與上一層走線佈置基本上一樣。走線為信號線和電源線。 5. GND層 這層為GND網絡層,通過過孔連接。 6. 信號層(Inner Layer5) 7. GND層 圖片略。 這層與第5層一樣。 8. Bottom層 這層跟頂層一樣。很多的小芯片走線基本上都在頂層或者這一層。 走線或者佈線 1. 蛇形走線 這種走線看起來感覺挺漂亮的。這樣走線的目的是為了延長走線的總長度。應用在並行數據線中,使同一組並行數據線的走線長度一致,這樣在高速傳輸數據的時候數據到達的時間保持一致。 蛇形走線的佈線步驟是先使用普通的走線佈線完同一組並行數據線。然後找出這一組數據線長度最長的線,再以這跟最長的線的長度為參考把比這個參考值小的線通過蛇形走線延長到與參考值相等或者到達這個參考值的一定範圍之內。相關走線佈線功能一般的電路板設計軟件都有隻需要設置相關參數就可以。 2. 差分線 差分線其實跟上面的蛇形非常相似,上面的蛇形走線是一組數據線。而差分線只有兩根線。但是比蛇形走線的要求更高,更嚴格。不但要線的長度一致,還需要線與線的距離保持一定的距離。還好相關的軟件都有這種走線的功能,也只需要設置相關的參數即可。 3. 大走線或者寬走線 在佈線中比較大的線一般為電源走線,這跟元件負載有關,相關理論就不在這細説了。 元件佈局 以上就是前輩作品中的元件佈局,是不是很好看。元件佈局基本上都是按照模塊化的設計方式進行佈局,這樣佈局的好處就是把實現同一功能的相關電子元件佈局在一起使得小模塊內的走線長度可以更短,小模塊放置在大模塊的時候方便框選完整的模塊。在佈線的時候不要走太多的彎路。 同類文章推薦: 太美了!PCB佈線怎麼可以這麼美? 你常用哪種軟件畫原理圖和PCB PCB大神的那些專屬技巧和風騷走位 PCB的誕生,奠定了電子行業發展的基礎 為什麼電路板有綠色、黑色等?有什麼區別嗎? 芯片要焊接在電路板上嗎?SMT流程怎樣? 免責聲明:本文內容由21ic獲得授權後發佈,版權歸原作者所有,本平台僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平台立場,如有問題,請聯繫我們,謝謝!

    時間:2020-11-24 關鍵詞: 電路板 PCB

  • 女工程師的自嘲:聰明的女生,長大後都變成了男人

    我,理工科,研究生,女的。 從今天早上起,我就一直被一個問題糾結到現在。我九點起來,十點出門,刷牙洗臉穿衣服不超過十分鐘,也就是説,我花了五十分鐘,還是沒能成功的刷上一層正常的睫毛膏。我可以花兩分鐘焊接一個176腳的 DSP芯片,每一個腳的寬度都不會超過我的睫毛,兩分鐘我可以均勻的刷176個腳的焊錫,但我花20分鐘都沒辦法刷勻我絕對不超過176根的眼睫毛!雖然 一直被玩笑,但我今天真的覺得,我可能真不是個女的。 前天晚上走在回宿舍路上,和師妹對話:我:晚上回去把打毛球的充一下電,我用下。師妹:好,可是那個電池現在不太好,充一晚上也只能用個半小時。我:哦,是5V供電的麼?是的話我們可以帶個開關電源回去,直接連着用。師妹:…… 好吧,我覺得我可能真的不是一個女的。回想起情人節晚上,吃飯時見了男朋友兄弟的老婆,目測不超過95斤,外套沒注意,脱了外套穿黑色花邊襯衫,頭髮挽起來,精緻妝容,笑容甜美,喝卡布奇諾。我費心的買了一件終於不是黑色的大衣,結果還不堪的起了一身毛球,因為怕冷,大衣裏面的毛衣裏面還有一件棉衣,披頭散髮,頭髮下面因為燙卷又用了洗髮皂的 緣故,已經好久沒有梳開了,妝容就更別提了,純裸妝,真心純裸妝。裝逼的點了個卡布奇諾,喝了一口,果斷換了加冰可樂。問他們晚上去看什麼電影,小女子悠悠告訴我們説去看LOVE。被問到下午我倆去看了什麼電影,男朋友無奈的:地心歷險記2,是她要看的。親愛的,我真心是給你丟人了……好吧,我覺得我確實可能不是女的。我到底是從什麼時候開始不是女的了呢?小學的時候還是臭美的,穿裙子,這時候估計還是女的。初中了,細細瘦瘦的,應該也還是女的。高中,好像就沒再穿過裙子了,然後,被作為學習好的,聰明的一類,選擇了理工科。後來,可能就是我悲劇的開始。媽媽會對姐姐説:穿好衣服出去買點菜。穿好衣服出去買個饃。穿好衣服出去買……媽媽會對我説:穿箇舊衣服去地下室幫你爸抬個啥。家裏啥啥壞了,你看看怎麼回事……上大學以後,在大街上能讓我駐足回頭的,不是黑絲美女就是光腿美女。悲催的想起一個週末,我和室友在樓下洗自行車(借的,被我倆騎到泥巴里,不洗乾淨不好意思還),看着文科的美女們,一個個花枝招展的打着小陽傘出去約會了……好吧,我應該真不是個女的。大四畢業,最多的行李就是被子,無數的被子,原諒我來自寒冷的北方,卻受不了南方的冷。真正女生的行李,牛逼的我見過光鞋盒就不下40個的,我他媽鞋可能就只有四雙!還大都是運動鞋!就一雙女人一點的單鞋,還被我穿去爬了一趟紫金山,毀了…… 好吧,我開始接受自己不是個女的了。今年寒假回學校,路上聽MP3,發現帶的大耳機夾耳朵,帶了的小耳機又是電話上的耳機,插着試了試發現接口倒是一樣,就是隻能聽見伴奏,要按下通話鍵才聽 得到歌聲,可是又不能一直按着。果斷拆開,看到通話鍵是個小觸點開關,撕了一點紙,疊好,按在開關上,再把殼子裝好,開關果斷壓住,搞定!躺在鋪上聽着歌,一股悲涼油然而生啊……好吧,我真心不是個女的!現在看來,也許在男生眼中,女生 有才就是缺德。我拆裝手機、筆記本、耳機,修理電器,都不如能判斷一件大衣是不是起毛球來的有魅力。我依舊還是不會化妝,依舊還是喜歡看美女,依舊還是喜 歡搗鼓電路,依舊還是喜歡喝可樂,最喜歡吃的是洋快餐,看不懂新潮的裝扮,冬天穿衣服只希望不會凍着,夏天下定決心改頭換面而買的衣服都沒穿出過門,兩條 長裙只能拿來當睡衣……好吧,我是爺們,純的。我可以自己修電腦,自己裝軟件,自己下電影。我可以一個人吃飯,可以幾個月不逛街,可以買到的衣服功能僅限於遮羞和禦寒。我可以自己提大包小包大行李,逛 超市買兩箱牛奶也絕對搬得回來。我可以一個人在異鄉平安順利的度過七個年頭,我強大到足夠照顧自己,也許還能順帶照顧別人。想你或者想家的時候我也會哭會 難受,聽到有人向你示好我可以裝的很大度,我可以不吃醋,假裝不在乎,但真心話我就不告訴你,覺得失了大氣。好吧,我是個有些懶,有點胖,不打扮,不好看,感情小遲鈍,工作精明,生活獨立,內心軟弱的理工科研究生,性別不詳。是不是聰明一點的理工科女生,都變成了男人…… 有趣文章推薦: 尼瑪,Github上最邪惡的開源項目了!女孩子勿進哦~ 牛人自述,我是華為編譯器的優化師 中國“最牛”程序員,一人之力單挑微軟 什麼程序員也有自己的節日?1024,1GB 如何找一份不加班的工作 免責聲明:本文內容由21ic獲得授權後發佈,版權歸原作者所有,本平台僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平台立場,如有問題,請聯繫我們,謝謝!

    時間:2020-11-24 關鍵詞: 電路板 焊接 PCB

  • 一文了解PID算法

    PID的數學模型 在工業應用中PID及其衍生算法是應用最廣泛的算法之一,是當之無愧的萬能算法,如果能夠熟練掌握PID算法的設計與實現過程,對於一般的研發人員來講,應該是足夠應對一般研發問題了,而難能可貴的是,在很多控制算法當中,PID控制算法又是最簡單,最能體現反饋思想的控制算法,可謂經典中的經典。經典的未必是複雜的,經典的東西常常是簡單的,而且是最簡單的。PID算法的一般形式: PID算法通過誤差信號控制被控量,而控制器本身就是比例、積分、微分三個環節的加和。這裏我們規定(在t時刻): 1.輸入量為 2.輸出量為 3.偏差量為  PID算法的數字離散化 假設採樣間隔為T,則在第K個T時刻: 偏差=  積分環節用加和的形式表示,即  微分環節用斜率的形式表示,即 PID算法離散化後的式子:  則可表示成為:   其中式中: 比例參數 :控制器的輸出與輸入偏差值成比例關係。系統一旦出現偏差,比例調節立即產生調節作用以減少偏差。特點:過程簡單快速、比例作用大,可以加快調節,減小誤差;但是使系統穩定性下降,造成不穩定,有餘差。 積分參數 :積分環節主要是用來消除靜差,所謂靜差,就是系統穩定後輸出值和設定值之間的差值,積分環節實際上就是偏差累計的過程,把累計的誤差加到原有系統上以抵消系統造成的靜差。 微分參數 :微分信號則反應了偏差信號的變化規律,或者説是變化趨勢,根據偏差信號的變化趨勢來進行超前調節,從而增加了系統的快速性。 PID的基本離散表示形式如上。目前的這種表述形式屬於位置型PID,另外一種表述方式為增量式PID,由上述表達式可以輕易得到: 那麼: 上式就是離散化PID的增量式表示方式,由公式可以看出,增量式的表達結果和最近三次的偏差有關,這樣就大大提高了系統的穩定性。需要注意的是最終的輸出結果應該為: 輸出量 =  + 增量調節值 目的 PID 的重要性應該無需多説了,這個控制領域的應用最廣泛的算法了. 本篇文章的目的是希望通過一個例子展示算法過程,並解釋以下概念: (1)簡單描述何為PID, 為何需要PID,PID 能達到什麼作用。 (2)理解P(比例環節)作用:基礎比例環節。 缺點: 產生穩態誤差. 疑問: 何為穩態誤差 為什麼會產生穩態誤差. (3)理解I(積分環節)作用:消除穩態誤差. 缺點: 增加超調 疑問: 積分為何能消除穩態誤差? (4) 理解D(微分環節)作用:加大慣性響應速度,減弱超調趨勢 疑問: 為何能減弱超調 (5)理解各個比例係數的作用 何為PID以及為何需要PID? 以下即PID 控制的整體框圖,過程描述為:  設定一個輸出目標,反饋系統傳回輸出值,如與目標不一致,則存在一個誤差,PID 根據此誤差調整輸入值,直至輸出達到設定值. 疑問: 那麼我們為什麼需要PID 呢,比如我控制温度,我不能監控温度值,温度值一到就停止嗎? 這裏必須要先説下我們的目標,因為我們所有的控制無非就是想輸出能夠達到我們的設定,即如果我們設定了一個目標温度值,那麼我們想要一個什麼樣的温度變化呢. 比如設定目標温度為30度, 目標無非是希望達到圖1 希望其能夠快速而且沒有抖動的達到30度. 那這樣大家應該就明白,如果使用温度一到就停止的辦法,當然如果要求不高可能也行,當肯定達不到圖1 這樣的要求,因為温度到了後餘温也會讓温度繼續升高.而且温度自身也會通過空氣散熱的. 圖  系統輸出的響應目標 綜上所述,我們需要PID的原因無非就是普通控制手段沒有辦法使輸出快速穩定的到達設定值。 控制器的P,I,D項選擇 下面將常用的各種控制規律的控制特點簡單歸納一下:(1)、比例控制規律P:採用P控制規律能較快地克服擾動的影響,它的作用於輸出值較快,但不能很好穩定在一個理想的數值,不良的結果是雖較能有效的克服擾動的影響,但有餘差出現。它適用於控制通道滯後較小、負荷變化不大、控制要求不高、被控參數允許在一定範圍內有餘差的場合。如:金彪公用工程部下設的水泵房冷、熱水池水位控制;油泵房中間油罐油位控制等。(2)、比例積分控制規律(PI):在工程中比例積分控制規律是應用最廣泛的一種控制規律。積分能在比例的基礎上消除餘差,它適用於控制通道滯後較小、負荷變化不大、被控參數不允許有餘差的場合。如:在主線窯頭重油換向室中F1401到F1419號槍的重油流量控制系統;油泵房供油管流量控制系統;退火窯各區温度調節系統等。(3)、比例微分控制規律(PD):微分具有超前作用,對於具有容量滯後的控制通道,引入微分參與控制,在微分項設置得當的情況下,對於提高系統的動態性能指標,有着顯著效果。因此,對於控制通道的時間常數或容量滯後較大的場合,為了提高系統的穩定性,減小動態偏差等可選用比例微分控制規律。如:加熱型温度控制、成分控制。需要説明一點,對於那些純滯後較大的區域裏,微分項是無能為力,而在測量信號有噪聲或週期性振動的系統,則也不宜採用微分控制。如:大窯玻璃液位的控制。(4)、例積分微分控制規律(PID):PID控制規律是一種較理想的控制規律,它在比例的基礎上引入積分,可以消除餘差,再加入微分作用,又能提高系統的穩定性。它適用於控制通道時間常數或容量滯後較大、控制要求較高的場合。如温度控制、成分控制等。鑑於D規律的作用,我們還必須瞭解時間滯後的概念,時間滯後包括容量滯後與純滯後。其中容量滯後通常又包括:測量滯後和傳送滯後。測量滯後是檢測元件在檢測時需要建立一種平衡,如熱電偶、熱電阻、壓力等響應較慢產生的一種滯後。而傳送滯後則是在傳感器、變送器、執行機構等設備產生的一種控制滯後。純滯後是相對與測量滯後的,在工業上,大多的純滯後是由於物料傳輸所致,如:大窯玻璃液位,在投料機動作到核子液位儀檢測需要很長的一段時間。總之,控制規律的選用要根據過程特性和工藝要求來選取,決不是説PID控制規律在任何情況下都具有較好的控制性能,不分場合都採用是不明智的。如果這樣做,只會給其它工作增加複雜性,並給參數整定帶來困難。當採用PID控制器還達不到工藝要求,則需要考慮其它的控制方案。如串級控制、前饋控制、大滯後控制等。Kp,Ti,Td三個參數的設定是PID控制算法的關鍵問題。一般説來編程時只能設定他們的大概數值,並在系統運行時通過反覆調試來確定最佳值。因此調試階段程序須得能隨時修改和記憶這三個參數。數字PID控制器(1)模擬PID控制規律的離散化   (2)數字PID控制器的差分方程 參數的自整定在某些應用場合,比如通用儀表行業,系統的工作對象是不確定的,不同的對象就得采用不同的參數值,沒法為用户設定參數,就引入參數自整定的概念。實質就是在首次使用時,通過N次測量為新的工作對象尋找一套參數,並記憶下來作為以後工作的依據。具體的整定方法有三種:臨界比例度法、衰減曲線法、經驗法。1、臨界比例度法(Ziegler-Nichols)1.1  在純比例作用下,逐漸增加增益至產生等副震盪,根據臨界增益和臨界週期參數得出PID控制器參數,步驟如下:(1)將純比例控制器接入到閉環控制系統中(設置控制器參數積分時間常數Ti =∞,實際微分時間常數Td =0)。(2)控制器比例增益K設置為最小,加入階躍擾動(一般是改變控制器的給定值),觀察被調量的階躍響應曲線。(3)由小到大改變比例增益K,直到閉環系統出現振盪。(4)系統出現持續等幅振盪時,此時的增益為臨界增益(Ku),振盪週期(波峯間的時間)為臨界週期(Tu)。(5) 由表1得出PID控制器參數。 表1 1.2  採用臨界比例度法整定時應注意以下幾點:(1)在採用這種方法獲取等幅振盪曲線時,應使控制系統工作在線性區,不要使控制閥出現開、關的極端狀態,否則得到的持續振盪曲線可能是“極限循環”,從線性系統概念上説系統早已處於發散振盪了。(2)由於被控對象特性的不同,按上表求得的控制器參數不一定都能獲得滿意的結果。對於無自平衡特性的對象,用臨界比例度法求得的控制器參數往住使系統響應的衰減率偏大(ψ>0.75 )。而對於有自平衡特性的高階等容對象,用此法整定控制器參數時系統響應衰減率大多偏小(ψ<0.75 )。為此,上述求得的控制器參數,應針對具體系統在實際運行過程中進行在線校正。(3) 臨界比例度法適用於臨界振幅不大、振盪週期較長的過程控制系統,但有些系統從安全性考慮不允許進行穩定邊界試驗,如鍋爐汽包水位控制系統。還有某些時間常數較大的單容對象,用純比例控制時系統始終是穩定的,對於這些系統也是無法用臨界比例度法來進行參數整定的。(4)只適用於二階以上的高階對象,或一階加純滯後的對象,否則,在純比例控制情況下,系統不會出現等幅振盪。1.3  若求出被控對象的靜態放大倍數KP=△y/△u ,則增益乘積KpKu可視為系統的最大開環增益。通常認為Ziegler-Nichols閉環試驗整定法的適用範圍為: (1) 當KpKu > 20時,應採用更為複雜的控制算法,以求較好的調節效果。(2)當KpKu < 2時,應使用一些能補償傳輸遲延的控制策略。(3)當1.5 (4)當KpKu< 1.5時,在對控制精度要求不高的場合仍可使用PI控制器,在這種情況下,微分作用已意義不大。2、衰減曲線法 衰減曲線法與臨界比例度法不同的是,閉環設定值擾動試驗採用衰減振盪(通常為4:1或10:l),然後利用衰減振盪的試驗數據,根據經驗公式求取控制器的整定參數。整定步驟如下:(1)在純比例控制器下,置比例增益K為較小值,並將系統投入運行。(2)系統穩定後,作設定值階躍擾動,觀察系統的響應,若系統響應衰減太快,則減小比例增益K;反之,應增大比例增益K。直到系統出現如下圖(a)所示的4:1衰減振盪過程,記下此時的比例增益Ks及和振盪週期Ts數值。 (3)利用Ks和Ts值,按下表給出的經驗公式,計算出控制器的參數整定值。      (4)10:1衰減曲線法類似,只是用Tr帶入計算。 採用衰減曲線法必須注意幾點:(1)加給定干擾不能太大,要根據生產操作要求來定,一般在5%左右,也有例外的情況。(2)必須在工藝參數穩定的情況下才能加給定干擾,否則得不到正確得 整定參數。(3)對於反應快的系統,如流量、管道壓力和小容量的液位調節等,要得到嚴格的4:1衰減曲線較困難,一般以被調參數來回波動兩次達到穩定,就近似地認為達到4:1衰減過程了。(4)投運時,先將K放在較小的數值,把Ti減少到整定值,把Td逐步放大到整定值,然後把K拉到整定值(如果在K=整定值的條件下很快地把Td放到整定值,控制器的輸出會劇烈變化)。3、經驗整定法3.1方法一A:(1)確定比例增益使PID為純比例調節,輸入設定為系統允許最大值的60%~70%,由0逐漸加大比例增益至系統出現振盪;再反過來,從此時的比例增益逐漸減小至系統振盪消失,記錄此時的比例增益,設定PID的比例增益P為當前值的60%~70%。(2)確定積分時間常數比例增益P確定後,設定一個較大的積分時間常數Ti的初值,然後逐漸減小Ti至系統出現振盪,之後在反過來,逐漸加大Ti至系統振盪消失。記錄此時的Ti,設定PID的積分時間常數Ti為當前值的150%~180%。(3)確定積分時間常數Td積分時間常數Td一般不用設定,為0即可。若要設定,與確定 P和Ti的方法相同,取不振盪時的30%。(4)系統帶載聯調,再對PID參數進行微調,直至滿足要求。 3.2 方法一B:(1)PI調節(a)純比例作用下,把比例度從較大數值逐漸往下降,至開始產生週期振盪(測量值以給定值為中心作有規則得振盪),在產生週期性振盪得情況下,把此比例度逐漸加寬直至系統充分穩定。(b)接下來把積分時間逐漸縮短至產生振盪,此時表示積分時間過短,應把積分時間稍加延長,直至振盪停止。(2)PID調節(a)純比例作用下尋求起振點。(b)加大微分時間使振盪停止,接着把比例度調得稍小一些,使振盪又產生,加大微分時間,使振盪再停止,來回這樣操作,直至雖加大微分時間,但不能使振盪停止,求得微分時間的最佳值,此時把比例度調得稍大一些直至振盪停止。(c)把積分時間調成和微分時間相同的數值,如果又產生振盪則加大積分時間直至振盪停止。3.3 方法二:另一種方法是先從表列範圍內取Ti的某個數值,如果需要微分,則取Td=(1/3~1/4)Ti,然後對δ進行試湊,也能較快地達到要求。實踐證明,在一定範圍內適當地組合δ和Ti的數值,可以得到同樣衰減比的曲線,就是説,δ的減少,可以用增加Ti的辦法來補償,而基本上不影響調節過程的質量。所以,這種情況,先確定Ti、Td再確定δ的順序也是可以的。而且可能更快些。如果曲線仍然不理想,可用Ti、Td再加以適當調整。3.4 方法三:(1)在實際調試中,也可以先大致設定一個經驗值,然後根據調節效果修改。  流量系統:P(%)40--100,I(分)0.1--1  壓力系統:P(%)30--70,   I(分)0.4--3       液位系統:P(%)20--80,   I(分)1—5  温度系統:P(%)20--60,   I(分)3--10,D(分)0.5--3(2)以下整定的口訣:階躍擾動投閉環,參數整定看曲線;先投比例後積分,最後再把微分加;理想曲線兩個波,振幅衰減4比1;比例太強要振盪,積分太強過程長;動差太大加微分,頻率太快微分降;偏離定值回覆慢,積分作用再加強。4、複雜調節系統的參數整定以串級調節系統為例來説明覆雜調節系統的參數整定方法。由於串級調節系統中,有主、副兩組參數,各通道及迴路間存在着相互聯繫和影響。改變主、副迴路的任一參數,對整個系統都有影響。特別是主、副對象時間常數相差不大時,動態聯繫密切,整定參數的工作尤其困難。在整定參數前,先要明確串級調節系統的設計目的。如果主要是保證主參數的調節質量,對副參數要求不高,則整定工作就比較容易;如果主、副參數都要求高,整定工作就比較複雜。下面介紹“先副後主”兩步參數整定法。第一步:在工況穩定情況下,將主迴路閉合,把主控制器比例度放在100%,積分時間放在最大,微分時間放在零。用4:1衰減曲線整定副迴路,求出副迴路得比例增益K2s和振盪週期T2s。第二步:把副迴路看成是主迴路的一個環節,使用4:1衰減曲線法整定主迴路,求得主控制器K1s和T1s。根據K1s、K2s、T1s、T2s按表2經驗公式算出串級調節系統主、副迴路參數。先放上副迴路參數,再放上主迴路參數,如果得到滿意的過渡過程,則整定工作完畢。否則可進行適當調整。如果主、副對象時間常數相差不大,按4:1衰減曲線法整定,可能出現“共振”危險,這時,可適當減小副迴路比例度或積分時間,以達到減少副迴路振盪週期的目的。同理,加大主迴路比例度或積分時間,以期增大主迴路振盪週期,使主、副迴路振盪週期之比加大,避免“共振”。這樣做的結果會降低調節質量。如果主、副對象特性太相近,則説明確定的方案欠妥當,就不能完全依靠參數整定來提高調節質量了。實際應用體會:一是利用數字PID控制算法調節直流電機的速度,方案是採用光電開關來獲得電機的轉動產生的脈衝信號,單片機(MSP430G2553)通過測量脈衝信號的頻率來計算電機的轉速(具體測量頻率的算法是採用直接測量法,定時1s測量脈衝有多少個,本身的測量誤差可以有0.5轉加減),測量的轉速同給定的轉速進行比較產生誤差信號,來產生控制信號,控制信號是通過PWM調整佔空比也就是調整輸出模擬電壓來控制的(相當於1位的DA,如果用10位的DA來進行模擬調整呢?效果會不會好很多?),這個實驗控制能力有一定的範圍,只能在30轉/秒和150轉/秒之間進行控制,當給定值(程序中給定的速度)高於150時,實際速度只能保持在150轉,這也就是此係統的最大控制能力,當給定值低於30轉時,直流電機轉軸實際是不轉動的,但由於誤差值過大,轉速會迅速變高,然後又會停止轉動,就這樣循環往復,不能達到控制效果。根據實測,轉速穩態精度在正負3轉以內,控制時間為4到5秒。實驗只進行到這種程度,思考和分析也只停留在這種深度。二是利用數字PID控制算法調節直流減速電機的位置,方案是採用與電機同軸轉動的精密電位器來測量電機轉動的位置和角度,通過測量得到的角度和位置與給定的位置進行比較產生誤差信號,然後位置誤差信號通過一定關係(此關係純屬根據想象和實驗現象來擬定和改善的)轉換成PWM信號,作為控制信號的PWM信號是先產生對直流減速電機的模擬電壓U,U來控制直流減速電機的力矩(不太清楚),力矩產生加速度,加速度產生速度,速度改變位置,輸出量是位置信號,所以之間應該對直流減速電機進行系統建模分析,仿真出直流減速電機的近似系統傳遞函數,然後根據此函數便可以對PID的參數進行整定了。兩次體會都不是特別清楚PID參數是如何整定的,沒有特別清晰的理論指導和實驗步驟,對結果的整理和分析也不夠及時,導致實驗深度和程度都不能達到理想效果。 怎樣形象理解PID算法 小明接到這樣一個任務: 有一個水缸點漏水(而且漏水的速度還不一定固定不變) 要求水面高度維持在某個位置 一旦發現水面高度低於要求位置,就要往水缸里加水。  小明接到任務後就一直守在水缸旁邊,時間長就覺得無聊,就跑到房裏看小説了,每30分鐘來檢查一次水面高度。水漏得太快,每次小明來檢查時,水都快漏完了,離要求的高度相差很遠,小明改為每3分鐘來檢查一次,結果每次來水都沒怎麼漏,不需要加水,來得太頻繁做的是無用功。 幾次試驗後,確定每10分鐘來檢查一次。這個檢查時間就稱為採樣週期。 開始小明用瓢加水,水龍頭離水缸有十幾米的距離,經常要跑好幾趟才加夠水,於是小明又改為用桶加,一加就是一桶,跑的次數少了,加水的速度也快了, 但好幾次將缸給加溢出了,不小心弄濕了幾次鞋,小明又動腦筋,我不用瓢也不用桶,老子用盆,幾次下來, 發現剛剛好,不用跑太多次,也不會讓水溢出。這個加水工具的大小就稱為比例係數。 小明又發現水雖然不會加過量溢出了,有時會高過要求位置比較多,還是有打濕鞋的危險。他又想了個辦法,在水缸上裝一個漏斗, 每次加水不直接倒進水缸,而是倒進漏斗讓它慢慢加。這樣溢出的問題解決了,但加水的速度又慢了,有時還趕不上漏水的速度。 於是他試着變換不同大小口徑的漏斗來控制加水的速度,最後終於找到了滿意的漏斗。漏斗的時間就稱為積分時間 。 小明終於喘了一口,但任務的要求突然嚴了,水位控制的及時性要求大大提高,一旦水位過低,必須立即將水加到要求位置,而且不能高出太多,否則不給工錢。 小明又為難了!於是他又開努腦筋,終於讓它想到一個辦法,常放一盆備用水在旁邊,一發現水位低了,不經過漏斗就是一盆水下去,這樣及時性是保證了,但水位有時會高多了。 他又在要求水面位置上面一點將水鑿一孔,再接一根管子到下面的備用桶裏這樣多出的水會從上面的孔裏漏出來。這個水漏出的快慢就稱為微分時間。 拿一個水池水位來説,我們 可以制定一個規則, 把水位分為超高、高、較高、中、較低、低、超低幾個區段; 再把水位波動的趨勢分為甚快、快、較快、慢、停幾個區段,並區分趨勢的正負; 把輸出分為超大幅 度、大幅度、較大幅度、微小几個區段。 當水位處於中值、趨勢處於停頓的時候,不調節; 當水位處於中值、趨勢緩慢變化的時候,也可以暫不調節; 當水位處於較高、趨勢緩慢變化 的時候,輸出一個微小調節兩就夠了; 當水位處於中值、趨勢較快變化的時候,輸出進行叫 大幅度調節……。 如上所述,我們需要制定一個控制規則表,然後制定參數判斷水位區段的界值、波動趨 勢的界值、輸出幅度的界值。 比例控制(P)是一種最簡單的控制方式。其控制器的輸出與輸入誤差信號成比例關係。 根據設備有所不同,比例帶一般為2~10%(温度控制)。 但是,僅僅是P控制的話,會產生下面將提到的offset (穩態誤差),所以一般加上積分控制(I),以消除穩態誤差。 比例帶與比例控制(P)輸出的關係如圖所示。用MVp運算式的設定舉例: 穩態誤差(Off set) 比例控制中,經過一定時間後誤差穩定在一定值時,此時的誤差叫做穩態誤差(off set)。 僅用比例控制的時候,根據負載的變動及設備的固有特性不同,會出現不同的穩態誤差。 負載特性與控制特性曲線的交點和設定值不一致是產生穩態誤差的原因。 比例帶小時不會產生。為消除穩態誤差,我們設定手動復位值--manual reset值(MR),以消除控制誤差。 手動復位(Manual reset) 如前所述,僅用比例控制不能消除穩態誤差。 為此,將MR(manual reset值)設為可變,則可自由整定(即調整)調節器的輸出。 只要手動操作輸出相當於offset的量,就能與目標值一致。 這就叫做手動復位(manual reset),通常比例調節器上配有此功能。 在實際的自動控制中,每次發生off set時以手動進行reset的話,這樣並不實用。 在後面將敍述的積分控制功能,能自動消除穩態誤差。 所謂積分控制(I),就是在出現穩態誤差時自動的改變輸出量,使其與手動復位動作的輸出量相同,達到消除穩態誤差的目的。 當系統存在誤差時,進行積分控制,根據積分時間的大小調節器的輸出會以一定的速度變化,只要誤差還存在,就會不斷的進行輸出。 積分時間的定義:  當積分項和比例項對於控制器的輸出的貢獻相同,即積分作用重複了一次比例作用時所花費的時間,就是積分時間。 微分控制(D)的功能是通過誤差的變化率預報誤差信號的未來變化趨勢。通過提供超前控制作用,微分控制能使被控過程趨於穩定。 因此,它經常用來抵消積分控制產生的不穩定趨勢。 微分時間的定義:  當輸入量持續的以一定速率變化時,微分項和比例項對於控制器的輸出的貢獻相同,即微分作用重複了一次比例作用時所花費的時間,就是微分時間。 實際中如何使用 我們看一個生活例子,冬天洗熱水澡,需要先放掉一段時間的冷水,因為水管裏有一段冷水,熱水器也需要一個加熱過程,等過了這段時間之後水温有些接近目標值後,開始調節水龍頭來調節冷、熱水之間的比例及出水量,之後再慢慢的微調,在洗浴過程中感覺温度不合適,再一點點的調節。這個過程,其實就是PID算法過程。我們之所以微調,是因為水温的變化速度與我調節的速度不相匹配,存在一個滯後效應,我們需要調節一點點,等一下再感覺一下温度,不夠再調節一點點,再感覺,這個過程就叫PID算法,也可以説,滯後效應是引入PID的原因。 失去的能否找回來?能、只是我找回了鈕釦,卻發現衣服已經不再了。這個就是滯後效應。 負反饋系統,都有滯後效應,但為什麼運放、電源這類的卻從來不提PID算法呢?這是因為這類系統的滯後延時時間非常短,若考慮這個延時,負反饋引入180度相位,延時恰好引入180度相位,則完全可能引起振盪。問題在於這個延時時間足夠短,它的諧振頻率點比較高,以運放為例,加入延時加上負反饋引起的諧振點為10MHz,但這片運放的頻率響應是1MHz,則在10MHz下完全不可能導致振盪,因為這個芯片的頻響特性只有1MHz。我們常用的線性電源IC,比如SOT23封裝的LDO,假如輸出不加電容,就會輸出一個振盪的波形,相對來説電源IC的滯後效應比運放要大,但是,因為電源一般後面都要接大電容的,它的頻響特性很低,接近直流0Hz,所以當有電容時候,就無法振盪了。 而工業控制領域,比如温度等,都是滯後效應很嚴重的,往往都是mS,甚至是10mS級別的,若直接用負反饋,因為激勵與反饋的不同步,必然導致強烈的振盪,所以為了解決這個問題,我們需要引入PID算法,來實現這類滯後效應嚴重系統的負反饋控制,我們以高頻感應加熱設備加熱工件,從常温25度加熱到700度為例做説明: 1、25~600度,100%的全功率加熱工件,這是因為温差太大,前期要全功率,先加熱到靠近目標温度。之所以考慮在600度,是因為滯後效應,若設定太高,當發現接近700度再停下來,但實際上,温度會衝過700度。當然,600度是一個經驗值,以下幾個温度點都是經驗值,根據實際情況而來。 2、600以上,開啓P算法,P就是根據測量值與目標值的誤差來決定負反饋的大小。P算法公式:反饋=P*(當前温度-目標温度)。但因為負反饋是基於存在誤差為前提的,所以P算法導致一個問題,永遠到不了想要的值:700度。因為到了700度,反饋值就沒有了。P算法的開啓,進一步逼近了目標温度,假設穩態下可以達到650度,這樣就算因為滯後效應導致的延時,也不會超過700度太多。 3、當達到P算法的穩態極限650度附近的時候,比如640度,就應該開啓另外一個算法解決P算法引起的極限誤差,那就是I算法。I算法就是為了消除這個P算法導致的誤差值,畢竟我們想要的是700度,而不是650度。I算法,本質上講就是獲取一個700度下對應的一個驅動值,之後用這個驅動值來取代P算法,那麼我們怎麼得到這個驅動值呢,唯一的手段就是把之前的誤差都累加起來,最後得到一個期望值,這個期望值就是我們想要的驅動值。因為只要與目標值存在誤差,那麼把這些誤差值積累起來再去反饋控制,就能一步步的逼近目標值,這如同水温不夠高,再加一點點熱水,不夠高再加,這樣總能達到想要的水温。值得注意的是,I算法不能接入太高,必須要在P算法的後期介入,不然很容易積累過大。這個時候可以引入一個誤差門限,比如誤差為60,當作6來處理,誤差為50,當作5來處理,消除大的誤差值,具體根據項目情況決定。 4、當I算法把工件温度加熱到很接近目標温度後,那麼可以調節的範圍就很小了,最後一點點的微動,讓調節的每一次的變化,不要太大,這就是D算法。D算法本質上講就是反對劇烈的變化,所以適用於達到目標温度的時候。 PID算法其實不復雜,但從目前看,很多人都是因為對這三者的使用條件不瞭解導致的問題,都是從加熱一開始,三個要素都上,結果可想而知。P算法是温度接近目標值的時候用,I算法是在P算法到穩態極限的時候用,D算法是達到目標值附近的時候用。實際項目中,D算法一般不用,效果不大。假如非要找一個現實中對應的實物,那麼以開關電源為例,TL431基準電源比較器可以認為是P,輸出濾波電容C是I,輸出濾波電感是D,兩者完全等價。它們各自的應用工作點可以認為:假設目標温度700度,600~800度:P算法;640~760度:I算法;690~710度:D算法。具體值,以實驗為準,數據僅供參考。 最後給出一個PID最通俗的解讀:我們設計一樣東西,一般都是先打個樣,這個樣跟我們想要的接近,但細節沒到位,這就是P,樣有差異,所以就要修改,擬合逼近,這就是I,到了定稿,就不允許隨便修改了,就算要修改,也是有限制的修改,這就是D。 免責聲明:本文內容由21ic獲得授權後發佈,版權歸原作者所有,本平台僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平台立場,如有問題,請聯繫我們,謝謝!

    時間:2020-11-24 關鍵詞: 算法 PID

  • 都説C語言的精髓是指針,但是指針太難懂了,怎麼辦?

    素材直接來源:大魚機器人 説到指針,估計還是有很多小夥伴都還是雲裏霧裏的,有點“知其然,而不知其所以然”。但是,不得不説,學了指針,C語言才能算是入門了。指針是C語言的「精華」,可以説,對對指針的掌握程度,「直接決定」了你C語言的編程能力。 在講指針之前,我們先來了解下變量在「內存」中是如何存放的。 在程序中定義一個變量,那麼在程序編譯的過程中,系統會根據你定義變量的類型來分配「相應尺寸」的內存空間。那麼如果要使用這個變量,只需要用變量名去訪問即可。 通過變量名來訪問變量,是一種「相對安全」的方式。因為只有你定義了它,你才能夠訪問相應的變量。這就是對內存的基本認知。但是,如果光知道這一點的話,其實你還是不知道內存是如何存放變量的,因為底層是如何工作的,你依舊不清楚。 那麼如果要繼續深究的話,你就需要把變量在內存中真正的樣子是什麼搞清楚。內存的最小索引單元是1字節,那麼你其實可以把內存比作一個超級大的「字符型數組」。在上一節我們講過,數組是有下標的,我們是通過數組名和下標來訪問數組中的元素。那麼內存也是一樣,只不過我們給它起了個新名字:地址。每個地址可以存放「1字節」的數據,所以如果我們需要定義一個整型變量,就需要佔據4個內存單元。 那麼,看到這裏你可能就明白了:其實在程序運行的過程中,完全不需要變量名的參與。變量名只是方便我們進行代碼的編寫和閲讀,只有程序員和編譯器知道這個東西的存在。而編譯器還知道具體的變量名對應的「內存地址」,這個是我們不知道的,因此編譯器就像一個橋樑。當讀取某一個變量的時候,編譯器就會找到變量名所對應的地址,讀取對應的值。 初識指針和指針變量 那麼我們現在就來切入正題,指針是個什麼東西呢? 所謂指針,就是內存地址(下文簡稱地址)。C語言中設立了專門的「指針變量」來存儲指針,和「普通變量」不一樣的是,指針變量存儲的是「地址」。 定義指針 指針變量也有類型,實際上取決於地址指向的值的類型。那麼如何定義指針變量呢: 很簡單:類型名* 指針變量名 char* pa;//定義一個字符變量的指針,名稱為paint* pb;//定義一個整型變量的指針,名稱為pbfloat* pc;//定義一個浮點型變量的指針,名稱為pc 注意,指針變量一定要和指向的變量的類型一樣,不然類型不同可能在內存中所佔的位置不同,如果定義錯了就可能導致出錯。 取地址運算符和取值運算符 獲取某個變量的地址,使用取地址運算符&,如: char* pa = &a;int* pb = &f; 如果反過來,你要訪問指針變量指向的數據,那麼你就要使用取值運算符*,如: printf("%c, %d\n", *pa, *pb); 這裏你可能發現,定義指針的時候也使用了*,這裏屬於符號的「重用」,也就是説這種符號在不同的地方就有不同的用意:在定義的時候表示「定義一個指針變量」,在其他的時候則用來「獲取指針變量指向的變量的值」。 直接通過變量名來訪問變量的值稱之為直接訪問,通過指針這樣的形式訪問稱之為間接訪問,因此取值運算符有時候也成為「間接運算符」。 比如: //Example 01//代碼來源於網絡,非個人原創#include int main(void){    char a = 'f';    int f = 123;    char* pa = &a;    int* pf = &f;        printf("a = %c\n", *pa);    printf("f = %d\n", *pf);        *pa = 'c';    *pf += 1;        printf("now, a = %c\n", *pa);    printf("now, f = %d\n", *pf);        printf("sizeof pa = %d\n", sizeof(pa));    printf("sizeof pf = %d\n", sizeof(pf));        printf("the addr of a is: %p\n", pa);    printf("the addr of f is: %p\n", pf);        return 0;} 程序實現如下: //Consequence 01a = ff = 123now, a = cnow, f = 124sizeof pa = 4sizeof pf = 4the addr of a is: 00EFF97Fthe addr of f is: 00EFF970 避免訪問未初始化的指針 void f(){    int* a;    *a = 10;} 像這樣的代碼是十分危險的。因為指針a到底指向哪裏,我們不知道。就和訪問未初始化的普通變量一樣,會返回一個「隨機值」。但是如果是在指針裏面,那麼就有可能覆蓋到「其他的內存區域」,甚至可能是系統正在使用的「關鍵區域」,十分危險。不過這種情況,系統一般會駁回程序的運行,此時程序會被「中止」並「報錯」。要是萬一中獎的話,覆蓋到一個合法的地址,那麼接下來的賦值就會導致一些有用的數據被「莫名其妙地修改」,這樣的bug是十分不好排查的,因此使用指針的時候一定要注意初始化。 指針和數組 有些讀者可能會有些奇怪,指針和數組又有什麼關係?這倆貨明明八竿子打不着井水不犯河水。彆着急,接着往下看,你的觀點有可能會改變。 數組的地址 我們剛剛説了,指針實際上就是變量在「內存中的地址」,那麼如果有細心的小夥伴就可能會想到,像數組這樣的一大摞變量的集合,它的地址是啥呢? 我們知道,從標準輸入流中讀取一個值到變量中,用的是scanf函數,一般貌似在後面都要加上&,這個其實就是我們剛剛説的「取地址運算符」。如果你存儲的位置是指針變量的話,那就不需要。 //Example 02int main(void){    int a;    int* p = &a;        printf("請輸入一個整數:");    scanf("%d", &a);//此處需要&    printf("a = %d\n", a);        printf("請再輸入一個整數:");    scanf("%d", p);//此處不需要&    printf("a = %d\n", a);        return 0;} 程序運行如下: //Consequence 02請輸入一個整數:1a = 1請再輸入一個整數:2a = 2 在普通變量讀取的時候,程序需要知道這個變量在內存中的地址,因此需要&來取地址完成這個任務。而對於指針變量來説,本身就是「另外一個」普通變量的「地址信息」,因此直接給出指針的值就可以了。 試想一下,我們在使用scanf函數的時候,是不是也有不需要使用&的時候?就是在讀取「字符串」的時候: //Example 03#include int main(void){    char url[100];    url[99] = '\0';    printf("請輸入TechZone的域名:");    scanf("%s", url);//此處也不用&    printf("你輸入的域名是:%s\n", url);    return 0;} 程序執行如下: //Consequence 03請輸入TechZone的域名:www.techzone.ltd你輸入的域名是:www.techzone.ltd 因此很好推理:數組名其實就是一個「地址信息」,實際上就是數組「第一個元素的地址」。咱們試試把第一個元素的地址和數組的地址做個對比就知道了: //Example 03 V2#include int main(void){    char url[100];    printf("請輸入TechZone的域名:");    url[99] = '\0';    scanf("%s", url);    printf("你輸入的域名是:%s\n", url);    printf("url的地址為:%p\n", url);    printf("url[0]的地址為:%p\n", &url[0]);    if (url == &url[0])    {        printf("兩者一致!");    }    else    {        printf("兩者不一致!");    }    return 0;} 程序運行結果為: //Comsequense 03 V2請輸入TechZone的域名:www.techzone.ltd你輸入的域名是:www.techzone.ltdurl的地址為:0063F804url[0]的地址為:0063F804兩者一致! 這麼看,應該是實錘了。那麼數組後面的元素也就是依次往後放置,有興趣的也可以自己寫代碼嘗試把它們輸出看看。 指向數組的指針 剛剛我們驗證了數組的地址就是數組第一個元素的地址。那麼指向數組的指針自然也就有兩種定義的方法: ...char* p;//方法1p = a;//方法2p = &a[0]; 指針的運算 當指針指向數組元素的時候,可以對指針變量進行「加減」運算,+n表示指向p指針所指向的元素的「下n個元素」,-n表示指向p指針所指向的元素的「上n個元素」。並不是將地址加1。 如: //Example 04#include int main(void){    int a[] = { 1,2,3,4,5 };    int* p = a;    printf("*p = %d, *(p+1) = %d, *(p+2) = %d\n", *p, *(p + 1), *(p + 2));    printf("*p -> %p, *(p+1) -> %p, *(p+2) -> %p\n", p, p + 1, p + 2);    return 0;} 執行結果如下: //Consequence 04*p = 1, *(p+1) = 2, *(p+2) = 3*p -> 00AFF838, *(p+1) -> 00AFF83C, *(p+2) -> 00AFF840 有的小夥伴可能會想,編譯器是怎麼知道訪問下一個元素而不是地址直接加1呢? 其實就在我們定義指針變量的時候,就已經告訴編譯器了。如果我們定義的是整型數組的指針,那麼指針加1,實際上就是加上一個sizeof(int)的距離。相對於標準的下標訪問,使用指針來間接訪問數組元素的方法叫做指針法。 其實使用指針法來訪問數組的元素,不一定需要定義一個指向數組的單獨的指針變量,因為數組名自身就是指向數組「第一個元素」的指針,因此指針法可以直接作用於數組名: ...printf("p -> %p, p+1 -> %p, p+2 -> %p\n", a, a+1, a+2);printf("a = %d, a+1 = %d, a+2 = %d", *a, *(a+1), *(a+2));... 執行結果如下: p -> 00AFF838, p+1 -> 00AFF83C, p+2 -> 00AFF840b = 1, b+1 = 2, b+2 = 3 現在你是不是感覺,數組和指針有點像了呢?不過筆者先提醒,數組和指針雖然非常像,但是絕對「不是」一種東西。 甚至你還可以直接用指針來定義字符串,然後用下標法來讀取每一個元素: //Example 05//代碼來源於網絡#include #include int main(void){    char* str = "I love TechZone!";    int i, length;        length = strlen(str);        for (i = 0; i 

    時間:2020-11-24 關鍵詞: 嵌入式 C語言

  • 太美了!PCB佈線怎麼可以這麼美?

    來自PCB Arts的作品,走線佈局挺美,評論區討論一點,大家設計PCB的時候,是美觀第一,還是性能P第一,亦或是不影響性能的情況下,美觀第一? 免責聲明:本文內容由21ic獲得授權後發佈,版權歸原作者所有,本平台僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平台立場,如有問題,請聯繫我們,謝謝!

    時間:2020-11-24 關鍵詞: 電路板 PCB

首頁  上一頁  1 2 3 4 5 6 7 8 9 10 下一頁 尾頁
發佈文章