加電容這個貌似簡單的問題,我的同事就栽了好幾個跟頭。在電容的加或不加、當加多少的問題上,他并沒有遵從理論指導實踐的方針路線,而是想當然地瞎干蠻干,事后也只長教訓不長經驗,碰到其它的場合不能舉一反三。
餓了要吃饃,渴了找水喝,有干擾的地方就要加電容濾波,這種樸素的經驗簡明有力,深入人心。但是這里面的道道兒還很多,所以有的時候還是會翻車。
幾年前,我做了個簡單的電機控制器,控制算法需要用到電機轉速信息。由于使用場景比較簡單,電機轉速傳感器選用的是成本低廉的霍爾傳感器,電機每轉一周,該傳感器輸出4個周期的脈沖信號。雖然分辨率比每周都要輸出上千個脈沖的QEP單元要低很多,但足以滿足應用要求。
電機轉速最高每分鐘3000轉,相當于每秒鐘轉50圈,對應200個脈沖信號。我采用了脈沖計數法計算電機轉速,統計一秒內的脈沖個數,根據脈沖個數計算每秒鐘轉多少圈,然后再換算到每分鐘多少轉即可。
在這里,我采取了“滑動時間窗”法,將一秒鐘分成五個時間窗,兩個統計周期之間的時間錯位為200毫秒,而不是1秒,這種方式可以增加轉速的實時性和準確性。如果瓜友們對這種方法比較感興趣,可以自行上網查閱,本文篇幅有限,不再贅述。
在這里,脈沖個數的統計很關鍵。數字脈沖都有上升沿和下降沿,根據這種特性,我采用了中斷觸發方式統計脈沖個數。
顯然,如果脈沖輸出線上有毛刺,便可能誤觸發中斷,造成統計轉速大于實際轉速。基于這種樸素的認識,我的硬件搭檔小A在脈沖輸出線上加了個RC濾波。
RC濾波電路如此常見,以至于我根本意識不到它還能出問題。
我一邊操作著信號發生器輸出方波信號,一邊通過仿真器觀察一秒內的脈沖統計個數。但是我很快發現,隨著信號頻率的增加,脈沖采集功能居然慢慢失效了。架上示波器,發現脈沖數據線上原本陡峭的信號沿變成了緩緩的山坡,從波形上來看,信號還沒有爬到山頂就落了下來。
雖然這種情況并不多見,但是天資平平的我還是馬上意識到這種爬不上去的波形顯然是RC網絡造成的。在這里,有必要先給大家普及一下RC網絡對信號的“延遲作用”。
RC濾波是個延遲環節,延遲時間取決于時間常數(即R*C),以RC濾波網絡的輸入輸出來看,RC時間常數表示的是輸出信號電平達到輸入信號電平的0.632倍所需的時間。根據計算,經過2個時間常數,輸出達到輸入的0.86倍,經過3個時間常數,輸出達到輸入的0.95倍。。一般經過3-5個時間常數后,輸出就基本達到了輸入電平。
但是現在的波形,脈沖信號經過RC濾波后還沒有充到最高電平就開始放電了,顯然是因為RC時間常數設置得太長了!
待我把小A叫過來后,他跟我講述了電容的奇葩計算方法,當時我就震驚了。小A說:“最大脈沖頻率為200Hz,按照香農采樣定理,只要將濾波頻率設定在400Hz以上,便可以收到濾波、采樣的雙重功效。他將濾波頻率設定為500Hz,采用普通的RC濾波形式,于是他將R設定為2k、C設定為1uF。”
嚯,把采樣定理都搬出來了,似乎無法從理論上反駁,一開始也把我唬的一愣一愣的。但是仔細想想,小A顯然混淆了方波脈沖頻率和信號最大頻率的概念!
采樣定理針對的是信號最大頻率,但是這里的信號是方波脈沖信號,脈沖頻率為200Hz不等于信號中的最大頻率成分為200Hz,從理論上講,數字脈沖包含無窮的信號頻率,200Hz只是基波頻率,還有二次諧波、三次諧波......
實際上,根據傅里葉變換的知識,等周期、占空比為50%的脈沖信號為“半波信號”,沒有偶次諧波分量,只有奇次諧波分量。即該信號有200Hz、600Hz、1000Hz......等正弦分量,其中,三次諧波分量和5次諧波分量還占有比較大的比重。而且,就像在《信號與系統》這門課程的教科書里講的那樣,如果要在實際工程中應用香農定理的話,最好把采樣頻率設為最大頻率的3-5倍,沒有按照2倍信號最大頻率應用香農定理的。
不過,這里顯然不是采樣定理的用武之地。要想在理論上解釋小A的錯誤,還得回到RC網絡的延遲作用上來。
按照RC網絡時間常數的延遲作用,根據小A的RC取值,時間常數τ=0.002秒,200Hz的方波信號高電平持續0.0025秒,低電平持續0.0025秒,都大大小于2個時間常數,也就是說,當輸入高電平持續時間結束時,輸出電平還遠沒有有達到輸入電平的0.86倍,經過估算大概還不到0.7倍。
但是按照CMOS電平理論,對于5V信號,4.5-5V之間的信號才會準確地被認定為高電平,0-0.5V之間的確定為低電平。故而,輸入高電平持續時間結束時,MCU還沒有被觸發上升沿中斷,所以脈沖采集功能才失效的。
所以,這里真要濾波的話,要把RC時間常數至少設置為高電平持續時間的三分之一到五分之一,按照五分之一計算,時間常數τ=0.0005秒,可以將R設定為5k、C設定為0.1uF。
我把小A講暈后,讓他調換了電阻和電容,再次測試果然就沒有問題了。
但是電容并不是萬能的,也并非非用不可。有時候,反而需要在“應該濾波”的地方去掉電容,才能滿足具體功能的要求。比如前兩年做了一個遙控器,在接收遙控信號時,便遇到了電容的取舍問題。
還是類似的脈沖信號采集,只是這一次不是統計脈沖個數了,反而需要統計高電平的持續時間、低電平的持續時間,而且信號也不是方波信號了,而是曼徹斯特信號,即以“兩高一低”或“兩低一高”來表示數字位0和1,這里的“兩高一低”指的是兩個時間單位的高電平和一個時間單位的低電平。時間單位因遙控器和遙控協議而異,這里測試時為125us。
既然是數字信號采集,既然信號線上可能會受到電磁輻射干擾的影響而出現毛刺,加個電容濾下波似乎也是應有之義。
而且這里的遙控信號的高低電平持續時間都很短,所以我采用的RC時間常數很小,R=1k,C=1nF,顯然,時間常數τ=1us,已經是一個比較小的數字了,按理說既能起到適當的濾波作用,也基本不會破壞信號的波形。
但是這次,事情卻沒有那么簡單了。因為我發現,加了個RC濾波網絡之后,遙控信號有時就接收不準了。
正如上面所說,這次要采集的是高電平持續時間和低電平持續時間,既然接收不準了,我隱隱約約地覺得,盡管從理論計算上沒什么問題,但是這里加的電容顯然會破壞電平持續時間的判斷。于是,我把電容取了下來。再一次測試,好使了!
理論計算沒問題,加了電容,三個時間常數(3us)后就能觸發上升沿中斷,對于125us來說,也是一個很小的誤差,我在程序里已經給出了足夠的余量(100us-150us均視為1個時間單位),完全可以“忽視”掉這種誤差。
但是無情的事實就擺在面前,用仿真器存儲多個高低電平持續時間,確實發現了一些“不標準”的時間長度。顯然,我忽略掉了什么!
小A在一旁沉浸在“蒼天啊,大地啊”的哀怨中,我卻忽然意識到了一個問題:信號線和地平面之間的電容是不是不只有自己所添加的這個1nF!
看著在各個電源(VCC-12V/VCC-5V/VCC-3.3V)入口處的電容,我醒悟了過來,電容無處不在,當你接了一個1nF到地平面上時,你也就將信號線納入了無比蒼茫的大地,這里地平面的電容也許是動態的,才造成只會個別得影響、而不是影響所有的高低電平。
這就了然了!不是這個1nF的電容自己有問題,而是把它接進來,就開啟了潘多拉的盒子。它后面還跟著一個不斷起伏變化的地平面上的電容簇,它就像隱藏在黑幕中的獵人,隨時對著遙控信號線射出一記冷槍! |