1. 程式人生 > >Arduino的詳細介紹(基於Mega2560)(分文)——PWM的analogWrite()

Arduino的詳細介紹(基於Mega2560)(分文)——PWM的analogWrite()

Arduino的PWM是我寫Arduino系列博文的根本原因,因而肯定會更加詳細地介紹。

一:PWM的介紹:

PWM是一種調製方式,那麼為什麼會有這種方式存在?大家可能知道Arduino有模擬輸入引腳,這些引腳是通過A/D轉換操作的,而一般的數字引腳卻只能輸入HIGH或LOW電平,那麼中間電平可否輸出呢?比如2v的電平如何輸出?於是PWM應運而生。PWM的高明之處在於:它輸出的仍然是HIGH或者LOW電平,但可以間歇性週期性輸出,則利用取平均值的方法,可以達到滿意的輸出效果。一個簡單的例子:在0~5s內輸出5v的電平,那麼0~5s的平均電壓就是5v,而倘若我在0~2.5s輸出5v,在2.5~5s輸出0v(佔空比50%),那麼這5s內平均電平就是2.5v,顯然可以達到我們想要的效果。但仍有問題:倘若你的週期很長,就像上面例子所說,週期5s,點亮一個LED燈(LOW亮,HIGH滅),那麼LED燈顯然是前2.5s滅,後2.5s亮,顯然達不到調燈暗亮的效果。但當週期被縮小之後比如20ms,這時候亮與滅只是很短時間內的事,肉眼根本看不到亮滅的變化,因而LED燈表現的就是亮度變暗。於是我們知道:PWM調製的週期一般比較短

。PWM只是用數字輸出替代模擬量輸出,因此單方面還是不行的,這就要求我們的裝置還要支援PWM的調製。(比如舵機等)。因而PWM的週期也不能任意短,還需要滿足我們裝置的調製要求。

我這裡只是非常通俗的理解,如果還有疑問請查閱相關資料。

二:analogWrite()

功能:

analogWrite()實現對引腳設定PWM的要求。可以被用來控制LED等,電機轉動,舵機等。使用此函式後,引腳會產生穩定的方波,直到下一次對引腳做其他操作。大多數引腳的PWM頻率大約為490Hz。在Uno以及相似的板子上,pin5和pin6有大約980Hz的頻率。Leonardo板子的pin3和pin11也有980Hz的頻率。

在大多數的Arduino板子上(用ATmega168或者ATmega328的板子),在引腳3,5,6,9,10和11有PWM功能;在Arduino Mega板子上,在2~13和44~46引腳有PWM功能。使用ATmega8的老闆子只在9,10和11引腳支援analogWrite()。

Arduino Due板子在2到13引腳和DAC0,DAC1引腳支援analogWrite()。但是ADC0和DAC1是採用D/A轉換的方式輸出,它們確實輸出的是模擬量而不是由PWM調製輸出的。

另外,使用analogWrite()不需要再用pinMode()設定引腳為輸出。

形式:

analogWrite(pin,value)

引數:

pin:寫入的引腳;

value:佔空比,在0~255之間。(0時候為關,即LOW;255為開,即HIGH)

返回值:none

注:5pin和6pin產生的PWM輸出會比設定的佔空比高,這是因為millis()和delay()函式與它們使用相同的內部時鐘。

示例:

int ledPin = 9;      // LED connected to digital pin 9

int analogPin = 3;   // potentiometer connected to analog pin 3

int val = 0;         // variable to store the read value



void setup()

{

  pinMode(ledPin, OUTPUT);   // sets the pin as output

}



void loop()

{

  val = analogRead(analogPin);   // read the input pin

  analogWrite(ledPin, val / 4);  // analogRead values go from 0 to 1023, analogWrite values from 0 to 255

}

現在我們來看看為何Servo庫detach時候要連9或10pin。首先舵機需要20ms的控制週期,可見9,10腳在使用Servo庫的時候其引腳PWM頻率應該大概為1/0.02=50Hz,也就是這兩引腳的PWM週期恰好滿足了舵機的控制要求。我們來看看Servo庫相關資料:

