開發(fā)和測試汽車電子、航空電子設(shè)備及數(shù)字傳感器的工程師和設(shè)計師們,經(jīng)常需要測量和模擬設(shè)備所產(chǎn)生的脈沖寬度調(diào)制(Pulse Width Modulation, PWM)信號。LabVIEW FPGA模塊可以用來為測試測量系統(tǒng)創(chuàng)建PWM接口。與專用的PWM I/O設(shè)備不同的是,LabVIEW FPGA允許自定義應(yīng)用程序的PWM通道特性和行為,并且可以與其它的測量設(shè)備集成和同步。
1. 應(yīng)用程序概述
LabVIEW FPGA模塊和可重配置的I/O板卡可以用來實現(xiàn)各種自定義接口,其中包括:
- 用于其它測量設(shè)備的定時和觸發(fā)功能
- 數(shù)字通信協(xié)議
- 開發(fā)快速原型或者硬件在環(huán)應(yīng)用中的設(shè)備仿真
- AC和DC傳感器仿真
除了上述這些應(yīng)用以外,您還可以使用LabVIEW FPGA來實現(xiàn)脈沖寬度調(diào)制(PWM)信號的輸入和輸出。PWM信號不是僅針對某一類特殊的設(shè)備的,而是可以用于各種應(yīng)用中廣泛的測量。本文將告訴您如何使用可重配置的I/O板卡和LabVIEW FPGA模塊建立PWM接口。
在傳統(tǒng)的方法中,我們使用計數(shù)器進行測量和生成PWM信號。然而,為了適應(yīng)更廣泛的計數(shù)器應(yīng)用,硬件的性能和應(yīng)用程序編程接口(API)做了相應(yīng)的優(yōu)化,因而這種優(yōu)化使得通過傳統(tǒng)計數(shù)器生成PWM信號的應(yīng)用程序開發(fā)難度變大了。而LabVIEW FPGA允許您使用自定義的硬件和軟件接口設(shè)計PWM I/O通道,這樣就可以很容易地將它們集成到您的測試測量應(yīng)用中。
2. 脈沖寬度調(diào)制
脈沖寬度調(diào)制(PWM)是一種調(diào)制方法,通過使用單個脈沖或者連續(xù)脈沖序列的寬度來對一個值進行編碼。通常,一個PWM信號使用一個頻率恒定且占空比可變的連續(xù)方波信號。一個方波的占空比或單個方波脈沖的寬度代表著信號值。該值定義的范圍從0到1(或者從0到100%)占空比。這個PWM值對應(yīng)于一個應(yīng)用中設(shè)定范圍的工程值,例如以RPM為單位的一個輪子的轉(zhuǎn)動速度。由于PWM信號的數(shù)值范圍不是無限的,因此它所對應(yīng)的工程值也有限定的范圍。例如,PWM值從0到1可能對應(yīng)于傳感器從0到8000 RPM。而大于8000的轉(zhuǎn)速值則不能用這個傳感器測量。
圖1: 脈沖寬度調(diào)制(PWM)信號的實例
3. 簡單的PWM輸入
在下面的例子中,使用一個數(shù)字I/O線用來采集PWM信號,然后在FPGA上處理提取PWM值。從本質(zhì)上講,程序代碼會觀察相臨的上升和下降邊沿,并且基于邊沿間的時間差,來確定脈沖寬度和脈沖周期。脈沖寬度除以脈沖周期,我們就可以得到PWM值,并從中可以導出對應(yīng)的工程值。
下面的程序框圖顯示了一個簡單PWM輸入的實現(xiàn)方式。該VI監(jiān)視數(shù)字線的下降和上升邊沿,并且測量每對邊沿之間的時間差。每個階段的信號的長度被寫入前面板上的簇顯示控件中,可以通過上位機應(yīng)用程序查詢。PWM信號的頻率和占空比是由上位機應(yīng)用程序中高低電平持續(xù)的時間長度計算得到的。通過在上位機應(yīng)用程序上進行PWM計算,我們可以減少實現(xiàn)該應(yīng)用所需的FPGA空間,因此,我們可以在一個板卡上實現(xiàn)更大數(shù)量的PWM輸入或者其它代碼。這也減少了循環(huán)運行所需的時間,因而夠測量更小的脈沖寬度和脈沖周期。
圖2:一個簡單的PWM輸入
為了進一步優(yōu)化循環(huán)的性能,我們將兩次循環(huán)間的代碼連接起來。在第一次循環(huán)中,實現(xiàn)了數(shù)字脈沖邊沿的檢測和時間標記,并將時間標簽值傳遞給一對移位寄存器。在下一次循環(huán)中,檢索時間標簽值并計算脈沖長度,然后將它們寫入到前面板上的簇顯示控件中,以便上位機應(yīng)用程序檢索。將一項操作任務(wù)分割成兩個循環(huán)執(zhí)行,可以降低整體的循環(huán)周期。我們使用前面板上的簇,以確保高電平長度和低電平長度兩個值在相同的時間更新,并由上位機應(yīng)用程序同時讀取。
對于簡單的PWM輸入,通??梢蕴砑右粋€鎖存器,以增強其功能。該鎖存器布爾值用于鎖存輸出寄存器中當前的讀數(shù)。VI將一直存儲數(shù)值,在上位機釋放鎖存器之前,都不會用新的PWM值更新寄存器。利用該功能,可以通過上位機的鎖存操作來控制在特定的時間讀取測量值。另一個可選的功能,是基于另一個數(shù)字信號或者觸發(fā)來鎖存PWM數(shù)值,如來自RTSI/PXI觸發(fā)總線的脈沖信號。相比于從上位機應(yīng)用程序鎖存讀值的方式,此功能可以更好地與外部進程同步。
圖3:使用鎖存器的簡單PWM輸入
通常,一個應(yīng)用程序可能需要在每個PWM信號周期內(nèi)都讀取PWM數(shù)值,而不是間歇地讀取PWM值或者使用鎖存操作。在這種情況下,我們需要在每次循環(huán)結(jié)束時將PWM數(shù)據(jù)存儲在緩沖區(qū)中,而每次循環(huán)對應(yīng)于PWM信號的一個周期。在緩沖區(qū)相關(guān)的參考范例中,列舉了將數(shù)據(jù)發(fā)回到上位機應(yīng)用程序之前在FPGA上進行數(shù)據(jù)緩沖存儲的過程。
若要測試您的PWM輸入,您將需要一個PWM信號發(fā)生器。如果您沒有合適的信號源,則可以使用FPGA生成的PWM輸出信號,如本文中PWM輸出部分所述。
參見:
利用LabVIEW FPGA和7831R進行PWM輸入
4. 高級PWM輸入
在高級PWM輸入程序中,PWM值的計算過程從上位機應(yīng)用程序移到FPGA VI中進行。由于在FPGA上缺乏浮點運算功能,VI將基于測得信號的高低電平,使用整數(shù)運算確定PWM值。PWM的數(shù)值被返回為一個16位的無符號整數(shù),對應(yīng)于所有的PWM值。例如,32768對應(yīng)于0.5或者50%的PWM值。
圖4: 高級PWM輸入
為了讓計算得到的PWM值具有合理的分辨率,時間標簽的測量分辨率為16位,從而我們可以使用擴展的32位范圍劃分兩個脈沖長度值。這意味著,相比于使用32位整數(shù)的時間標簽的簡單PWM輸入程序來說,它可以測量的脈沖長度是有限的。在每個特定的應(yīng)用程序中,您可以選擇時鐘計數(shù)函數(shù)的時間單位。該函數(shù)用于記錄PWM信號邊沿的時間標簽。通過選擇時鐘計數(shù)函數(shù)的計數(shù)節(jié)拍、微秒或者毫秒模式,您可以根據(jù)信號的頻率,匹配最佳的PWM輸入方式。
參見:利用LabVIEW FPGA和7831R進行PWM輸入
5. 多路復(fù)用的PWM輸入
在一些應(yīng)用程序中,可能需要監(jiān)測大量的PWM信號。但是由于FPGA上資源的限制,實施大量的獨立的PWM輸入可能是不可行的。針對這種情況,一個替代方案是建立一個多路復(fù)用的PWM輸入,用來在大量可用信號中選擇監(jiān)控有限數(shù)量的PWM信號。這種方法類似于一個多路復(fù)用器,將許多信號中的某一個切換到輸入。對于連接在7831R 可重配置 I/O 板卡的 DIO線上的多個PWM信號,您可以選擇其中的一個或幾個來進行處理。
下圖顯示了一個多路復(fù)用的PWM輸入,上位機應(yīng)用程序從40個不同的輸入信號上作出選擇,這些信號來自于7831R板上一個DIO連接器的40條數(shù)字線。每一微秒,VI會讀取所有40條數(shù)字線的信號,分組為5個端口,每個端口包含8條數(shù)字線。所有40條數(shù)字線的當前狀態(tài)值通過具有40個元素的布爾數(shù)組進行存儲,并傳遞到循環(huán)的移位寄存器中。VI處理由Active PWMs控件所選擇的PWM信號中的數(shù)據(jù)。對于每一個被選到的PWM信號,VI會檢索當前的和最近的信號狀態(tài),并檢測信號的上升或者下降邊沿。信號中的每個邊沿都是帶有時間標識的,其信息存儲在簇數(shù)組中。簇數(shù)組中包含每個活動信號的最近邊沿的時間標識信息,以及該信號最近的完整高低脈沖的長度?;诿總€PWM信號的脈沖長度,上位機應(yīng)用程序計算每個活動信號的PWM值。
圖5:多路復(fù)用的PWM輸入
根據(jù)FPGA上可用的空間,開發(fā)者可以設(shè)置每次處理的活動PWM信號的數(shù)量,具體可以通過設(shè)置框圖上簇數(shù)組常量的數(shù)組大小、以及前面板上Active PWMs數(shù)組和PWM數(shù)據(jù)數(shù)組的大小來實現(xiàn)。這三個數(shù)組都必須有相同數(shù)量的元素,對應(yīng)于活動PWM信號的總數(shù)。此外,VI需要能夠在設(shè)定的循環(huán)周期時間內(nèi)里處理所有的活動PWM信號。如果您增加了活動PWM信號的數(shù)量,您可能還需要增加循環(huán)時間,為VI提供足夠的處理時間。
6. PWM輸出
許多應(yīng)用程序要求測試系統(tǒng)也能夠產(chǎn)生PWM輸出。這些信號可以用來模擬在正常的操作環(huán)境中與被測設(shè)備相連的其它設(shè)備。
圖6中所示簡單的PWM輸出程序中,可以設(shè)置PWM信號的周期和脈沖寬度。與PWM輸入范例程序相似的是,這兩個參數(shù)都通過指定FPGA的時鐘周期(節(jié)拍)來實現(xiàn),雖然也可以選擇微秒或者毫秒模式的循環(huán)定時器和等待時間參數(shù)。
圖6: PWM輸出
即使您的應(yīng)用程序中不需要PWM輸出,您也可以將輸出與輸入對接起來,快速地測試和表征您的PWM輸入應(yīng)用程序。利用LabVIEW FPGA,您可以使用一部分程序框圖寫入一個輸出電平到一條數(shù)字線路上,并通過另一部分程序框圖讀取該數(shù)字線路,而不需要與外部回路連接。
7. 多個PWM輸出
在需要多個PWM輸出的應(yīng)用程序中,我們可以對簡單PWM輸出算法進行復(fù)制。但是,如果我們有很多的輸出信號,這種方法復(fù)制了大量的代碼,由于FPGA上空間的限制,效率很低。對于多個PWM輸出的應(yīng)用,我們可以設(shè)計一個基于多線邏輯的實施方案。下面的程序顯示了如何使用一個循環(huán)更新8個PWM信號。8條線路都包含在一個數(shù)字端口中,而該端口作為一個整體進行更新。
我們使用可重配置板卡上的存儲器而不是使用前面板控件來存儲每個PWM信號的當前設(shè)置,具體可以通過LabVIEW FPGA模塊中的存儲器擴展通用程序?qū)崿F(xiàn)。此通用程序允許我們訪問更大的內(nèi)存塊,以及訪問內(nèi)存為8-、 16-、或者 32-位的寄存器。使用板載內(nèi)存來存儲PWM設(shè)置,極大地減少了該程序所需的FPGA空間量,特別是對額外的輸出通道使用多個端口時。在7831R可重配置I/O板卡的一個DIO連接器上,我們可以實施多達40路PWM輸出。
下圖中上方的循環(huán)是用來在上位機應(yīng)用程序中與FPGA的可用內(nèi)存進行通信,將PWM設(shè)置寫入到板卡中。每個PWM輸出使用兩個內(nèi)存地址。第一個地址是用來存儲以微秒為單位的脈沖寬度;第二個是用來存儲脈沖間的暫停寬度,同樣是以微秒為單位。這兩個值加在一起表示脈沖周期。地址0和1代表第一個PWM輸出,地址2和3代表第二個PWM輸出,以此類推。
因為我們需要處理下方的循環(huán)中所有的PWM輸出信號,因此使用循環(huán)定時函數(shù)進行配置,以1微秒的間隔運行。我們將其編譯為按照FPGA的80MHz時鐘速率運行,因此需要在80個時鐘周期內(nèi)完成我們所有的處理任務(wù)。
在主循環(huán)中,我們對狀態(tài)數(shù)組進行保持和更新,數(shù)組中存儲了每個PWM輸出(共計8個)的當前狀態(tài)和時間,一直到狀態(tài)發(fā)生下一次改變。在主(While)循環(huán)內(nèi)的For循環(huán)是用來處理每個單獨的PWM輸出狀態(tài)。在主循環(huán)的每個周期中,我們遞減狀態(tài)數(shù)組中Next Edge的值,直到其達到0。在這種狀態(tài)的轉(zhuǎn)換下,將從用戶內(nèi)存讀取接下來的脈沖或者暫停的長度,并且更新狀態(tài)數(shù)組。For循環(huán)也將每個PWM輸出的狀態(tài)整合為一個布爾數(shù)組,將其傳遞到移位寄存器中,并轉(zhuǎn)換為一個8位整數(shù),用于更新數(shù)字端口。由于循環(huán)是微秒級定時的,該程序的分辨率是以1微秒為單位記錄PWM信號的脈沖和暫停周期。
如果在內(nèi)存緩沖區(qū)的PWM設(shè)置未經(jīng)初始化或者設(shè)置為0,則PWM線路的輸出將設(shè)置為低電平。
圖7:多路復(fù)用的PWM輸出
8. 特別注意事項
靠近PWM范圍兩端的值(接近0和1)可能導致很難解調(diào)PWM波形,因為它們產(chǎn)生的脈沖寬度極其微小。許多PWM輸入設(shè)備,包括本文中所述的產(chǎn)品,都有所能夠測量的最小和最大的PWM值。
在上述的LabVIEW FPGA PWM 輸入應(yīng)用程序中,我們測量了PWM信號的連續(xù)邊沿間的時間間隔。由于FPGA本身及其內(nèi)部時鐘的特性,以及個別的應(yīng)用中的特殊性,都會限制所能測量的最小脈沖寬度。這種限制對于信號的高電平脈沖和低電平脈沖可能會有所變化??蓽y量的范圍是由這些最小脈沖寬度和PWM信號頻率(脈沖周期)決定的。
例如,如果在您實施的應(yīng)用中,最小的可測量的脈沖寬度是5個 FPGA時鐘周期,而PWM頻率為5 kHz,則可測量的PWM值的范圍如下所示:
脈沖寬度:5 * ( 1 / 40MHz ) = 5 * 25ns = 125ns = 0.125us
脈沖周期:1 / 5kHz = 200us
最小PWM值:0.125us / 200 us = 0.000625 = 0.0625%
最大PWM值:1 - 0.000625 = 0.999375 = 99.9375%
(us=微秒)
具體的可測量PWM范圍依賴于所實施的應(yīng)用程序和FPGA時鐘速率。因此,確保開發(fā)人員知道這些限制,并根據(jù)應(yīng)用程序的需求設(shè)計代碼,這一點非常重要。
對于PWM輸入,當內(nèi)部的定時器達到其最大值后回零,則會存在另外一個邊界條件。在這種情況下,可能導致某一個循環(huán)中的脈沖持續(xù)時間和周期的計算出現(xiàn)錯誤。這個錯誤可以使用一些額外的編程消除,具體可以檢查連續(xù)的定時值以確定翻轉(zhuǎn)條件,并且暫不更新測量值。
9. 結(jié)論
LabVIEW FPGA與可重配置I / O板卡為設(shè)計優(yōu)化適用于每個特定應(yīng)用的PWM輸入和輸出功能提供廣泛的靈活性。無論是側(cè)重于極端的測量范圍,還是側(cè)重易于使用、多路復(fù)用輸入或者運行并行通道,開發(fā)者都可以進行自定義設(shè)計,實現(xiàn)最佳性能。將PWM接口與其它信號類型和測量類型相結(jié)合,同時,使用內(nèi)部和外部定時和觸發(fā)信號將PWM測量同步,可以進一步擴展這些基本模塊的應(yīng)用范圍和功能。
評論
查看更多