首頁 > 評(píng)測(cè) > NXP i.MX7D與AndroidThings系列之六:PWM輸出
NXP i.MX7D與AndroidThings系列之六:PWM輸出
- [導(dǎo)讀]
- 本文是AndroidThings的第六篇,將為大家演示如何通過PWM實(shí)現(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設(shè)備的名稱,在AndroidThings,外設(shè)都是以字符串的形式來提供,無謂好壞,只是命名習(xí)慣而已?赡芎芏嘣MCU上編程的用戶習(xí)慣了使用數(shù)字編號(hào)來指定,在AndroidThings里,就遵循這個(gè)習(xí)慣好了。
mPwm變量表示的是PWM對(duì)象,所有與PWM相關(guān)的操作都是通過該對(duì)象來實(shí)現(xiàn),不過使用的時(shí)候注意如何處理異常。
接下來的三個(gè)變量都是用來實(shí)現(xiàn)呼吸燈效果的,mHandler可以實(shí)現(xiàn)代碼的延遲執(zhí)行,精度為ms級(jí)。mDutyCycle代表的是PWM的占空比,step變量用來動(dòng)態(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();
}
}
重點(diǎn)戲都在這里,雖然代碼不多,可是我們所要的功能都在這里。
首先打開PWM1設(shè)備,然后設(shè)置PWM中最重要的兩個(gè)參數(shù),即頻率和占空比,這里我們將頻率設(shè)置為1000Hz即周期為1ms,占空比初始值為0,也就是說LED燈處于熄滅狀態(tài)。
接下來使用Handler來實(shí)現(xiàn)延時(shí)操作,Handler.postDelay()延遲若干毫秒后再執(zhí)行指定的Runnable,在這個(gè)過程中動(dòng)態(tài)調(diào)整占空比,從而實(shí)現(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會(huì)看到如下信息
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次的頻率變化,相應(yīng)的LED燈也會(huì)動(dòng)態(tài)調(diào)整亮度,從而實(shí)現(xiàn)了呼吸燈的效果。
測(cè)試過程中發(fā)現(xiàn)一個(gè)問題,應(yīng)該算是Android Studio的BUG。不過要注意,在應(yīng)用的模塊級(jí)別 build.gradle 文件中將 minSdkVersion 設(shè)置為 15 或以上時(shí),Instant Run 才受支持。為獲得最佳性能,可以將 minSdkVersion 設(shè)置為 21 或更高。
使用Instant Run時(shí)會(huì)導(dǎo)致APP退出,必須得重新啟動(dòng)APP才可以執(zhí)行。
需要注意的是,PWM輸出并不是模擬信號(hào),而是利用數(shù)字輸出來達(dá)到模擬信號(hào)的特性,通過調(diào)整頻率及占空比,可以實(shí)現(xiàn)常規(guī)模擬信號(hào)不能達(dá)到的要求,在電機(jī)控制、燈光調(diào)光方面應(yīng)用非常廣泛。在AndroidThings設(shè)備中使用PWM,方法更簡(jiǎn)單!
接下來使用AndroidThings來讀取GPS信息,使用的設(shè)備是UART。
- 本文系21ic原創(chuàng),未經(jīng)許可禁止轉(zhuǎn)載!
網(wǎng)友評(píng)論
- 聯(lián)系人:巧克力娃娃
- 郵箱:board@21ic.com
- 我要投稿
-
歡迎入駐,開放投稿
- NRF52810藍(lán)牙數(shù)字耳機(jī)找人定制
預(yù)算:¥30005天前
- 125KW模塊式PCS軟硬件外包開發(fā)
預(yù)算:¥1100000015小時(shí)前
- 12V汽車啟動(dòng)電源項(xiàng)目BMS設(shè)計(jì)
預(yù)算:¥50000023小時(shí)前
- 數(shù)據(jù)可視化軟件 開發(fā)
預(yù)算:¥5000023小時(shí)前
- PLC項(xiàng)目調(diào)試修改
預(yù)算:¥100001天前
- 起動(dòng)電機(jī)控制器開發(fā)
預(yù)算:¥1100001天前