PWM可以算是數字電路中的“獨臂”神通,“獨臂” - 隻需一根線;“神通” - 在很多關鍵的應用中起到棟梁的作用。PWM(脈寬調制 Pulse Width Modulation)從字面意思上講它是一種“調制”方式,調制就意味着在某些載波信号上攜帶了某些的信息,通過解調的過程就可以得到其攜帶的信息,這些信息的屬性由PWM的産生端定義,總之在這一根僅僅發生0、1交替變化的信号線上可以做出很多文章。
今天我們就看看如何通過PWM的方式實現數字到模拟變換的功能,也就是通過改變一根管腳的輸出脈沖,得到模拟世界的某種波形。
首先PWM是由一串連續行走在某輸出管腳上的0、1交替出現的信号組成,我們稱高電平1為ON,低電平0為OFF,ON OFF為一個周期T,ON的持續時間除以周期T就為占空比 - Duty Cycle,看下面的兩個圖。
如果發送端用脈沖的占空比來傳遞“電壓值”,也就是将某個數字的電壓值對脈沖的占空比進行調制,就可以在接收端通過RC低通濾波器(也就是解調器)從調制脈寬的數據流中得到需要的模拟電壓值,從而達到DAC的目的。看下面的動圖 - 假設脈沖的占空比為0的時候(整個周期全部為OFF - 低電平)代表電壓值為0,占空比為100%的時候(整個周期全部為ON - 高電平)代表電壓值為最高電壓,比如3.3V,則40%的占空比就是40%*3.3V。占空比改變-每個周期的脈寬改變,也就意味着輸出的電壓值在改變。
用脈寬的改變攜帶電壓值的變化信息
用一個電阻和電容組成的低通濾波就可以将PWM中攜帶的電壓信息“解調”成模拟的電壓值
前面講過DAC的兩個關鍵指标 - 轉換率和轉換精度,在PWM裡是如何對應的這兩個指标麼?
看一下下面的波形:
PWM-DAC的轉換頻率相當于脈沖的重複頻率
PWM-DAC的分辨率相當于脈沖寬度相對于整個周期的精度,舉例如果一個最小的脈沖ON的時間為5ns(可以用100MHz的時鐘計數産生),PWM脈沖的周期為5ns x 256 = 1.28us,則這個PWM-DAC相當于是8位的DAC。
也就是說如果你用100MHz的時鐘來通過PWM的方式做一個8位的DAC,最高的轉換頻率也隻能到1/1.28us ~ 781KHz分辨率高則轉換率降低,因此用PWM做的DAC一般用于生成非常低頻的信号乃至直流信号。
下面的圖為經過一個最簡單的由一個電阻R和一個電容C構成的低通濾波以後得到的模拟信号,可以看到在輸出的模拟信号上還是有很高頻率的紋波。
如果要進一步平滑輸出模拟信号上的波紋,可以通過加入電感或着用運算放大器構成的有源低通濾波器來對紋波實現更強的抑制。
是不是很簡單?隻需一個R和一個C就能得到你想生成的模拟信号,做一個簡單的任意波形發生器很簡單啊。
有的朋友會問,很多MCU内部都有DAC啊,幹嘛不用内部的DAC?
蘇老師答:如果有的話自然不需要折騰PWM了,如果沒有,隻需要一根管腳和倆器件就能實現這樣的功能還是很有用的,再說了,也許你的系統中需要多個DAC的功能,而你的MCU内部沒有足夠的DAC,且你也不想或者沒有足夠的管腳外挂一個單獨的DAC器件(需要I2C或SPI總線連接),PWM方式是個非常不錯的選擇哦。
如果你用的是FPGA或CPLD,裡面根本沒有DAC,而你又需要一個,拿出一個管腳來産生PWM就會非常666。
理解用PWM生成DAC的機制、局限,在關鍵的時候也許就能起到意料不到的結果。
最好的方式是直接動手試試喽 - 在一個小腳丫的輸出管腳上加上R和C,用計數器生成以下PWM信号,用示波器看看你能得到什麼。
首先我們看一下脈沖信号的頻譜,根據傅立葉變換,周期為T的脈沖信号可以分解為多個單頻率的信号的疊加,最小的頻率分量為1/T,有興趣的可以通過Matlab自己做一下分析。
比如,我們對幅度為3.3V、周期為10uS(頻率100KHz)、占空比為50%的脈沖信号(此時為方波)進行FFT變換,可以得到1.65V的直流分量、100KHz、300KHz(3次諧波)、500KHz(5次諧波)。。。等頻率分量,最小的交流頻率為100KHz。
從以上簡單的分析可以看出,無論占空比是多少,脈沖波形除了直流分量以外,交流部分的最低頻率都為脈沖的重複頻率100KHz上,在DC和脈沖重複頻率100KHz之間一馬平川,光秃秃的。
因此,如果要得到直流分量,隻需要去掉100KHz以上的頻譜能量就可以了。最簡單的方法就是通過由一個電阻R和一個電容C構成的一階低通濾波器,其截止頻率為fc=1/2*Pi*R*C,我們要得到的是直流分量,濾除的是100KHz以上的頻率,因此隻要截止頻率在100KHz以内,并且能對100KHz以上的所有頻譜都有較好的抑制,就能夠得到比較好的DC輸出。
可以想象,截止頻率越高,越是接近要濾除的頻率(比如50KHz之于100KHz),該濾波器對100KHz的濾波效果就較差,就會有一定量的殘餘能量出現在濾波器的輸出端,如下圖,也就是輸出的波形紋波比較高。
如果降低截止頻率,越是接近直流,從而距離要濾除的頻率越遠,比如針對100KHz的脈沖頻率選擇1KHz作為LPF的截止頻率,則在100KHz處可以達到非常高的抑制度,100KHz的殘留就非常小,也就是在輸出的直流信号上的紋波可以變得很小,如下圖
但卻出現了另外一個問題 - 需要花費很久的時間(學名叫建立時間 setting time)才能達到應該達到的DAC的直流值。原因就是fc低,意味着RC更高,也就是充電的時間常數變得很長 - R增大意味着對C進行充電的電流變小,要對C沖電到一定的值花費的時間也就更久。,
因此這就出現了一個讓人糾結的選擇:
選擇較低的截止頻率 - 較低的紋波,較長的建立時間
選擇較高的截止頻率 - 較大的紋波,較快的建立時間
你會說一階不夠,要不多用幾階濾波器,加上電感或者有源的運放來進行低通濾波,這确實能改善濾波的效果,但 -- 電路的複雜度增加、元器件成本增加了,且改善有限。
那不增加電路的複雜程度,還是隻用這一個R和一個C是否能夠改善性能呢?
答案是肯定的,其實也很簡單 - 把交流分量的頻率踢的遠遠的,在保持較低的時間常數(建立時間短)的情況下,将LPF的截止頻率fc和要濾除的脈沖重複頻率之間的間隔盡可能的拉開,比如将100KHz的重複頻率給踢到10MHz(出去100倍),占空比不變,如果用原來的50KHz的濾波器,到了10MHz的地方怎麼也把10MHz以上的頻率給消滅的隻剩下一點渣了。看下圖,直流建立時間大約為15µs, 紋波變得隻有25mV左右了。
是不是很神奇?其實理論依據很簡單,自己把低通濾波器的頻響曲線畫一下就很容易理解了。
到這裡我們就應該知道如何設計自己的PWM系統的各項參數來構造一個簡單好用的DAC。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!