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