The Servo library supports up to 12 motors on most Arduino boards and 48 on the Arduino Mega. On boards other than the Mega, use of the library disables analogWrite() (PWM) functionality on pins 9 and 10, whether or not there is a Servo on those pins. On the Mega, up to 12 servos can be used without interfering with PWM functionality; use of 12 to 23 motors will disable PWM on pins 11 and 12.

可見,Servo使用時候會disable PWM,說明Servo的控制原理並不是利用Arduino本來的PWM輸出,而是自己重新模擬了PWM。並且,現在的Arduino最多可支援48路motors,說明attach只限定於9,10口肯定是不合理的。我們再接著看,到attach()函式的說明頁:
Attach the Servo variable to a pin. Note that in Arduino 0016 and earlier, the Servo library supports only servos on only two pins: 9 and 10.

於是真相大白了:Arduino 0016版本的Servo library編寫時候只支援9,10pin,這裡的0016當然不是Arduino的硬體版本,而是Arduino IDE的軟體版本!那麼,自己的軟體版本到底是多少呢?不用想了,現在肯定不止0016版本了!你可以開啟Arduino IDE安裝目錄,找到revisions.txt文字檔案開啟看看(可以從後往前找,這是版本我更新史啊!),可以看到:ARDUINO 0016 - 2009.05.30。09年時候發行的才是0016版本!所以現在就放心使用Servo library吧。

另外提醒下:使用多個舵機時候最好使用額外電源供電。

相關推薦

Arduino詳細介紹基於Mega2560分文——PWM的analogWrite()

Arduino的PWM是我寫Arduino系列博文的根本原因,因而肯定會更加詳細地介紹。 一:PWM的介紹: PWM是一種調製方式,那麼為什麼會有這種方式存在?大家可能知道Arduino有模擬輸入引腳,這些引腳是通過A/D轉換操作的,而一般的數字引腳卻只能輸入HIGH或L

Arduino詳細介紹基於Mega2560

