在前一篇文章《Wintel物聯網平台-Windows IoT新手入門指南》中,我們講解了Windows on Device硬件准備和軟件開發環境的搭建,以及Hello Blinky項目的演示。在這篇文章開始,我們進入項目實踐部分。
由於Windows on Device設計的時候以Galileo為硬件平台,所以其外設接口也是兼容了Arduino的標准。另外,其編程模式也是參考了Arduino中使用的Wiring Language。
Pulse Width Modulation 就是通常所說的PWM,譯為脈沖寬度調制,簡稱脈寬調制。脈沖寬度調制(PWM)是一種對模擬信號電平進行數字編碼的方法,由於計算機不能輸出模擬電壓,只能輸出0 或5V 的的數字電壓值,我們就通過使用高分辨率計數器,利用方波的占空比被調制的方法來對一個具體模擬信號的電平進行編碼。PWM 信號仍然是數字的,因為在給定的任何時刻,滿幅值的直流供電要麼是5V(ON),要麼是0V(OFF)。電壓或電流源是以一種通(ON)或斷(OFF)的重復脈沖序列被加到模擬負載上去的。通的時候即是直流供電被加到負載上的時候,斷的時候即是供電被斷開的時候。只要帶寬足夠,任何模擬值都可以使用PWM 進行編碼。輸出的電壓值是通過通和斷的時間進行計算的。輸出電壓=(接通時間/脈沖時間)*最大電壓值。
PWM 被用在許多地方,調光燈具、電機調速、聲音的制作等等。PWM 的三個基本參數如下:
Arduino 控制器有6 個PWM 接口分別是數字接口3、5、6、9、10、11,同樣,在Galileo上也是這些接口支持PWM 輸出。
這次實踐項目需要使用的元器件有:
電位計作為Galileo的模擬值輸入,我們接到模擬口;LED燈我們接到PWM 接口上,這樣通過產生不同的PWM 信號就可以讓小燈有亮度不同的變化。
連接的原理圖和硬件圖如下:
在編寫程序的過程中,我們會用到模擬寫入analogWrite(PWM 接口,模擬值)函數,對於模擬寫入analogWrite()函數,此函數用法也很簡單,我們在本實驗中讀取電位計的模擬值信號並將其賦給PWM 接口使小燈產生相應的亮度變化,再在屏幕上顯示出讀取的模擬值,大家可以理解為此程序是在模擬值讀取的實驗程序中多加了將模擬值賦給PWM 接口這一部分,下面是一段供參考的源程序,使用了模擬輸入接口0和數字接口11。
// Main.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "arduino.h"
int _tmain(int argc, _TCHAR* argv[])
{
return RunArduinoSketch();
}
int potpin = 0;//定義模擬接口0
int ledpin = 11;//定義數字接口11(PWM 輸出)
int val = 0;// 暫存來自傳感器的變量數值
void setup()
{
// TODO: Add your code here
pinMode(ledpin, OUTPUT);//定義數字接口11 為輸出
//注意:模擬接口自動設置為輸入
}
// the loop routine runs over and over again forever:
void loop()
{
// TODO: Add your code here
val = analogRead(potpin);// 讀取電位計的模擬值並賦值給val
Log(L"val: %d\r\n", val); //在調試窗口輸出數值
analogWrite(ledpin, val / 4);// 打開LED 並設置亮度(PWM 輸出最大值為255)
delay(10);//延時0.01 秒
}
啟動Galileo,利用TelNet建立連接,然後點擊調試。程序就會通過網口下載到Galileo上。我們旋轉電位計的旋鈕,不但可以看到屏幕上數值的變化,還也可以清楚的看到我們面包板上的LED 小燈的亮度也在隨之變化。
調試的視頻鏈接如下,大家可以看看調光燈的效果:http://v.youku.com/v_show/id_XODU0NjY1OTQw.html