首頁 > 評(píng)測(cè) > NXP i.MX7D與AndroidThings系列之六:PWM輸出

NXP i.MX7D與AndroidThings系列之六:PWM輸出

NXP   i.MX7D    AndroidThings    PWM   
  • 作者:SATURN
  • 來源:21ic
  • [導(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_NAMEPWM1設(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 StudioBUG。不過要注意,在應(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
  • 我要投稿
  • 歡迎入駐,開放投稿

熱門標(biāo)簽
項(xiàng)目外包 more+