我們大多數人都知道脈衝寬度調變數位類比轉換器(PWM DAC)。它們很容易實現,也很便宜,非常適合一些低性能的應用。

實現它們的方法是濾除PWM訊號中的高頻分量,只留下正比於工作週期(duty cycle)的低頻或直流分量。但是低通濾波器並不能完全濾除PWM頻率,因此低頻/直流訊號中通常都會有一定程度的波紋。

減少PWM DAC波紋的方法一般有兩種,一種是降低低通濾波器的截止頻率,另一種是提高PWM訊號的頻率。然而不可避免的是,更低的截止頻率會延長上升時間;如果是在給定時脈頻率點透過減少計數器尺寸實現的,那麼更快的PWM頻率會降低解析度。

以下要討論的設計實例非常有趣,著重介紹了另外一種降低PWM DAC波紋的方法。

事實上,我們可以使用相位差為180°的兩個PWM訊號來降低上述波紋。從直覺上,當兩個相同頻率的正弦波的相位相差180°時,它們會相互抵消,因此我們使用相位差為180°的兩個PWM訊號也能將彼此的諧波分量抵消乾淨,是這樣嗎?確實是這樣,但並不是PWM訊號的所有諧波分量都能抵消,有些分量可以抵消,有些卻抵消不了。這與傅立葉級數(Fourier Series)有關,比較複雜,這裡就不羅列一大堆數學公式來進行解釋了。

20170823TA01P1 圖1 單路和雙路PWM電路。

兩個PWM訊號之間180°的相位差是如何實現的呢?本文使用德州儀器(TI)的MSP320FR5969 LaunchPad,這種方法很常用。為了實現相位移動,需要兩個計時器,其中一個計時器必須包含兩個比較-捕獲-PWM(CCP)模組,另一個只需要一個CCP模組。

在包含兩個CCP模組的計時器中,可以用一個CCP模組來設置該計時器的PWM頻率和工作週期,另一個CCP模組產生中斷,用於啟動另一個計時器,兩者的延遲等於PWM週期的一半。另一個計時器中的CCP模組用於設置相同的PWM頻率和工作週期。

你還必須對這個延遲進行「微調」,因為軟體會在PWM訊號之間增加額外的時間。舉例來說,在程式碼的102行,將比較寄存器的值從(timer_period+1)/2改為了(timer_period+1)/2-27。

筆者做了一些小調查,想看看其他微控制器(MCU)是否具有相同的硬體和能力來實現我所用的方法:許多Atmel(已被Microchip購併)微控制器都有1個以上的計時器,每種控制器通常都有兩個CCP(比如ATmega 328),因此實現這種方法應該是可能的。另外一個常見的例子是STM32F051R8(這是一些流行的意法半導體(ST)電路板使用的微控制器),它有11個計時器,其中許多計時器都有1個以上的CCP。TI基於ARM的微控制器通常有獨立的PWM和計時器模組(如TM4C123GH6PM),因此應該更容易實現相移。使用其中一個計時器,兩個PWM模組就可以以一半PWM週期的延遲開啟。

在相移DAC的Vout端,兩個PWM訊號被累加在一起,結果有些諧波分量彼此抵消,最終實現了降低波紋的效果。

來看看使用三種不同電阻值時的情況。每個PWM訊號工作週期都是25%、頻率為100kHz。

從圖2的結果可以看出:首先,峰-峰波紋降低了;其次,傳統PWM DAC的波紋基頻等於PWM訊號的頻率(100kHz)。相移PWM DAC的波紋基頻等於PWM訊號的二次諧波(200kHz),這意味著用相移DAC成功刪除PWM訊號的一次諧波。

20170823TA01P2 圖2 上面的波形是傳統PWM,下面的波形是雙路相移PWM。從左到右每格的電壓遞減100mV、50mV、4mV

這種方法的一個優點是不用增加上升時間也能降低波紋(或者相同的波紋只需一半的上升時間)。

另外一個潛在優點是,將兩個PWM設置為相隔一個計數值可以獲得中間值,進而實現DAC有效解析度的翻倍。雖然這會導致少許的不對稱並增加波紋,但是影響很小可以忽略不計。