很早之前入手了一塊Arduino Mega2560,當時只是認為其操作簡單且更加人性化,開源方便,想了解了解。最新搞專案想用Arduino試試控制8路舵機,但網上找的Servo庫大多說只支援9,10介面,很是惱火(資料怎麼寫就怎麼搬,到底是不是隻支援9,10介面有幾個知道?

Disconf 學習系列之全網最詳細的最新穩定Disconf 搭建部署基於Ubuntu14.04 / 16.04圖文詳解

class 6.0 conf ubuntu14 穩定 div ubun 搭建 學習   不多說直接上幹貨! https://www.cnblogs.com/wuxiaofeng/p/6882596.html (ubuntu16.04) https

詳細介紹Flex中操作XML

一  在介紹Flex中操作XML之前,首先簡單介紹下XML中的基本術語。     元素:XML中擁有開始標籤和結束標籤的這一塊稱為“元素”    節點:把XML元素與文字結合起來統稱為節點    根節點:位於整個XML文當頂端的節點    文字節點:包含文字的節點    屬性:元素的組成部分,以鍵/值形式放

java解析xml文件練習——通過應用包名獲取應用圖標即其他信息基於魅族應用商店

fin vma tdm row con smartd enter music close 1、解析包名數據文件(txt文件),並生成包名數組: package jsouphtml; import java.io.BufferedReader; import j

OpenLDAP學習筆記基於OpenLDAP-2.4.x

ldap slapd 同步 1.1、什麽是目錄服務(Directory Services)? 目錄是一個特殊的數據庫,專門用於搜索和瀏覽,另外也支持基本的查詢和更新功能。 目錄是一個為查詢、瀏覽和搜索而優化的專業分布式數據庫,它呈樹狀結構組織數據,就好象Linux/Unix系統中的文件

通過新浪雲部署NideShop微信小程序商城基於Node.js+MySQL+ThinkJS

小程序 微信 mysql 一、購買新浪雲SAE為什麽選擇SAE? 免費二級域名和支持https訪問,不用備案,可用於做微信小程序服務器。SAE推薦鏈接:http://sae.sina.com.cn/選擇對應的部署環境自定義 -> 開發言語:自定義 -> 運行環境:雲容器 -> 語

使用密鑰登錄CentOS系統基於密鑰的認證

支持 使用 enter ase add 默認 strong rdquo mage 在Window客戶端有多種軟件可以登陸ssh,比如putty,xshelll,secureCRT,我就以xshell為例設置使用公鑰和私鑰驗證登陸服務器。 使用Xshell密鑰認證機制遠程登

一個還算簡單的微信消息SDK基於.Net Standard 2.0

sch 入口 技術分享 ret 公眾 func exec 實體 blank   雖然微信公眾號出現了好久,不過在SDK這件事情上感覺並沒有多少人把它當成一個有技術含量的事情來做,很多SDK做的事情就是一個代碼的堆疊,當然也可能寫的好的並沒有開源出來。所以在某個翻遍Githu

Spring集成Redis方案spring-data-redis基於Jedis的單機模式待實踐

packaging 基於 .cn @override time Coding 很好 -o -i 繼上一篇文章http://www.cnblogs.com/EasonJim/p/7625738.html中提到的幾款客戶端,它們基本都能和Spring集成。 下面介紹的是基於S

Webservice實現與調用基於Spring的多種方式

ddr dem pid pos simple 下載 bus 代理 println 一、Webservice實現 實現方式分類 1. spring實現 bean配置 <bean class="org.springframework.remoting.

Flume NG高可用叢集搭建詳解基於flume-1.7.0

1、Flume NG簡述 Flume NG是一個分散式,高可用,可靠的系統,它能將不同的海量資料收集,移動並存儲到一個數據儲存系統中。輕量,配置簡單,適用於各種日誌收集,並支援 Failover和負載均衡。並且它擁有非常豐富的元件。Flume NG採用的是三層架構:Agent層,Collecto

redis cluster 叢集重新分片故障處理基於redis 4.0.6

redis cluster 叢集重新分片故障處理(基於redis 4.0.6)  環境: redis:4.0.6 現象: 開始gem安裝redis預設版本,gem install redis,部署叢集完畢後,測試程式碼寫入叢集資料,然後進行分片,發現一隻報錯,錯誤如下

快速入門完整:Python例項100個基於最新Python3.7版本

Python3 100例 原題地址: http://www.runoob.com/python/python-100-examples.html git地址: https://github.com/RichardFu123/Python100Cases 轉載請標註: https:

CentOS7連線無線網和有線網基於VMWare Workstation 14 Pro

1、連線有線網路 1)本機(Windows系統)中,開啟網路和共享中心,ip地址改為自動獲取; 2)保證本機連線有線網; 2)CentOS中選擇“應用程式”,“系統工具”,“設定”,“網路”,選擇開啟“有線連線”,即可上網,如下圖所示; 至此,可以發現VMWare啟用的Cent

CentOS7設定資料夾共享基於VMWare Workstation 14 Pro

1、開啟VMWare Workstation 14 Pro,選單欄找到“虛擬機器(M)”,點選,下拉選單依次選擇“設定”、“選項”,點選“共享資料夾”,在“資料夾共享”下選擇“總是啟用”,“資料夾(F)”可選擇任意路徑下的資料夾; 2、不能建立共享資料夾的解決辦法: 1)選單欄找到“

nmcli基於會話的網路管理

network manager command line tool 此服務主要依賴於:NetworkManager.service, 在配置網路管理之前,首先要開啟NetworkManager.service 在linux中主要用以下型別的連結: device :網路介面,接物理裝置的

Protocol Buffer 之 Java 使用基於Spring Boot 2.x

開發環境:使用Intellij IDEA + Maven + Spring Boot 2.x + JDK 8 1.在專案的pom.xml檔案下,引入protobuf的Jar開發包依賴;並且可以配置protobuf 的Maven外掛,對編寫的proto檔案編譯成Java檔案。

Redis 客戶端之Redisson 配置使用基於Spring Boot 2.x

開發環境:使用Intellij IDEA + Maven + Spring Boot 2.x + JDK 8 1.在專案的pom.xml檔案下,引入Redis和Redisson在Spring Boot 下的相關Jar包依賴。 <properties>

Neo4j 做推薦 12—— 協同過濾基於鄰域的推薦

kNN——K近鄰 現在我們有了一種基於偏好查詢類似使用者的方法,下一步是允許每個k個最相似的使用者投票選擇應該推薦的專案。 主要有: