首頁 > 評測 > NXP i.MX7D與AndroidThings系列之六:PWM輸出
NXP i.MX7D與AndroidThings系列之六:PWM輸出
- [導讀]
- 本文是AndroidThings的第六篇,將為大家演示如何通過PWM實現(xiàn)電燈。
private static final String PWM_NAME = "PWM1";
private Pwm mPwm;
private Handler mHandler = new Handler();
private int mDutyCycle = 0;
private int step = 10;
PWM_NAME是PWM1設備的名稱,在AndroidThings,外設都是以字符串的形式來提供,無謂好壞,只是命名習慣而已?赡芎芏嘣MCU上編程的用戶習慣了使用數(shù)字編號來指定,在AndroidThings里,就遵循這個習慣好了。
mPwm變量表示的是PWM對象,所有與PWM相關的操作都是通過該對象來實現(xiàn),不過使用的時候注意如何處理異常。
接下來的三個變量都是用來實現(xiàn)呼吸燈效果的,mHandler可以實現(xiàn)代碼的延遲執(zhí)行,精度為ms級。mDutyCycle代表的是PWM的占空比,step變量用來動態(tài)調(diào)整占空比。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG, "PWM" + PeripheralManager.getInstance().getPwmList());
try {
mPwm = PeripheralManager.getInstance().openPwm(PWM_NAME);
mPwm.setPwmFrequencyHz(1000);
mPwm.setPwmDutyCycle(mDutyCycle);
mPwm.setEnabled(true);
mHandler.post(new Runnable() {
@Override
public void run() {
mDutyCycle += step;
if(mDutyCycle == 100) {
step = -10;
} else if(mDutyCycle == 0) {
step = 10;
}
try {
Log.d(TAG, "run: " + mDutyCycle);
mPwm.setPwmDutyCycle((float)mDutyCycle);
} catch (IOException e) {
e.printStackTrace();
}
mHandler.postDelayed(this, 100);
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
重點戲都在這里,雖然代碼不多,可是我們所要的功能都在這里。
首先打開PWM1設備,然后設置PWM中最重要的兩個參數(shù),即頻率和占空比,這里我們將頻率設置為1000Hz即周期為1ms,占空比初始值為0,也就是說LED燈處于熄滅狀態(tài)。
接下來使用Handler來實現(xiàn)延時操作,Handler.postDelay()延遲若干毫秒后再執(zhí)行指定的Runnable,在這個過程中動態(tài)調(diào)整占空比,從而實現(xiàn)呼吸燈的效果。
最后是資源的釋放問題,代碼如下
@Override
protected void onDestroy() {
super.onDestroy();
if (mPwm != null) {
try {
mPwm.close();
mPwm = null;
} catch (IOException e) {
Log.w(TAG, "Unable to close PWM", e);
}
}
}
前文已解釋過,這里不再贅述。
編譯、上傳代碼到開發(fā)板,在LogCat會看到如下信息
01-01 00:47:38.744 2788-2788/com.example.netlh.pwm D/AndroidThings: DutyCycle: 10
01-01 00:47:38.845 2788-2788/com.example.netlh.pwm D/AndroidThings: DutyCycle: 0
01-01 00:47:38.947 2788-2788/com.example.netlh.pwm D/AndroidThings: DutyCycle: 10
01-01 00:47:39.050 2788-2788/com.example.netlh.pwm D/AndroidThings: DutyCycle: 20
01-01 00:47:39.152 2788-2788/com.example.netlh.pwm D/AndroidThings: DutyCycle: 30
01-01 00:47:39.252 2788-2788/com.example.netlh.pwm D/AndroidThings: DutyCycle: 40
占空比以每秒10次的頻率變化,相應的LED燈也會動態(tài)調(diào)整亮度,從而實現(xiàn)了呼吸燈的效果。
測試過程中發(fā)現(xiàn)一個問題,應該算是Android Studio的BUG。不過要注意,在應用的模塊級別 build.gradle 文件中將 minSdkVersion 設置為 15 或以上時,Instant Run 才受支持。為獲得最佳性能,可以將 minSdkVersion 設置為 21 或更高。
使用Instant Run時會導致APP退出,必須得重新啟動APP才可以執(zhí)行。
需要注意的是,PWM輸出并不是模擬信號,而是利用數(shù)字輸出來達到模擬信號的特性,通過調(diào)整頻率及占空比,可以實現(xiàn)常規(guī)模擬信號不能達到的要求,在電機控制、燈光調(diào)光方面應用非常廣泛。在AndroidThings設備中使用PWM,方法更簡單!
接下來使用AndroidThings來讀取GPS信息,使用的設備是UART。
-
- 本文系21ic原創(chuàng),未經(jīng)許可禁止轉(zhuǎn)載!
網(wǎng)友評論
- 聯(lián)系人:巧克力娃娃
- 郵箱:board@21ic.com
- 我要投稿
-
歡迎入駐,開放投稿
-
人均百萬?英偉達中國員工收入曝光! 2024-08-29
-
《黑神話:悟空》玩家硬盤升級攻略:提升游戲體驗,暢享3A大作 2024-08-29
-
數(shù)睿數(shù)據(jù)參加《系統(tǒng)與軟件工程 低代碼開發(fā)平臺通用技術要求》國家標準編制 2024-08-29
- NRF52810藍牙數(shù)字耳機找人定制
預算:¥30005天前
- 125KW模塊式PCS軟硬件外包開發(fā)
預算:¥1100000015小時前
- 12V汽車啟動電源項目BMS設計
預算:¥50000023小時前
- 數(shù)據(jù)可視化軟件 開發(fā)
預算:¥5000023小時前
- PLC項目調(diào)試修改
預算:¥100001天前
- 起動電機控制器開發(fā)
預算:¥1100001天前