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