注:1.這篇文章斷斷續(xù)續(xù)寫了很久,畫圖技術(shù)也不精,難免錯(cuò)漏,大家湊合看.有問題可以留言. 2.論壇排版把我的代碼縮進(jìn)全弄沒了,大家將代碼粘貼到arduino編譯器,然后按ctrl+T重新格式化代碼格式即可看的舒服. 一、什么是PWM PWM 即Pulse Wavelength Modulation 脈寬調(diào)制波,通過調(diào)整輸出信號(hào)占空比,從而達(dá)到改 變輸出平均電壓的目的。相信Arduino 的PWM 大家都不陌生,在Arduino Duemilanove 2009 中,有6 個(gè)8 位精度PWM 引腳,分別是3, 5, 6, 9, 10, 11 腳。我們可以使用analogWrite()控 制PWM 腳輸出頻率大概在500Hz 的左右的PWM 調(diào)制波。分辨率8 位即2 的8 次方等于 256 級(jí)精度。但是有時(shí)候我們會(huì)覺得6 個(gè)PWM 引腳不夠用。比如我們做一個(gè)10 路燈調(diào)光, 就需要有10 個(gè)PWM 腳。Arduino Duemilanove 2009 有13 個(gè)數(shù)字輸出腳,如果它們都可以 PWM 的話,就能滿足條件了。于是本文介紹用軟件模擬PWM。 二、Arduino 軟件模擬PWM Arduino PWM 調(diào)壓原理:PWM 有好幾種方法。而Arduino 因?yàn)殡娫春蛯?shí)現(xiàn)難度限制,一般 使用周期恒定,占空比變化的單極性PWM。 通過調(diào)整一個(gè)周期里面輸出腳高/低電平的時(shí)間比(即是占空比)去獲得給一個(gè)用電器不同 的平均功率。 如圖所示,假設(shè)PWM 波形周期1ms(即1kHz),分辨率1000 級(jí)。那么需要一個(gè)信號(hào)時(shí)間 精度1ms/1000=1us 的信號(hào)源,即1MHz。所以說,PWM 的實(shí)現(xiàn)難點(diǎn)在于需要使用很高頻的 信號(hào)源,才能獲得快速與高精度。下面先由一個(gè)簡(jiǎn)單的PWM 程序開始: const int PWMPin = 13; int bright = 0; void setup() { pinMode(PWMPin, OUTPUT); } void loop() { if((bright++) == 255) bright = 0; for(int i = 0; i < 255; i++) { if(i < bright) { digitalWrite(PWMPin, HIGH); delayMicroseconds(30); } else { digitalWrite(PWMPin, LOW); delayMicroseconds(30); } } } 這是一個(gè)軟件PWM 控制Arduino D13 引腳的例子。只需要一塊Arduino 即可測(cè)試此代碼。 程序解析:由for 循環(huán)可以看出,完成一個(gè)PWM 周期,共循環(huán)255 次。 假設(shè)bright=100 時(shí)候,在第0~100 次循環(huán)中,i 等于1 到99 均小于bright,于是輸出PWMPin 高電平; 然后第100 到255 次循環(huán)里面,i 等于100~255 大于bright,于是輸出PWMPin 低電平。無 論輸出高低電平都保持30us。 那么說,如果bright=100 的話,就有100 次循環(huán)是高電平,155 次循環(huán)是低電平。 如果忽略指令執(zhí)行時(shí)間的話,這次的PWM 波形占空比為100/255,如果調(diào)整bright 的值, 就能改變接在D13 的LED 的亮度。 這里設(shè)置了每次for 循環(huán)之后,將bright 加一,并且當(dāng)bright 加到255 時(shí)歸0。所以,我們 看到的最終效果就是LED 慢慢變亮,到頂之后然后突然暗回去重新變亮。 這是最基本的PWM 方法,也應(yīng)該是大家想的比較多的想法。 然后介紹一個(gè)簡(jiǎn)單一點(diǎn)的。思維風(fēng)格完全不同。不過對(duì)于驅(qū)動(dòng)一個(gè)LED 來說,效果與上面 的程序一樣。 const int PWMPin = 13; int bright = 0; void setup() { pinMode(PWMPin, OUTPUT); } void loop() { digitalWrite(PWMPin, HIGH); delayMicroseconds(bright*30); digitalWrite(PWMPin, LOW); delayMicroseconds((255 - bright)*30); if((bright++) == 255) bright = 0; } 可以看出,這段代碼少了一個(gè)For 循環(huán)。它先輸出一個(gè)高電平,然后維持(bright*30)us。然 后輸出一個(gè)低電平,維持時(shí)間((255-bright)*30)us。這樣兩次高低就能完成一個(gè)PWM 周期。 分辨率也是255。 三、多引腳PWM Arduino 本身已有PWM 引腳并且運(yùn)行起來不占CPU 時(shí)間,所以軟件模擬一個(gè)引腳的PWM 完全沒有實(shí)用意義。我們軟件模擬的價(jià)值在于:他能將任意的數(shù)字IO 口變成PWM 引腳。 當(dāng)一片Arduino 要同時(shí)控制多個(gè)PWM,并且沒有其他重任務(wù)的時(shí)候,就要用軟件PWM 了。 多引腳PWM 有一種下面的方式: int brights[14] = {0}; //定義14個(gè)引腳的初始亮度,可以隨意設(shè)置 int StartPWMPin = 0, EndPWMPin = 13; //設(shè)置D0~D13為PWM 引腳 int PWMResolution = 255; //設(shè)置PWM 占空比分辨率 void setup() { //定義所有IO 端輸出 for(int i = StartPWMPin; i <= EndPWMPin; i++) { pinMode(i, OUTPUT); //隨便定義個(gè)初始亮度,便于觀察 brights[ i ] = random(0, 255); } } void loop() { //這for 循環(huán)是為14盞燈做漸亮的。每次Arduino loop()循環(huán), //brights 自增一次。直到brights=255時(shí)候,將brights 置零重新計(jì)數(shù)。 for(int i = StartPWMPin; i <= EndPWMPin; i++) { if((brights[i]++) == PWMResolution) brights[i] = 0; } for(int i = 0; i <= PWMResolution; i++) //i 是計(jì)數(shù)一個(gè)PWM 周期 { for(int j = StartPWMPin; j <= EndPWMPin; j++) //每個(gè)PWM 周期均遍歷所有引腳 { if(i < brights[j])\ 所以我們要更改PWM 周期的話,我們將精度(代碼里面的變量:PWMResolution)降低就行,比如一般調(diào)整LED 亮度的話,我們用64 級(jí)精度就行。這樣速度就是2x32x64=4ms。就不會(huì)閃了。
上傳時(shí)間: 2013-10-23
上傳用戶:mqien
7400 2輸入端四與非門 7401 集電極開路2輸入端四與非門 7402 2輸入端四或非門 7403 集電極開路2輸入端四與非門 7404 六反相器 7405 集電極開路六反相器 7406 集電極開路六反相高壓驅(qū)動(dòng)器 7407 集電極開路六正相高壓驅(qū)動(dòng)器 7408 2輸入端四與門 7409 集電極開路2輸入端四與門 7410 3輸入端3與非門 74107 帶清除主從雙J-K觸發(fā)器 74109 帶預(yù)置清除正觸發(fā)雙J-K觸發(fā)器 7411 3輸入端3與門 74112 帶預(yù)置清除負(fù)觸發(fā)雙J-K觸發(fā)器 7412 開路輸出3輸入端三與非門 74121 單穩(wěn)態(tài)多諧振蕩器 74122 可再觸發(fā)單穩(wěn)態(tài)多諧振蕩器 74123 雙可再觸發(fā)單穩(wěn)態(tài)多諧振蕩器 74125 三態(tài)輸出高有效四總線緩沖門 74126 三態(tài)輸出低有效四總線緩沖門 7413 4輸入端雙與非施密特觸發(fā)器 74132 2輸入端四與非施密特觸發(fā)器 74133 13輸入端與非門 74136 四異或門 74138 3-8線譯碼器/復(fù)工器 74139 雙2-4線譯碼器/復(fù)工器 7414 六反相施密特觸發(fā)器 74145 BCD—十進(jìn)制譯碼/驅(qū)動(dòng)器 7415 開路輸出3輸入端三與門 74150 16選1數(shù)據(jù)選擇/多路開關(guān) 74151 8選1數(shù)據(jù)選擇器 74153 雙4選1數(shù)據(jù)選擇器 74154 4線—16線譯碼器
上傳時(shí)間: 2014-01-10
上傳用戶:jackgao
家具行業(yè)的成本核算報(bào)價(jià)系統(tǒng),主要征對(duì)家個(gè)產(chǎn)品的結(jié)構(gòu)展開進(jìn)行材料成本及人工制造費(fèi)用統(tǒng)計(jì),加上可調(diào)節(jié)的利潤設(shè)定,將其成本核算出來,同時(shí)將報(bào)價(jià)單作出來
上傳時(shí)間: 2014-01-21
上傳用戶:songnanhua
九十三學(xué)年 度 全國大學(xué)校院嵌入式軟體設(shè)計(jì)競(jìng)賽 多媒體組決賽報(bào)告書 具效能與耗電可調(diào)適性之智慧型數 位相機(jī)
標(biāo)簽: 63886 63849 64001 嵌入式
上傳時(shí)間: 2014-11-29
上傳用戶:jjj0202
OPEN-JTAG ARM JTAG 測(cè)試原理 1 前言 本篇報(bào)告主要介紹ARM JTAG測(cè)試的基本原理。基本的內(nèi)容包括了TAP (TEST ACCESS PORT) 和BOUNDARY-SCAN ARCHITECTURE的介紹,在此基礎(chǔ)上,結(jié)合ARM7TDMI詳細(xì)介紹了的JTAG測(cè)試原理。 2 IEEE Standard 1149.1 - Test Access Port and Boundary-Scan Architecture 從IEEE的JTAG測(cè)試標(biāo)準(zhǔn)開始,JTAG是JOINT TEST ACTION GROUP的簡(jiǎn)稱。IEEE 1149.1標(biāo)準(zhǔn)最初是由JTAG這個(gè)組織提出,最終由IEEE批準(zhǔn)並且標(biāo)準(zhǔn)化,所以,IEEE 1149.1這個(gè)標(biāo)準(zhǔn)一般也俗稱JTAG測(cè)試標(biāo)準(zhǔn)。 接下來介紹TAP (TEST ACCESS PORT) 和BOUNDARY-SCAN ARCHITECTURE的基本架構(gòu)。
標(biāo)簽: JTAG BOUNDARY-SCAN OPEN-JTAG ARM
上傳時(shí)間: 2016-08-16
上傳用戶:sssl
windows 環(huán)境下的所有報(bào)行指令, 如winver 檢查Windows版本 wmimgmt.msc 打開Windows管理體系結(jié)構(gòu)(wmi) wupdmgr Windows更新程序 wscript Windows腳本宿主設(shè)置 write 寫字板 等等...其它的指令瑪
標(biāo)簽: Windows windows wmimgmt wupdmgr
上傳時(shí)間: 2013-12-26
上傳用戶:225588
電子報(bào)軟體. 你想輕輕鬆鬆的寄送電子報(bào) 功能介紹: 1. 支援多個(gè)伺服器分散流量. (已可設(shè)定每次的最大郵件數(shù)) 2. 支援多個(gè)設(shè)定檔選擇. 3. 可直接選擇硬碟內(nèi)的 HTML, 純文字檔當(dāng)做寄信內(nèi)容. 4. 支援定時(shí)、每日、每週、每月送信. 5. 配合 ServiceAgent 可以成為NT/2000下的服務(wù). 6. 可夾帶附件檔案. 7. 在原本可直接選取電腦硬碟上的檔案(HTML)來做為HTML寄信的本文之外, 目前已能將 HTML 內(nèi)的圖檔(gif,jpg,bmp,png)的 <img> tag 和 音效檔(wav,mid,swf)的<EMBED> tag 的內(nèi)容一起勘進(jìn)郵件內(nèi)容裡. 8. 以 Command Line 執(zhí)行的方式就能啟動(dòng)寄信流程. 9. 透過電子郵件信箱即可啟動(dòng)自動(dòng)化電子報(bào)訂閱/取消功能! 開發(fā)工具: 1. Delphi 5 2. Indy Winshoes8 (free delphi component)
上傳時(shí)間: 2014-01-05
上傳用戶:l254587896
這是compiere2的官方?jīng)]問題版本~我在fedora10上安裝正確無誤~不會(huì)出現(xiàn)錯(cuò)誤訊息 ~不過我發(fā)現(xiàn)compiere他自己本身有自己專屬的網(wǎng)站server~所以有架設(shè)網(wǎng)站的網(wǎng)友們~ 可能要斟酌一下~最好把他獨(dú)立開來比較好~= =~我發(fā)現(xiàn)他挺消耗系統(tǒng)資源的~
標(biāo)簽: compiere2 compiere fedora server
上傳時(shí)間: 2014-12-04
上傳用戶:yy541071797
/*最大k乘積問題 問題描述: 設(shè)I是一個(gè)n位十進(jìn)制整數(shù)。如果將I劃分為k段,則可得到k個(gè)整數(shù)。這k個(gè)整數(shù)的乘積稱為I的一個(gè)k乘積 。 試設(shè)計(jì)一個(gè)算法,對(duì)于給定的I和k,求出I的最大k乘積(n<=10)。 示例:輸入為 : 4 3 結(jié)果:1234 */
上傳時(shí)間: 2013-12-14
上傳用戶:caixiaoxu26
(1)輸入E條弧<j,k>,建立AOE-網(wǎng)的存儲(chǔ)結(jié)構(gòu) (2)從源點(diǎn)v出發(fā),令ve[0]=0,按拓?fù)渑判蚯笃溆喔黜?xiàng)頂點(diǎn)的最早發(fā)生時(shí)間ve[i](1<=i<=n-1).如果得到的拓樸有序序列中頂點(diǎn)個(gè)數(shù)小于網(wǎng)中頂點(diǎn)數(shù)n,則說明網(wǎng)中存在環(huán),不能求關(guān)鍵路徑,算法終止 否則執(zhí)行步驟(3)(3)從匯點(diǎn)v出發(fā),令vl[n-1]=ve[n-1],按逆拓樸排序求其余各頂點(diǎn)的最遲發(fā)生時(shí)間vl[i](n-2>=i>=2). (4)根據(jù)各頂點(diǎn)的ve和vl值,求每條弧s的最早發(fā)生時(shí)間e(s)和最遲開始時(shí)間l(s).若某條弧滿足條件e(s)=l(s),則為關(guān)鍵活動(dòng).
上傳時(shí)間: 2014-11-28
上傳用戶:fredguo
蟲蟲下載站版權(quán)所有 京ICP備2021023401號(hào)-1