亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

蟲蟲首頁| 資源下載| 資源專輯| 精品軟件
登錄| 注冊

c語(yǔ)言;二級(jí)考級(jí);真題

  • 8階開關電容濾波器MAX29X系列的應用設計

    MAX29X是美國MAXIM公司生瓣的8階開關電容低通濾波器,由于價格便宜、使用方便、設計簡單,在通訊、信號自理等領域得到了廣泛的應用。本文就其工作原理、電氣參數、設計注意事項等問題作了討論,具有一定的實用參考價值。關鍵詞:開關電容、濾波器、設計 1 引言     開關電容濾波器在近些年得到了迅速的發展,世界上一些知名的半導體廠家相繼推出了自己的開頭電容濾波器集成電路,使形狀電容濾波器的發展上了一個新臺階。     MAXIM公司在模擬器件生產領域頗具影響,它生產MAX291/292/293/294/295/296/297系列8階低通開關電容濾波器由于使用方便(基本上不需外接元件)、設計簡單(頻率響應函數是固定的,只需確定其拐角頻率即截止頻率)、尺寸小(有8-pin    DIP封裝)等優點,在ADC的反混疊濾波、噪聲分析、電源噪聲抑制等領域得到了廣泛的應用。     MAX219/295為巴特活思(型濾波器,在通頻帶內,它的增益最穩定,波動小,主要用于儀表測量等要求整個通頻帶內增益恒定的場合。MAX292/296為貝塞爾(Bessel)濾波器,在通頻帶內它的群時延時恒定的,相位對頻率呈線性關系,因此脈沖信號通過MAX292/296之后尖峰幅度小,穩定速度快。由于脈沖信號通過貝塞爾濾波器之后所有頻率分量的延遲時間是相同的,故可保證波形基本不變。關于巴特活和貝塞爾濾波器的特性可能圖1來說明。圖1的蹤跡A為加到濾波器輸入端的3kHz的脈沖,這里我們把濾波器的截止頻率設為10kHZ。蹤跡B通過MAX292/296后的波形。從圖中可以看出,由于MAX292/296在通帶內具有線性相位特性,輸出波形基本上保持了方波形狀,只是邊沿處變圓了一些。方波通過MAX291/295之后,由于不同頻率的信號產生的時延不同,輸出波形中就出現了尖峰(overshoot)和鈴流(ringing)。     MAX293/294/297為8階圓型(Elliptic)濾波器,它的滾降速度快,從通頻帶到阻帶的過渡帶可以作得很窄。在橢圓型濾波器中,第一個傳輸零點后輸出將隨頻率的變高而增大,直到第二個零點處。這樣幾番重復就使阻事賓頻響呈現波浪形,如圖2所示。阻帶從fS起算起,高于頻率fS處的增益不會超過fS處的增益。在橢圓型濾波中,通頻帶內的增益存在一定范圍的波動。橢圓型濾波器的一個重要參數就是過渡比。過渡比定義為阻帶頻率fS與拐角頻率(有時也等同為截止頻率)由時鐘頻率確定。時鐘既可以是外接的時鐘,也可以是自己的內部時鐘。使用內部時鐘時只需外接一個定時用的電容既可。     在MAX29X系列濾波器集成電路中,除了濾波器電路外還有一個獨立的運算放大器(其反相輸入端已在內部接地)。用這個運算放大器可以組成配合MAX29X系列濾波器使用后的濾波、反混濾波等連續時間低通濾波器。     下面歸納一下它們的特點:     ●全部為8階低通濾波器。MAX291/MAX295為巴特沃思濾波器;MAX292/296為貝塞爾濾波器;MAX293/294/297為橢圓濾波器。     ●通過調整時鐘,截止頻率的調整范圍為:0.1Hz~25kHz(MAX291/292/293*294);0.1Hz~kHz(MAX295/296/297)。     ●既可用外部時鐘也可用內部時鐘作為截止頻率的控制時鐘。     ●時鐘頻率和截止頻率的比率:10∶1(MAX291/292/293/294);50∶1(MAX295/296/297)。     ●既可用單+5V電源供電也可用±5V雙電源供電。     ●有一個獨立的運算放大器可用于其它應用目的。     ●8-pin DIP、8-pin SO和寬SO-16多種封裝。2 管腳排列和主要電氣參數     MAX29X系列開頭電容濾波器的管腳排列如圖3所示。     管腳功能定義如下:     CLK:時鐘輸入。     OP OUT:獨立運放的輸出端。     OP INT:獨立運放的同相輸入端。     OUT:濾波器輸出。     IN:濾波器輸入。     V-:負電源 。雙電源供電時搛-2.375~-5.5V之間的電壓,單電源供電時V--=-V。     V+:正電源。雙電源供電時V+=+2.35~+5.5V,單電源供電時V+=+4.75~+11.0V。     GND:地線。單電源工作時GND端必須用電源電壓的一半作偏置電壓。     NC:空腳,無連線。     MAX29X的極限電氣參數如下:     電源(V+~V-):12V     輸入電壓(任意腳):V--0.3V≤VIN≤V++0.3V     連續工作時的功耗:8腳塑封DIP:727mW;8腳SO:471mW;16腳寬SO:762mW;8腳瓷封DIP:640mW。     工作溫度范圍:MAX29-C-:0℃~+70℃;MAX29-E-:-40℃~+85℃;MAX29-MJA:-55℃~+125℃;保存溫度范圍:-65℃~+160℃;焊接溫度(10秒):+300℃;     大多數的形狀電容濾波器都采用四節級連結構,每一節包含兩個濾波器極點。這種方法的特點就是易于設計。但采用這種方法設計出來的濾波器的特性對所用元件的元件值偏差很敏感。基于以上考慮,MAX29X系列用帶有相加和比例功能的開關電容持了梯形無源濾波器,這種方法保持了梯形無源濾波器的優點,在這種結構中每個元件的影響作用是對于整個頻率響應曲線的,某元件值的誤差將會分散到所有的極點,因此不值像四節級連結構那樣對某一個極點特別明顯的影響。3 MAX29X的頻率特性     MAX29X的頻率特性如圖4所示。圖中的fs都假定為1kHz。4 設計考慮     下面對MAX29X系列形狀電容濾波器的使用做些討論。4.1 時鐘信號     MAX29X系列開頭電容濾波器推薦使用的時鐘信號最高頻率為2.5MHz。根據對應的時鐘頻率和拐角頻率的比值,MAX291/MAX292/MAX293/MAX294的拐角頻率最高為25kHz.MAX295/MAX296/MAX297的拐角頻率最高為50kHz 。     MAX29X系列開關電容濾波器的時鐘信號既可幅外部時鐘直接驅動也可由內部振蕩器產生。使用外部時鐘時,無論是采用單電源供電還是雙電源供電,CLK可直接和采用+5V供電的CMOS時鐘信號發生器的輸出相連。通過調整外部時鐘的頻率,可完成濾波器拐角的實時調整。     當使用內部時鐘時,振蕩器的頻率由接在CLK端上的電容VCOSC決定:     fCOSC (kHz)=105/3COSC (pF) 4.2 供電     MAX29X系列開關電容濾波器既可用單電源工作也可用雙電源工作。雙電源供電時的電源電壓范圍為±2.375~±5.5V。在實際電路中一般要在正負電源和GND之間接一旁路電容。     當采用單電源供電時,V-端接地,而GND端要通過電阻分壓獲得一個電壓參考,該電壓參考的電壓值為1/2的電源電壓,參見圖5。4.3 輸入信號幅度范圍限制     MAX29X允許的輸入信號的最大范圍為V--0.3V~V++0.3V。一般情況下在+5V單電源供電時輸入信號范圍取1V~4V,±5V雙電源供電時,輸入信號幅度范圍取±4V。如果輸入信號超過此范圍,總諧波失真THD和噪聲就大大增加;同樣如果輸入信號幅度過小(VP-P<1V),也會造成THD和噪聲的增加。4.4 獨立運算放大器的用法     MAX29X中都設計有一個獨立的運算放大器,這個放大器和濾波器的實現無直接關系,用這個放大器可組成一個一階和二階濾波器,用于實現MAX29X之前的反混疊濾波功能鄞MAX29X之后的時鐘噪聲抑制功能。這個運算放大器的反相端已在內部和GND相連。     圖6是用該獨立運放組成的2階低通濾波器的電路,它的拐角頻率為10kHz,輸入阻抗為22Ω,可滿足MAX29X形狀電容濾波器的最小負載要求(MAX29X的輸出負載要求不小于20kΩ)可以通過改變R1、R2、R3、C1、C2的元件值改變拐角頻率。具體的元件值和拐角頻率的對應關系參見表1。

    標簽: 29X MAX 29 8階

    上傳時間: 2013-10-18

    上傳用戶:macarco

  • TLC2543 中文資料

    TLC2543是TI公司的12位串行模數轉換器,使用開關電容逐次逼近技術完成A/D轉換過程。由于是串行輸入結構,能夠節省51系列單片機I/O資源;且價格適中,分辨率較高,因此在儀器儀表中有較為廣泛的應用。 TLC2543的特點 (1)12位分辯率A/D轉換器; (2)在工作溫度范圍內10μs轉換時間; (3)11個模擬輸入通道; (4)3路內置自測試方式; (5)采樣率為66kbps; (6)線性誤差±1LSBmax; (7)有轉換結束輸出EOC; (8)具有單、雙極性輸出; (9)可編程的MSB或LSB前導; (10)可編程輸出數據長度。 TLC2543的引腳排列及說明    TLC2543有兩種封裝形式:DB、DW或N封裝以及FN封裝,這兩種封裝的引腳排列如圖1,引腳說明見表1 TLC2543電路圖和程序欣賞 #include<reg52.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int sbit clock=P1^0; sbit d_in=P1^1; sbit d_out=P1^2; sbit _cs=P1^3; uchar a1,b1,c1,d1; float sum,sum1; double  sum_final1; double  sum_final; uchar duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar wei[]={0xf7,0xfb,0xfd,0xfe};  void delay(unsigned char b)   //50us {           unsigned char a;           for(;b>0;b--)                     for(a=22;a>0;a--); }  void display(uchar a,uchar b,uchar c,uchar d) {    P0=duan[a]|0x80;    P2=wei[0];    delay(5);    P2=0xff;    P0=duan[b];    P2=wei[1];    delay(5);   P2=0xff;   P0=duan[c];   P2=wei[2];   delay(5);   P2=0xff;   P0=duan[d];   P2=wei[3];   delay(5);   P2=0xff;   } uint read(uchar port) {   uchar  i,al=0,ah=0;   unsigned long ad;   clock=0;   _cs=0;   port<<=4;   for(i=0;i<4;i++)  {    d_in=port&0x80;    clock=1;    clock=0;    port<<=1;  }   d_in=0;   for(i=0;i<8;i++)  {    clock=1;    clock=0;  }   _cs=1;   delay(5);   _cs=0;   for(i=0;i<4;i++)  {    clock=1;    ah<<=1;    if(d_out)ah|=0x01;    clock=0; }   for(i=0;i<8;i++)  {    clock=1;    al<<=1;    if(d_out) al|=0x01;    clock=0;  }   _cs=1;   ad=(uint)ah;   ad<<=8;   ad|=al;   return(ad); }  void main()  {   uchar j;   sum=0;sum1=0;   sum_final=0;   sum_final1=0;    while(1)  {              for(j=0;j<128;j++)          {             sum1+=read(1);             display(a1,b1,c1,d1);           }            sum=sum1/128;            sum1=0;            sum_final1=(sum/4095)*5;            sum_final=sum_final1*1000;            a1=(int)sum_final/1000;            b1=(int)sum_final%1000/100;            c1=(int)sum_final%1000%100/10;            d1=(int)sum_final%10;            display(a1,b1,c1,d1);           }         } 

    標簽: 2543 TLC

    上傳時間: 2013-11-19

    上傳用戶:shen1230

  • 單片機音樂中音調和節拍的確定方法

    單片機音樂中音調和節拍的確定方法:調號-音樂上指用以確定樂曲主音高度的符號。很明顯一個八度就有12個半音。A、B、C、D、E、F、G。經過聲學家的研究,全世界都用這些字母來表示固定的音高。比如,A這個音,標準的音高為每秒鐘振動440周。 升C調:1=#C,也就是降D調:1=BD;277(頻率)升D調:1=#D,也就是降E調:1=BE;311升F調:1=#F,也就是降G調:1=BG;369升G調:1=#G,也就是降A調:1=BA;415升A調:1=#A,也就是降B調:1=BB。466,C 262   #C277   D 294   #D(bE)311  E 330   F 349   #F369   G 392  #G415A 440.    #A466    B 494 所謂1=A,就是說,這首歌曲的“導”要唱得同A一樣高,人們也把這首歌曲叫做A調歌曲,或叫“唱A調”。1=C,就是說,這首歌曲的“導”要唱得同C一樣高,或者說“這歌曲唱C調”。同樣是“導”,不同的調唱起來的高低是不一樣的。各調的對應的標準頻率為: 單片機演奏音樂時音調和節拍的確定方法 經常看到一些剛學單片機的朋友對單片機演奏音樂比較有興趣,本人也曾是這樣。在此,本人將就這方面的知識做一些簡介,但愿能對單片機演奏音樂比較有興趣而又不知其解的朋友能有所啟迪。 一般說來,單片機演奏音樂基本都是單音頻率,它不包含相應幅度的諧波頻率,也就是說不能象電子琴那樣能奏出多種音色的聲音。因此單片機奏樂只需弄清楚兩個概念即可,也就是“音調”和“節拍”。音調表示一個音符唱多高的頻率,節拍表示一個音符唱多長的時間。 在音樂中所謂“音調”,其實就是我們常說的“音高”。在音樂中常把中央C上方的A音定為標準音高,其頻率f=440Hz。當兩個聲音信號的頻率相差一倍時,也即f2=2f1時,則稱f2比f1高一個倍頻程, 在音樂中1(do)與 ,2(來)與 ……正好相差一個倍頻程,在音樂學中稱它相差一個八度音。在一個八度音內,有12個半音。以1—i八音區為例, 12個半音是:1—#1、#1—2、2—#2、#2—3、3—4、4—#4,#4—5、5一#5、#5—6、6—#6、#6—7、7—i。這12個音階的分度基本上是以對數關系來劃分的。如果我們只要知道了這十二個音符的音高,也就是其基本音調的頻率,我們就可根據倍頻程的關系得到其他音符基本音調的頻率。 知道了一個音符的頻率后,怎樣讓單片機發出相應頻率的聲音呢?一般說來,常采用的方法就是通過單片機的定時器定時中斷,將單片機上對應蜂鳴器的I/O口來回取反,或者說來回清零,置位,從而讓蜂鳴器發出聲音,為了讓單片機發出不同頻率的聲音,我們只需將定時器予置不同的定時值就可實現。那么怎樣確定一個頻率所對應的定時器的定時值呢?以標準音高A為例:   A的頻率f = 440 Hz,其對應的周期為:T = 1/ f = 1/440 =2272μs 由上圖可知,單片機上對應蜂鳴器的I/O口來回取反的時間應為:t = T/2 = 2272/2 = 1136μs這個時間t也就是單片機上定時器應有的中斷觸發時間。一般情況下,單片機奏樂時,其定時器為工作方式1,它以振蕩器的十二分頻信號為計數脈沖。設振蕩器頻率為f0,則定時器的予置初值由下式來確定:    t = 12 *(TALL – THL)/ f0 式中TALL = 216 = 65536,THL為定時器待確定的計數初值。因此定時器的高低計數器的初值為:     TH = THL / 256 = ( TALL – t* f0/12) / 256    TL = THL % 256 = ( TALL – t* f0/12) %256  將t=1136μs代入上面兩式(注意:計算時應將時間和頻率的單位換算一致),即可求出標準音高A在單片機晶振頻率f0=12Mhz,定時器在工作方式1下的定時器高低計數器的予置初值為 :    TH440Hz = (65536 – 1136 * 12/12) /256 = FBH    TL440Hz = (65536 – 1136 * 12/12)%256 = 90H根據上面的求解方法,我們就可求出其他音調相應的計數器的予置初值。 音符的節拍我們可以舉例來說明。在一張樂譜中,我們經常會看到這樣的表達式,如1=C  、1=G …… 等等,這里1=C,1=G表示樂譜的曲調,和我們前面所談的音調有很大的關聯, 、 就是用來表示節拍的。以 為例加以說明,它表示樂譜中以四分音符為節拍,每一小結有三拍。比如:      其中1 、2 為一拍,3、4、5為一拍,6為一拍共三拍。1 、2的時長為四分音符的一半,即為八分音符長,3、4的時長為八分音符的一半,即為十六分音符長,5的時長為四分音符的一半,即為八分音符長,6的時長為四分音符長。那么一拍到底該唱多長呢?一般說來,如果樂曲沒有特殊說明,一拍的時長大約為400—500ms 。我們以一拍的時長為400ms為例,則當以四分音符為節拍時,四分音符的時長就為400ms,八分音符的時長就為200ms,十六分音符的時長就為100ms。可見,在單片機上控制一個音符唱多長可采用循環延時的方法來實現。首先,我們確定一個基本時長的延時程序,比如說以十六分音符的時長為基本延時時間,那么,對于一個音符,如果它為十六分音符,則只需調用一次延時程序,如果它為八分音符,則只需調用二次延時程序,如果它為四分音符,則只需調用四次延時程序,依次類推。通過上面關于一個音符音調和節拍的確定方法,我們就可以在單片機上實現演奏音樂了。具體的實現方法為:將樂譜中的每個音符的音調及節拍變換成相應的音調參數和節拍參數,將他們做成數據表格,存放在存儲器中,通過程序取出一個音符的相關參數,播放該音符,該音符唱完后,接著取出下一個音符的相關參數……,如此直到播放完畢最后一個音符,根據需要也可循環不停地播放整個樂曲。另外,對于樂曲中的休止符,一般將其音調參數設為FFH,FFH,其節拍參數與其他音符的節拍參數確定方法一致,樂曲結束用節拍參數為00H來表示。下面給出部分音符(三個八度音)的頻率以及以單片機晶振頻率f0=12Mhz,定時器在工作方式1下的定時器高低計數器的予置初值 : C調音符  頻率Hz 262 277 293 311 329 349 370 392 415 440 466 494TH/TL F88B F8F2 F95B F9B7 FA14 FA66 FAB9 FB03 FB4A FB8F FBCF FC0BC調音符 1 1# 2 2# 3 4 4# 5 5# 6 6# 7頻率Hz 523 553 586 621 658 697 739 783 830 879 931 987TH/TL FC43 FC78 FCAB FCDB FD08 FD33 FD5B FD81 FDA5 FDC7 FDE7 FE05C調音符  頻率Hz 1045 1106 1171 1241 1316 1393 1476 1563 1658 1755 1860 1971TH/TL FB21 FE3C FE55 FE6D FE84 FE99 FEAD FEC0 FE02 FEE3 FEF3 FF02

    標簽: 單片機 音調

    上傳時間: 2013-10-20

    上傳用戶:哈哈haha

  • Arduino學習筆記4_Arduino軟件模擬PWM

    注:1.這篇文章斷斷續續寫了很久,畫圖技術也不精,難免錯漏,大家湊合看.有問題可以留言.      2.論壇排版把我的代碼縮進全弄沒了,大家將代碼粘貼到arduino編譯器,然后按ctrl+T重新格式化代碼格式即可看的舒服. 一、什么是PWM PWM 即Pulse Wavelength Modulation 脈寬調制波,通過調整輸出信號占空比,從而達到改 變輸出平均電壓的目的。相信Arduino 的PWM 大家都不陌生,在Arduino Duemilanove 2009 中,有6 個8 位精度PWM 引腳,分別是3, 5, 6, 9, 10, 11 腳。我們可以使用analogWrite()控 制PWM 腳輸出頻率大概在500Hz 的左右的PWM 調制波。分辨率8 位即2 的8 次方等于 256 級精度。但是有時候我們會覺得6 個PWM 引腳不夠用。比如我們做一個10 路燈調光, 就需要有10 個PWM 腳。Arduino Duemilanove 2009 有13 個數字輸出腳,如果它們都可以 PWM 的話,就能滿足條件了。于是本文介紹用軟件模擬PWM。 二、Arduino 軟件模擬PWM Arduino PWM 調壓原理:PWM 有好幾種方法。而Arduino 因為電源和實現難度限制,一般 使用周期恒定,占空比變化的單極性PWM。 通過調整一個周期里面輸出腳高/低電平的時間比(即是占空比)去獲得給一個用電器不同 的平均功率。 如圖所示,假設PWM 波形周期1ms(即1kHz),分辨率1000 級。那么需要一個信號時間 精度1ms/1000=1us 的信號源,即1MHz。所以說,PWM 的實現難點在于需要使用很高頻的 信號源,才能獲得快速與高精度。下面先由一個簡單的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); } } } 這是一個軟件PWM 控制Arduino D13 引腳的例子。只需要一塊Arduino 即可測試此代碼。 程序解析:由for 循環可以看出,完成一個PWM 周期,共循環255 次。 假設bright=100 時候,在第0~100 次循環中,i 等于1 到99 均小于bright,于是輸出PWMPin 高電平; 然后第100 到255 次循環里面,i 等于100~255 大于bright,于是輸出PWMPin 低電平。無 論輸出高低電平都保持30us。 那么說,如果bright=100 的話,就有100 次循環是高電平,155 次循環是低電平。 如果忽略指令執行時間的話,這次的PWM 波形占空比為100/255,如果調整bright 的值, 就能改變接在D13 的LED 的亮度。 這里設置了每次for 循環之后,將bright 加一,并且當bright 加到255 時歸0。所以,我們 看到的最終效果就是LED 慢慢變亮,到頂之后然后突然暗回去重新變亮。 這是最基本的PWM 方法,也應該是大家想的比較多的想法。 然后介紹一個簡單一點的。思維風格完全不同。不過對于驅動一個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; } 可以看出,這段代碼少了一個For 循環。它先輸出一個高電平,然后維持(bright*30)us。然 后輸出一個低電平,維持時間((255-bright)*30)us。這樣兩次高低就能完成一個PWM 周期。 分辨率也是255。 三、多引腳PWM Arduino 本身已有PWM 引腳并且運行起來不占CPU 時間,所以軟件模擬一個引腳的PWM 完全沒有實用意義。我們軟件模擬的價值在于:他能將任意的數字IO 口變成PWM 引腳。 當一片Arduino 要同時控制多個PWM,并且沒有其他重任務的時候,就要用軟件PWM 了。 多引腳PWM 有一種下面的方式: int brights[14] = {0}; //定義14個引腳的初始亮度,可以隨意設置 int StartPWMPin = 0, EndPWMPin = 13; //設置D0~D13為PWM 引腳 int PWMResolution = 255; //設置PWM 占空比分辨率 void setup() { //定義所有IO 端輸出 for(int i = StartPWMPin; i <= EndPWMPin; i++) { pinMode(i, OUTPUT); //隨便定義個初始亮度,便于觀察 brights[ i ] = random(0, 255); } } void loop() { //這for 循環是為14盞燈做漸亮的。每次Arduino loop()循環, //brights 自增一次。直到brights=255時候,將brights 置零重新計數。 for(int i = StartPWMPin; i <= EndPWMPin; i++) { if((brights[i]++) == PWMResolution) brights[i] = 0; } for(int i = 0; i <= PWMResolution; i++) //i 是計數一個PWM 周期 { for(int j = StartPWMPin; j <= EndPWMPin; j++) //每個PWM 周期均遍歷所有引腳 { if(i < brights[j])\   所以我們要更改PWM 周期的話,我們將精度(代碼里面的變量:PWMResolution)降低就行,比如一般調整LED 亮度的話,我們用64 級精度就行。這樣速度就是2x32x64=4ms。就不會閃了。

    標簽: Arduino PWM 軟件模擬

    上傳時間: 2013-10-08

    上傳用戶:dingdingcandy

  • Arduino學習筆記4_Arduino軟件模擬PWM

    注:1.這篇文章斷斷續續寫了很久,畫圖技術也不精,難免錯漏,大家湊合看.有問題可以留言.      2.論壇排版把我的代碼縮進全弄沒了,大家將代碼粘貼到arduino編譯器,然后按ctrl+T重新格式化代碼格式即可看的舒服. 一、什么是PWM PWM 即Pulse Wavelength Modulation 脈寬調制波,通過調整輸出信號占空比,從而達到改 變輸出平均電壓的目的。相信Arduino 的PWM 大家都不陌生,在Arduino Duemilanove 2009 中,有6 個8 位精度PWM 引腳,分別是3, 5, 6, 9, 10, 11 腳。我們可以使用analogWrite()控 制PWM 腳輸出頻率大概在500Hz 的左右的PWM 調制波。分辨率8 位即2 的8 次方等于 256 級精度。但是有時候我們會覺得6 個PWM 引腳不夠用。比如我們做一個10 路燈調光, 就需要有10 個PWM 腳。Arduino Duemilanove 2009 有13 個數字輸出腳,如果它們都可以 PWM 的話,就能滿足條件了。于是本文介紹用軟件模擬PWM。 二、Arduino 軟件模擬PWM Arduino PWM 調壓原理:PWM 有好幾種方法。而Arduino 因為電源和實現難度限制,一般 使用周期恒定,占空比變化的單極性PWM。 通過調整一個周期里面輸出腳高/低電平的時間比(即是占空比)去獲得給一個用電器不同 的平均功率。 如圖所示,假設PWM 波形周期1ms(即1kHz),分辨率1000 級。那么需要一個信號時間 精度1ms/1000=1us 的信號源,即1MHz。所以說,PWM 的實現難點在于需要使用很高頻的 信號源,才能獲得快速與高精度。下面先由一個簡單的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); } } } 這是一個軟件PWM 控制Arduino D13 引腳的例子。只需要一塊Arduino 即可測試此代碼。 程序解析:由for 循環可以看出,完成一個PWM 周期,共循環255 次。 假設bright=100 時候,在第0~100 次循環中,i 等于1 到99 均小于bright,于是輸出PWMPin 高電平; 然后第100 到255 次循環里面,i 等于100~255 大于bright,于是輸出PWMPin 低電平。無 論輸出高低電平都保持30us。 那么說,如果bright=100 的話,就有100 次循環是高電平,155 次循環是低電平。 如果忽略指令執行時間的話,這次的PWM 波形占空比為100/255,如果調整bright 的值, 就能改變接在D13 的LED 的亮度。 這里設置了每次for 循環之后,將bright 加一,并且當bright 加到255 時歸0。所以,我們 看到的最終效果就是LED 慢慢變亮,到頂之后然后突然暗回去重新變亮。 這是最基本的PWM 方法,也應該是大家想的比較多的想法。 然后介紹一個簡單一點的。思維風格完全不同。不過對于驅動一個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; } 可以看出,這段代碼少了一個For 循環。它先輸出一個高電平,然后維持(bright*30)us。然 后輸出一個低電平,維持時間((255-bright)*30)us。這樣兩次高低就能完成一個PWM 周期。 分辨率也是255。 三、多引腳PWM Arduino 本身已有PWM 引腳并且運行起來不占CPU 時間,所以軟件模擬一個引腳的PWM 完全沒有實用意義。我們軟件模擬的價值在于:他能將任意的數字IO 口變成PWM 引腳。 當一片Arduino 要同時控制多個PWM,并且沒有其他重任務的時候,就要用軟件PWM 了。 多引腳PWM 有一種下面的方式: int brights[14] = {0}; //定義14個引腳的初始亮度,可以隨意設置 int StartPWMPin = 0, EndPWMPin = 13; //設置D0~D13為PWM 引腳 int PWMResolution = 255; //設置PWM 占空比分辨率 void setup() { //定義所有IO 端輸出 for(int i = StartPWMPin; i <= EndPWMPin; i++) { pinMode(i, OUTPUT); //隨便定義個初始亮度,便于觀察 brights[ i ] = random(0, 255); } } void loop() { //這for 循環是為14盞燈做漸亮的。每次Arduino loop()循環, //brights 自增一次。直到brights=255時候,將brights 置零重新計數。 for(int i = StartPWMPin; i <= EndPWMPin; i++) { if((brights[i]++) == PWMResolution) brights[i] = 0; } for(int i = 0; i <= PWMResolution; i++) //i 是計數一個PWM 周期 { for(int j = StartPWMPin; j <= EndPWMPin; j++) //每個PWM 周期均遍歷所有引腳 { if(i < brights[j])\   所以我們要更改PWM 周期的話,我們將精度(代碼里面的變量:PWMResolution)降低就行,比如一般調整LED 亮度的話,我們用64 級精度就行。這樣速度就是2x32x64=4ms。就不會閃了。

    標簽: Arduino PWM 軟件模擬

    上傳時間: 2013-10-23

    上傳用戶:mqien

  • 經典c程序100例==1--10 【程序1】 題目:有1、2、3、4個數字

    經典c程序100例==1--10 【程序1】 題目:有1、2、3、4個數字,能組成多少個互不相同且無重復數字的三位數?都是多少? 1.程序分析:可填在百位、十位、個位的數字都是1、2、3、4。組成所有的排列后再去       掉不滿足條件的排列。 2.程序源代碼: main() { int i,j,k printf("\n") for(i=1 i<5 i++)    /*以下為三重循環*/  for(j=1 j<5 j++)    for (k=1 k<5 k++)    {     if (i!=k&&i!=j&&j!=k)    /*確保i、j、k三位互不相同*/     printf("%d,%d,%d\n",i,j,k)    }

    標簽: 100 程序 10 數字

    上傳時間: 2014-01-07

    上傳用戶:lizhizheng88

  • 一、 設計目的及所需設備: 了解PC機串行口的使用;所需設備為:PC機

    一、 設計目的及所需設備: 了解PC機串行口的使用;所需設備為:PC機,RS232插座及連線; 二、串行口的有關硬件資料 1. 9芯RS-232C接口標準: (1) 引腳1:CD,載體檢測; (2) 引腳2:RXD,接收數據; (3) 引腳3:TXD,發送數據; (4) 引腳4:DTR,終端準備好; (5) 引腳5:信號地; (6) 引腳6:DSR,MODEM準備好; (7) 引腳7:RTS,請求發送; (8) 引腳8:CTS,清除發送; (9) 引腳9:RI,響鈴指示;

    標簽: 設備 PC機 串行口

    上傳時間: 2015-07-17

    上傳用戶:myworkpost

  • 能把一個帶空位置的二叉樹前序序列流轉換成一棵二叉樹,空位置用“@”表示,其中包含圖形界面(java實現)

    能把一個帶空位置的二叉樹前序序列流轉換成一棵二叉樹,空位置用“@”表示,其中包含圖形界面(java實現),可以幫助大家熟悉二叉樹的存儲結構,由前序序列流產生二叉樹;二叉樹的3種遍歷算法

    標簽: java 二叉樹 序列 圖形

    上傳時間: 2014-11-27

    上傳用戶:wpwpwlxwlx

  • 旅游管理相關 1.智能化的組團計調功能; 2.能直接將組團計劃數據導入業務登記表

    旅游管理相關 1.智能化的組團計調功能; 2.能直接將組團計劃數據導入業務登記表,極大的減少二次重復錄入數據; 3.通過簡單設置后可直接從業務登記表中打印旅游協議書; 4.對出已經出游的登記單只需一點便能將業務流程交接到下一流程; 5.十分方便的對地結社的業務結算功能,使您不必再去記憶結算數據; 6.自動化的經營情況匯總,使您對經營情況一目了然; 7.對每一種單據均能作到在保存后有權限的情況下進行二次修改,方便了數據錄入; 8.眾多旅游相關信息字典,既可查詢也可收集錄入; 9.批量將基礎數據從常用電子文檔導入軟件系統的功能; 10.將軟件系統里的數據導出到電子文檔的功能; 11.對所有單據查詢匯總的功能; 12.旅行社業務統計及報表功能; 13.嚴格的權限管理功能;

    標簽: 旅游 數據導入 智能化

    上傳時間: 2013-12-04

    上傳用戶:zhengzg

  • 牛頓法 本程序由Fortran 90語言編寫

    牛頓法 本程序由Fortran 90語言編寫,在Vistual Fortran 5下編譯通過!!!本程序適用于求解形如f(x)=1/2*x Ax+bx+c二次函數的穩定點;

    標簽: Fortran 牛頓 程序 語言

    上傳時間: 2014-01-02

    上傳用戶:1051290259

主站蜘蛛池模板: 黔西县| 华坪县| 郯城县| 吴川市| 灵台县| 鱼台县| 舟山市| 宁陵县| 三都| 环江| 泸水县| 恩平市| 浮山县| 临猗县| 云浮市| 通山县| 繁昌县| 芜湖市| 海城市| 靖江市| 开江县| 芮城县| 普格县| 闸北区| 洱源县| 临湘市| 高平市| 密云县| 从化市| 张家界市| 葵青区| 万州区| 高碑店市| 新郑市| 博爱县| 铜陵市| 闸北区| 康乐县| 宜都市| 浙江省| 应用必备|