www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

首頁 > 評測 > NXP i.MX7D與AndroidThings系列之六:PWM輸出

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

NXP   i.MX7D    AndroidThings    PWM   
  • 作者:SATURN
  • 來源:21ic
  • [導讀]
  • 本文是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_NAMEPWM1設備的名稱,在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 StudioBUG。不過要注意,在應用的模塊級別 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)友評論