在本教學的第1部分中,我們介紹了FPGA,並在嵌入式 Micro的Mojo FPGA上完成了一個簡單的入門項目。在第2部分中,我們將介紹一個更複雜的項目:在Mojo FPGA上實現硬體PWM。
脈衝寬度調製(PWM)被廣泛應用於嵌入式系統中,用以控制LED亮度、電機轉速,甚至可用於通信。如果您使用的是Arduino,那麼在使用analogWrite()函數的時候一定遇到過PWM。在Mojo上實現PWM之前,我們應該首先瞭解一下PWM是如何工作的!
微控制器和其他嵌入式系統處理器使用數位訊號來進行計算和執行任務。這些訊號僅以兩種電平狀態中的一種出現:“高”電平(通常為3.3V或5V)和“低”電平(通常為0V)。這兩種電平分別編碼為二進位1和0,因此可用於執行各種各樣的工作任務。
但是,如果我們想輸出比“開和關”更多分級的電壓呢?在諸如上文中所提到的要求輸出可變強度的應用激發了對該問題的探索。一種解決方案是將系統連接到稱為“數模轉換器(DAC)”的外部設備,該設備從主處理器獲取二進位1和0形式的數位訊號輸入,並輸出幾乎連續的0V到系統“最大電壓”範圍內的電壓值。但是,對於大多數嵌入式系統應用程式來說,存在一種更簡單的方法:PWM!
從某種程度上講,PWM利用了人類的感知系統和物理系統(如電機)能夠對變化的輸入進行快速平均這一事實。系統生成一個包含高頻率脈衝的數位訊號,因此很難將每個脈衝區分開來。在給定的波形週期內,訊號在該時間內的某些時間為高電平,其餘時間為低電平—高電平所占的時間比例稱為訊號的占空比或工作週期。平均輸出效果(無論是LED的亮度還是電機轉速)取決於PWM訊號的占空比。當然,顧名思義,我們可以通過更改波形的占空比(脈衝寬度)來改變輸出效果!下圖顯示了不同占空比及其對應波形的比較。
Arduino板上的微控制器IC(如ATMega晶片)具有專用於根據處理器指令生成PWM訊號的內部硬體。這些電路的輸出連接到微控制器IC上的特定引腳。這也意味著只有這些引腳可以提供PWM訊號。但是,在像Mojo這樣的FPGA上,我們可以根據需要配置內部硬體,也就是說我們可以創建任意數量的硬體PWM電路!