當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式軟件
[導(dǎo)讀]單片機(jī)關(guān)鍵技術(shù)基礎(chǔ)詳解(五)

單片機(jī)被廣泛應(yīng)用于工業(yè)控制,家電,消費(fèi)電子,醫(yī)療電子,儀表測(cè)量等領(lǐng)域,為應(yīng)廣大初級(jí)電子工程師/單片機(jī)愛(ài)好者之需,電子發(fā)燒友網(wǎng)隆重策劃整合推出《單片機(jī)關(guān)鍵技術(shù)基礎(chǔ)詳解》系列技術(shù)文章,以后會(huì)陸續(xù)推出其他章節(jié),敬請(qǐng)廣大工程師朋友繼續(xù)關(guān)注和留意。應(yīng)廣大工程師網(wǎng)友對(duì)前面章節(jié)熱烈反響,電子發(fā)燒友網(wǎng)會(huì)再接再厲為各位工程師網(wǎng)友推出更多技術(shù)精品系列文章,以饗讀者。

  參閱相關(guān)系列章節(jié)

  單片機(jī)關(guān)鍵技術(shù)基礎(chǔ)詳解(一)

  單片機(jī)關(guān)鍵技術(shù)基礎(chǔ)詳解(二)

  單片機(jī)關(guān)鍵技術(shù)基礎(chǔ)詳解(三)

  單片機(jī)關(guān)鍵技術(shù)基礎(chǔ)詳解(四)
 

  一、單片機(jī)矩陣鍵盤(pán)原理與結(jié)構(gòu)

  矩陣式結(jié)構(gòu)的鍵盤(pán)識(shí)別要復(fù)雜一些,列線通過(guò)電阻接正電源,并將行線所接的單片機(jī)的I/O口作為輸出端,而列線所接的I/O口則作為輸入。這樣,當(dāng)按鍵沒(méi)有按下時(shí),所有的輸入端都是高電平,代表無(wú)鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會(huì)被拉低,這樣,通過(guò)讀入輸入線的狀態(tài)就可得知是否有鍵按下了。

  

  在矩陣式鍵盤(pán)中,每條水平線和垂直線在交叉處不直接連通,而是通過(guò)一個(gè)按鍵加以連接。這樣,一個(gè)端口(如P1口)就可以構(gòu)成4*4=16個(gè)按鍵,比之直接將端口線用于鍵盤(pán)多出了一倍,而且線數(shù)越多,區(qū)別越明顯,比如再多加一條線就可以構(gòu)成20鍵的鍵盤(pán),而直接用端口線則只能多出一鍵(9鍵)。由此可見(jiàn),在需要的鍵數(shù)比較多時(shí),采用矩陣法來(lái)做鍵盤(pán)是合理的。

  《1》確定矩陣式鍵盤(pán)上何鍵被按下介紹一種“行掃描法”。

  行掃描法 行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鍵識(shí)別方法,如上圖所示鍵盤(pán),介紹過(guò)程如下。

  1、判斷鍵盤(pán)中有無(wú)鍵按下 將全部行線Y0-Y3置低電平,然后檢測(cè)列線的狀態(tài)。只要有一列的電平為低,則表示鍵盤(pán)中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個(gè)按鍵之中。若所有列線均為高電平,則鍵盤(pán)中無(wú)鍵按下。

  2、判斷閉合鍵所在的位置 在確認(rèn)有鍵按下后,即可進(jìn)入確定具體閉合鍵的過(guò)程。其方法是:依次將行線置為低電平,即在置某根行線為低電平時(shí),其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測(cè)各列線的電平狀態(tài)。若某列為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。

  《2》確定矩陣式鍵盤(pán)上何鍵被按下介紹一種“高低電平翻轉(zhuǎn)法”。

  首先讓P1口高四位為1,低四位為0,。若有按鍵按下,則高四位中會(huì)有一個(gè)1翻轉(zhuǎn)為0,低四位不會(huì)變,此時(shí)即可確定被按下的鍵的行位置。

  然后讓P1口高四位為0,低四位為1,。若有按鍵按下,則低四位中會(huì)有一個(gè)1翻轉(zhuǎn)為0,高四位不會(huì)變,此時(shí)即可確定被按下的鍵的列位置。

  最后將上述兩者進(jìn)行或運(yùn)算即可確定被按下的鍵的位置。

  二、什么是格雷碼

  格雷碼(Gray code),又叫循環(huán)二進(jìn)制碼或反射二進(jìn)制碼 在數(shù)字系統(tǒng)中只能識(shí)別0和1,各種數(shù)據(jù)要轉(zhuǎn)換為二進(jìn)制代碼才能進(jìn)行處理,格雷碼是一種無(wú)權(quán)碼,采用絕對(duì)編碼方式,典型格雷碼是一種具有反射特性和循環(huán)特性的單步自補(bǔ)碼,它的循環(huán)、單步特性消除了隨機(jī)取數(shù)時(shí)出現(xiàn)重大誤差的可能,它的反射、自補(bǔ)特性使得求反非常方便。格雷碼屬于可靠性編碼,是一種錯(cuò)誤最小化的編碼方式

  簡(jiǎn)介

  因?yàn)?,自然二進(jìn)制碼可以直接由數(shù)/模轉(zhuǎn)換器轉(zhuǎn)換成模擬信號(hào),但某些情況,例如從十進(jìn)制的3轉(zhuǎn)換成4時(shí)二進(jìn)制碼的每一位都要變,使數(shù)字電路產(chǎn)生很大的尖峰電流脈沖。而格雷碼則沒(méi)有這一缺點(diǎn),它是一種數(shù)字排序系統(tǒng),其中的所有相鄰整數(shù)在它們的數(shù)字表示中只有一個(gè)數(shù)字不同。它在任意兩個(gè)相鄰的數(shù)之間轉(zhuǎn)換時(shí),只有一個(gè)數(shù)位發(fā)生變化。它大大地減少了由一個(gè)狀態(tài)到下一個(gè)狀態(tài)時(shí)邏輯的混淆。另外由于最大數(shù)與最小數(shù)之間也僅一個(gè)數(shù)不同,故通常又叫格雷反射碼或循環(huán)碼。

  2、格雷碼對(duì)照表

  

  下表為幾種自然二進(jìn)制碼與格雷碼的對(duì)照表:

  一般的,普通二進(jìn)制碼與格雷碼可以按以下方法互相轉(zhuǎn)換:

  二進(jìn)制碼-》格雷碼(編碼):從最右邊一位起,依次將每一位與左邊一位異或(XOR),作為對(duì)應(yīng)格雷碼該位的值,最左邊一位不變(相當(dāng)于左邊是0);

  格雷碼-〉二進(jìn)制碼(解碼):從左邊第二位起,將每位與左邊一位解碼后的值異或,作為該位解碼后的值(最左邊一位依然不變)。

  數(shù)學(xué)(計(jì)算機(jī))描述:

  原碼:p[n:0];格雷碼:c[n:0](n∈N);編碼:c=G(p);解碼:p=F(c);

  書(shū)寫(xiě)時(shí)按從左向右標(biāo)號(hào)依次減小,即MSB-》LSB,編解碼也按此順序進(jìn)行

  編碼:

  。..。..。..。..。..。...c[n]=p[n],

  。..。..。..。..。..。...c[i]=p[i] XOR p[i+1] (i∈N,n-1≥i≥0);

  解碼:

  。..。..。..。..。..。...p[n]=c[n],

  。..。..。..。..。..。...P[i]=c[i] XOR p[i+1] (i∈N, n-1≥i≥0)。

  Gray Code是由貝爾實(shí)驗(yàn)室的Frank Gray在20世紀(jì)40年代提出的(是1880年由法國(guó)工程師Jean-Maurice-Emlle

  Baudot發(fā)明的),用來(lái)在使用PCM(Pusle Code Modulation)方法傳送訊號(hào)時(shí)避免出錯(cuò),并于1953年3月17日取得美國(guó)專(zhuān)利。由定義可知,Gray Code的編碼方式不是唯一的,這里討論的是最常用的一種。

  用異或乘除法實(shí)現(xiàn)二進(jìn)制碼與格雷碼互相轉(zhuǎn)換

  如果在二進(jìn)制運(yùn)算中忽略進(jìn)位、退位,那么加減運(yùn)算都變成了異或(XOR)。

  用異或代替加減進(jìn)行二進(jìn)制豎式乘除,稱為異或乘除,它的特點(diǎn)是無(wú)進(jìn)退位。

  由于沒(méi)有退位,異或除法將變得更像多項(xiàng)式除法。

  如:10101除以11將變成1100余1,而不是111。

  二進(jìn)制轉(zhuǎn)格雷碼:

  只要異或乘以二分之三,即二進(jìn)制的1.1,然后忽略小數(shù)部分;也可以理解成異或乘以三(即11),再右移一位。

  格雷碼轉(zhuǎn)二進(jìn)制:

  異或乘以三分之二,即除以1.1,忽略余數(shù);或者左移一位,再異或除以三,忽略余數(shù)。

  格雷碼轉(zhuǎn)二進(jìn)制方法

  二進(jìn)位碼第n位 = 二進(jìn)位碼第(n+1)位+格雷碼第n位。因?yàn)槎M(jìn)位碼和格雷碼皆有相同位數(shù),所以二進(jìn)位碼可從最高位的左邊位元取0,以進(jìn)行計(jì)算。(注:遇到1+1時(shí)結(jié)果視為0)

  例如: 格雷碼0111,為4位數(shù),所以其所轉(zhuǎn)為之二進(jìn)位碼也必為4位數(shù),因此可取轉(zhuǎn)成之二進(jìn)位碼第五位為0,即0 b3 b2 b1 b0。

  0+0=0,所以b3=0

  0+1=1,所以b2=1

  1+1取0,所以b1=0

  0+1取1,所以b0=1

  因此所轉(zhuǎn)換為之二進(jìn)位碼為0101

  格雷碼轉(zhuǎn)換快速方法

 ?。僭O(shè)以二進(jìn)制為0的值做為格雷碼的0)

  G:格雷碼 B:二進(jìn)位碼

  G(N) = B(n+1) XOR B(n)

  

  

  
三、AVR單片機(jī)開(kāi)發(fā)經(jīng)驗(yàn)

  AVR與傳統(tǒng)類(lèi)型的單片機(jī)相比,除了必須能實(shí)現(xiàn)原來(lái)的一些基本的功能,其在結(jié)構(gòu)體系、功能部件、性能和可靠性等多方面有很大的提高和改善。

  但使用更好的器件只是為設(shè)計(jì)實(shí)現(xiàn)一個(gè)好的系統(tǒng)創(chuàng)造了一個(gè)好的基礎(chǔ)和可能性,如果還采用和沿襲以前傳統(tǒng)的硬件和軟件設(shè)計(jì)思想和方法的話,是不能用好AVR的,甚至也不能真正的了解AVR的特點(diǎn)和長(zhǎng)處。

  功能越好的器件,需要具備更高技術(shù)和能力的人來(lái)使用和駕馭它。就象一部好的F1賽車(chē),只有具備高超技術(shù)的駕駛員才能充分體會(huì)到車(chē)的特點(diǎn),并能最大限度的發(fā)揮出車(chē)的性能。

  AVR具有上手入門(mén)快,開(kāi)發(fā)方便簡(jiǎn)單的特點(diǎn),但要充分體會(huì)和發(fā)揮AVR的優(yōu)點(diǎn),還需要應(yīng)用工程師本身的硬軟件設(shè)計(jì)開(kāi)發(fā)能力的不斷學(xué)習(xí)、實(shí)踐提高。

  “外行看熱鬧,內(nèi)行看門(mén)道”,對(duì)于有一定基礎(chǔ)的嵌入式和單片機(jī)系統(tǒng)設(shè)計(jì)開(kāi)發(fā)的工程師,不妨先簡(jiǎn)單嘗試一下AVR。

  開(kāi)發(fā)環(huán)境與工具:PC+下載線+實(shí)際的系統(tǒng)板

PC上的開(kāi)發(fā)軟件:

  AVR Studio(Free)匯編+匯編調(diào)試+高級(jí)語(yǔ)言調(diào)試+軟件仿真

  ICC、CVAVR、BASCOM-AVR 高級(jí)語(yǔ)言程序開(kāi)發(fā)+程序下載。其中一個(gè)購(gòu)買(mǎi)正版全功能,作為主要的開(kāi)發(fā)環(huán)境,其它使用DEMO版,作為輔助及參考。

  AVR ISP下載線:

  STK200 And STK200+ And STK300 ISP Programmer。通過(guò)PC的打印機(jī)口,采用ISP技術(shù)將系統(tǒng)運(yùn)行代碼(HEX、BIN)和數(shù)據(jù)寫(xiě)入AVR芯片的Flash和EEProm中,編程AVR的配置熔絲位和加密位。支持決大多數(shù)的AVR芯片、以及ATMEL的51兼容芯片89S8252、89S52等。在ICC、CVAVR、BASCOM-AVR、BASCOM-8051中都內(nèi)含對(duì)該下載線的支持程序。免費(fèi)專(zhuān)用的下載程序:SLISP、PonyProg2000等。

  盡量不使用仿真器的建議:

  在開(kāi)發(fā)和調(diào)試系統(tǒng)程序時(shí),有許多人完全依賴于仿真器,一旦離開(kāi)了仿真器時(shí)就感覺(jué)無(wú)從下手。其實(shí),由于AVR的Flash存貯器可方便的使用ISP技術(shù)在線的多次擦寫(xiě),因此建議盡量不使用(依賴)仿真器來(lái)開(kāi)發(fā)和調(diào)試程序。

  在實(shí)際開(kāi)發(fā)過(guò)程中,程序的調(diào)試可以從下幾方面入手:

  現(xiàn)在的高級(jí)語(yǔ)言編譯器(如C編譯器)可以產(chǎn)生效率很高的機(jī)器代碼,因此建議大家盡量使用高級(jí)語(yǔ)言編寫(xiě)系統(tǒng)程序。

  使用Atmel公司提供AVR Studio軟件模擬仿真環(huán)境,以及其他的軟件模擬仿真環(huán)境(BASCOM-AVR)。

  盡可能使用高級(jí)語(yǔ)言編寫(xiě)系統(tǒng)程序。

  利用目標(biāo)板上的LED、LCD或異步串口。見(jiàn)附件“沒(méi)有仿真器的情況下如何開(kāi)發(fā)AVR”的介紹。

  提高硬件設(shè)計(jì)的合理性:

  盡量合理和充分使用AVR片內(nèi)的資源,如EEPROM、A/D、內(nèi)部的RC振蕩源。

  盡量采用串口通信連接的外圍器件,大容量的存儲(chǔ)器、LCD控制器、打印機(jī)、不用8279(LED數(shù)碼管+鍵盤(pán))而使用7279等。除了必須外擴(kuò)RAM(如語(yǔ)音和圖象),一般不提倡使用并行擴(kuò)展(573+譯碼電路),減小硬件和連線以及PCB板上錯(cuò)誤的出現(xiàn)概率,同時(shí)也提高了系統(tǒng)的可靠性。并行擴(kuò)展向串行擴(kuò)展是發(fā)展趨勢(shì)?,F(xiàn)在有大量的新的外圍器件采用高速的串行接口,如A/D、D/A、RTC、存儲(chǔ)器等。

  盡量使用以及在目標(biāo)板上預(yù)留ISP程序下載接口,或使用IAP技術(shù)。

  優(yōu)點(diǎn):ISP接口與I/O的兼容性比JETAG好。

  缺點(diǎn):不能在線調(diào)試

  注意和掌握AVR配置熔絲位的使用:

  。 系統(tǒng)晶振的選擇

  .BOD的使用

  。啟動(dòng)延時(shí).Mega8的PC6引腳,RESET與通用I/O的轉(zhuǎn)換

  .JETAG接口和通用I/O的轉(zhuǎn)換

  。啟動(dòng)向量的轉(zhuǎn)換,BOOT-LOAT區(qū)大小的設(shè)置

  提高硬件可靠性的考慮:

  。盡量采用片內(nèi)晶體、采用低頻率的系統(tǒng)時(shí)鐘、振蕩電路的輸出小幅度。

  。選擇合適的啟動(dòng)延時(shí)參數(shù)

  。使用BOD、片內(nèi)的看門(mén)狗

  。合理休眠方式的使用

  。不用I/O口設(shè)定輸出低電平

  。利用內(nèi)部的EEProm和寄存器MCUCSR判斷復(fù)位標(biāo)志,進(jìn)行不同的處理

  提高軟件設(shè)計(jì)的能力和水平:

  盡量合理采用高級(jí)語(yǔ)言設(shè)計(jì)編寫(xiě)系統(tǒng)程序。有許多人認(rèn)為使用匯編寫(xiě)程序比較精簡(jiǎn),而用高級(jí)語(yǔ)言開(kāi)發(fā)會(huì)浪費(fèi)很多程序空間,其實(shí)這是一種誤解。對(duì)一個(gè)有經(jīng)驗(yàn)的,而且非常熟悉某種單片機(jī)的匯編高手而言,他是能寫(xiě)出比高級(jí)語(yǔ)言更精簡(jiǎn)的代碼。而對(duì)匯編不是很熟的開(kāi)發(fā)者、或突然更換了一種新的單片機(jī),您能保證一定可以寫(xiě)出比高級(jí)語(yǔ)言更簡(jiǎn)練的代碼嗎?

  高級(jí)語(yǔ)言的優(yōu)越性是匯編語(yǔ)言不能比的:

  。程序移植方便

  。程序的堅(jiān)固性

  。數(shù)學(xué)運(yùn)算的支持

  。條理清晰的結(jié)構(gòu)化編程,程序的可維護(hù)性。

  ??蓞f(xié)同開(kāi)發(fā)軟件,開(kāi)發(fā)周期短。

  現(xiàn)在的高級(jí)語(yǔ)言編譯器(如C編譯器)已可以產(chǎn)生代碼效率很高的機(jī)器代碼,因此建議大家能用高級(jí)語(yǔ)言實(shí)現(xiàn)的程序盡可能使用高級(jí)語(yǔ)言寫(xiě),在對(duì)速度和時(shí)序要求特嚴(yán)的場(chǎng)合可以采用混合編程的方法來(lái)解決。

  更深入和全面的掌握各種串行通信協(xié)議的規(guī)程:

  嵌入式系統(tǒng)目前以大量的使用串行接口外圍芯片和各種通信接口,如RS232、兩線(I2C)、三線(SPI)、單總線、USB、CAN、TCP/IP等。開(kāi)發(fā)人員和程序員應(yīng)了解低層協(xié)議,熟悉硬件怎樣和如何實(shí)現(xiàn)低層協(xié)議,如何定義可靠的上層應(yīng)用協(xié)議,以及低層協(xié)議驅(qū)動(dòng)同上層應(yīng)用協(xié)議之間的接口設(shè)計(jì)(中間層軟件的實(shí)現(xiàn))等。

  硬件工程師的軟件編寫(xiě)能力要提高,采用標(biāo)準(zhǔn)程序編寫(xiě)方式、完善的軟件整體框架的設(shè)計(jì)、良好的數(shù)據(jù)結(jié)構(gòu)和程序結(jié)構(gòu)系統(tǒng)。(計(jì)算機(jī)軟件專(zhuān)業(yè)的程序設(shè)計(jì)員對(duì)硬件不熟悉、大部分是在操作系統(tǒng)支持下編寫(xiě)軟件,對(duì)低層接口和協(xié)議的驅(qū)動(dòng)層以及接口也不了解,往往也編寫(xiě)不出好的單片機(jī)系統(tǒng)程序。)

  通信接口的編寫(xiě)應(yīng)盡量

  。采用中斷+緩沖區(qū),

  。分層+結(jié)構(gòu)化設(shè)計(jì),

  。盡量不使用輪循方式(降低AVR的效率)。參見(jiàn)URAT(RS232)驅(qū)動(dòng)+中間層軟件示例。[!--empirenews.page--]

  采用好的系統(tǒng)設(shè)計(jì)模式:

  盡量不使用傳統(tǒng)的前后臺(tái)(中斷)系統(tǒng)設(shè)計(jì)模式,任務(wù)之間相互影響和干擾,無(wú)法定時(shí)操作。如設(shè)計(jì)一個(gè)采用動(dòng)態(tài)掃描方式驅(qū)動(dòng)的8位LED數(shù)碼管顯示+動(dòng)態(tài)掃描的4*4矩陣鍵盤(pán)。

  采用TimeTip+狀態(tài)機(jī)設(shè)計(jì)+CASE結(jié)構(gòu),實(shí)現(xiàn)多任務(wù)并行運(yùn)行系統(tǒng)設(shè)計(jì)方法?;驎r(shí)間觸發(fā)式的系統(tǒng)設(shè)計(jì)。(見(jiàn):《時(shí)間觸發(fā)嵌入式系統(tǒng)設(shè)計(jì)模式》中國(guó)電力出版社 2004.6)

  移植小型嵌入式操作系統(tǒng),如UCOS-II。在網(wǎng)上有些免費(fèi)的基于AVR的簡(jiǎn)潔的操作系統(tǒng)。

  提高C語(yǔ)言的編程能力和軟件應(yīng)用水平:

  熟悉和用好C中的數(shù)據(jù)結(jié)構(gòu)體、指針應(yīng)用、內(nèi)存管理等較高級(jí)的應(yīng)用。

  熟悉和了解你所使用的高級(jí)語(yǔ)言開(kāi)發(fā)平臺(tái)的特點(diǎn)。這些平臺(tái)是針對(duì)某一類(lèi)處理器的,包含許多特殊的不兼容的語(yǔ)句和擴(kuò)展的結(jié)構(gòu)、語(yǔ)句、函數(shù)等。盡管使用方便,但由于其不透明性和時(shí)間的不確定性,因此要合理使用。如C中的Getchar()、Putchar()等。AVR有多個(gè)開(kāi)發(fā)平臺(tái),每個(gè)都有其特點(diǎn)和不足。能夠綜合使用這些平臺(tái),相互互補(bǔ),能夠提高開(kāi)發(fā)效率。如通過(guò)ICC、CVAVR的程序生成器CodeWizard學(xué)習(xí)和了解AVR的硬件設(shè)置,簡(jiǎn)化計(jì)算,快速的生成程序基本模塊,如“一個(gè)URAT(RS232)低層驅(qū)動(dòng)+中間層軟件示例”。

  四、AVR單片機(jī)定時(shí)器輸出PWM的設(shè)計(jì)及注意問(wèn)題

  一、定時(shí)/計(jì)數(shù)器PWM設(shè)計(jì)要點(diǎn)

  根據(jù)PWM的特點(diǎn),在使用ATmega128的定時(shí)/計(jì)數(shù)器設(shè)計(jì)輸出PWM時(shí)應(yīng)注意以下幾點(diǎn):

  1.首先應(yīng)根據(jù)實(shí)際的情況,確定需要輸出的PWM頻率范圍,這個(gè)頻率與控制的對(duì)象有關(guān)。如輸出PWM波用于控制燈的亮度,由于人眼不能分辨42Hz以上的頻率,所以PWM的頻率應(yīng)高于42Hz,否則人眼會(huì)察覺(jué)到燈的閃爍。

  2.然后根據(jù)需要PWM的頻率范圍確定ATmega128定時(shí)/計(jì)數(shù)器的PWM工作方式。AVR定時(shí)/計(jì)數(shù)器的PWM模式可以分成快速PWM和頻率(相位)調(diào)整PWM兩大類(lèi)。

  3.快速PWM可以的到比較高頻率的PWM輸出,但占空比的調(diào)節(jié)精度稍微差一些。此時(shí)計(jì)數(shù)器僅工作在單程正向計(jì)數(shù)方式,計(jì)數(shù)器的上限值決定PWM的頻率,而比較匹配寄存器的值決定了占空比的大小。PWM頻率的計(jì)算公式為:

  PWM頻率 = 系統(tǒng)時(shí)鐘頻率/(分頻系數(shù)*(1+計(jì)數(shù)器上限值))

  4.快速PWM模式適合要求輸出PWM頻率較高,但頻率固定,占空比調(diào)節(jié)精度要求不高的應(yīng)用。

  5.頻率(相位)調(diào)整PWM模式的占空比調(diào)節(jié)精度高,但輸出頻率比較低,因?yàn)榇藭r(shí)計(jì)數(shù)器僅工作在雙向計(jì)數(shù)方式。同樣計(jì)數(shù)器的上限值決定了PWM的頻率,比較匹配寄存器的值決定了占空比的大小。PWM頻率的計(jì)算公式為:

  PWM頻率 = 系統(tǒng)時(shí)鐘頻率/(分頻系數(shù)*2*計(jì)數(shù)器上限值))

  6.相位調(diào)整PWM模式適合要求輸出PWM頻率較低,但頻率固定,占空比調(diào)節(jié)精度要求高的應(yīng)用。當(dāng)調(diào)整占空比時(shí),PWM的相位也相應(yīng)的跟著變化(Phase Correct)。

  7.頻率和相位調(diào)整PWM模式適合要求輸出PWM頻率較低,輸出頻率需要變化,占空比調(diào)節(jié)精度要求高的應(yīng)用。此時(shí)應(yīng)注意:不僅調(diào)整占空比時(shí),PWM的相位會(huì)相應(yīng)的跟著變化;而一但改變計(jì)數(shù)器上限值,即改變PWM的輸出頻率時(shí),會(huì)使PWM的占空比和相位都相應(yīng)的跟著變化(Phase And Frequency Correct)。

  8.在PWM方式中,計(jì)數(shù)器的上限值有固定的0xFF(8位T/C);0xFF、0x1FF、0x3FF(16位T/C)?;蛴捎脩粼O(shè)定的0x0000-0xFFFF,設(shè)定值在16位T/C的ICP或OCRA寄存器中。而比較匹配寄存器的值與計(jì)數(shù)器上限值之比即為占空比。
二、 PWM應(yīng)用參考設(shè)計(jì)

  下面給出一個(gè)設(shè)計(jì)示例,在示例中使用PWM方式來(lái)產(chǎn)生一個(gè)1KHz左右的正弦波,幅度為0-Vcc/2。

  首先按照下面的公式建立一個(gè)正弦波樣本表,樣本表將一個(gè)正弦波周期分為128個(gè)點(diǎn),每點(diǎn)按7位量化(127對(duì)應(yīng)最高幅值Vcc/2):

  F(X) = 64 + 63 * Sin(2πx/180) X∈[0…127]

  如果在一個(gè)正弦波周期中采用128個(gè)樣點(diǎn),那么對(duì)應(yīng)1KHz的正弦波PWM的頻率為128KHz。實(shí)際上,按照采樣頻率至少為信號(hào)頻率的2倍的取樣定理來(lái)計(jì)算,PWM的頻率的理論值為2KHz即可??紤]盡量提高PWM的輸出精度,實(shí)際設(shè)計(jì)使用PWM的頻率為16KHz,即一個(gè)正弦波周期(1KHz)中輸出16個(gè)正弦波樣本值。這意味著在128點(diǎn)的正弦波樣本表中,每隔8點(diǎn)取出一點(diǎn)作為PWM的輸出。

  程序中使用ATmega128的8位T/C0,工作模式為相位調(diào)整PWM模式輸出,系統(tǒng)時(shí)鐘為8MHz,分頻系數(shù)為1,其可以產(chǎn)生最高PWM頻率為: 8000000Hz / 510 = 15686Hz。每16次輸出構(gòu)成一個(gè)周期正弦波,正弦波的頻率為980.4Hz。PWM由OC0(PB4)引腳輸出。參考程序如下(ICCAVR)。

  //ICC-AVR Application Builder : 2004-08

  // Target : M128

  // Crystal: 8.0000Mhz

  #Include

  #Include

  #Pragma Data:code

  // 128點(diǎn)正弦波樣本表

  Const Unsigned Char Auc_SinParam[128] = {

  64,67,70,73,76,79,82,85,88,91,94,96,99,102,104,106,109,111,113,115,117,118,120,121,

  123,124,125,126,126,127,127,127,127,127,127,127,126,126,125,124,123,121,120,118,

  117,115,113,111,109,106,104,102,99,96,94,91,88,85,82,79,76,73,70,67,64,60,57,54,51,48,

  45,42,39,36,33,31,28,25,23,21,18,16,14,12,10,9,7,6,4,3,2,1,1,0,0,0,0,0,0,0,1,1,2,3,4,6,

  7,9,10,12,14,16,18,21,23,25,28,31,33,36,39,42,45,48,51,54,57,60};

  #Pragma Data:data

  Unsigned Char X_SW = 8,X_LUT = 0;

  #Pragma Interrupt_handler Timer0_ovf_isr:17

  Void Timer0_ovf_isr(Void)

  {

  X_LUT += X_SW; // 新樣點(diǎn)指針

  If (X_LUT 》 127) X_LUT -= 128; // 樣點(diǎn)指針調(diào)整

  OCR0 = Auc_SinParam[X_LUT]; // 取樣點(diǎn)指針到比較匹配寄存器

  }

  Void Main(Void)

  {

  DDRB |= 0x10; // PB4(OC0)輸出

  TCCR0 = 0x71; // 相位調(diào)整PWM模式,分頻系數(shù)=1,正向控制OC0

  TIMSK = 0x01; // T/C0溢出中斷允許

  SEI(); // 使能全局中斷

  While(1)

  {……};

  }

  每次計(jì)數(shù)器溢出中斷的服務(wù)中取出一個(gè)正弦波的樣點(diǎn)值到比較匹配寄存器中,用于調(diào)整下一個(gè)PWM的脈沖寬度,這樣在PB4引腳上輸出了按正弦波調(diào)制的PWM方波。當(dāng)PB4的輸出通過(guò)一個(gè)低通濾波器后,便得到一個(gè)980.4Hz的正弦波了。如要得到更精確的1KHz的正弦波,可使用定時(shí)/計(jì)數(shù)器T/C1,選擇工作模式10,設(shè)置ICR1=250為計(jì)數(shù)器的上限值。
 五、C51單片機(jī)矩陣鍵盤(pán)掃描去抖程序

  這段有1個(gè)C51的項(xiàng)目,用的是新華龍的C51 F020單片機(jī)。項(xiàng)目中要使成為事實(shí)4*5的矩陣鍵盤(pán)。矩陣電路圖如次如示

  

  此中,四條列線接在 F020的P2~P5口線上,5條行線接在P5口線上(F020的P5口是差別于平凡C51的擴(kuò)大接口,不克不及位尋址)。同時(shí)4條列線接在一四輸入與非門(mén)(74LS20)上,門(mén)輸出接F020的外間斷1,如許,不論什么一鍵按下,都會(huì)孕育發(fā)生間斷,報(bào)信程序舉行鍵盤(pán)電子掃描。

  托1個(gè)新手給寫(xiě)了鍵盤(pán)的電子掃描程序,基本功效都能使成為事實(shí),但對(duì)鍵盤(pán)的去抖措置懲罰老是做欠好,體現(xiàn)是或不克不及去抖,或按鈕相應(yīng)太卡,或采集到紕繆鍵值??磥?lái)新手對(duì)矩陣鍵盤(pán)電子掃描原理掌握較好(網(wǎng)上資料多),但對(duì)鍵盤(pán)去抖的知識(shí)卻有所欠缺,基本都是按照書(shū)上說(shuō)的延時(shí)一段時(shí)間再采集鍵值,現(xiàn)實(shí)應(yīng)用中,如許的措置懲罰是遠(yuǎn)遠(yuǎn)不敷的,過(guò)于簡(jiǎn)單。現(xiàn)實(shí)去抖措置懲罰應(yīng)該如許舉行更合理一些,即連續(xù)采集鍵值,當(dāng)采集到的鍵值在一段時(shí)間內(nèi)是不異的,即以為按鈕狀況已經(jīng)穩(wěn)定,此鍵值為真實(shí)鍵值。別的,按鈕開(kāi)釋時(shí),也會(huì)有抖動(dòng),導(dǎo)致誤采鍵值,是以在鍵開(kāi)釋時(shí),也應(yīng)舉行去抖措置懲罰,措置懲罰要領(lǐng)同時(shí)是連續(xù)一段時(shí)間采集到無(wú)鍵按下?tīng)顩r,才以為按鈕被開(kāi)釋。按照這個(gè)要領(lǐng),我重寫(xiě)了新手的程序,現(xiàn)實(shí)應(yīng)用中體現(xiàn)極好。[!--empirenews.page--]

  現(xiàn)將程序發(fā)布如次,供新手參考。

  Key.h文件內(nèi)容

  #ifndef __key_H__

  #define __key_H__

  #define 滅茬_KEY 0x0000

  #define S1 0x3801

  #define S2 0x3401

  #define S3 0x3802

  #define S4 0x3402

  #define S5 0x3804

  #define S6 0x3404

  #define S7 0x3808

  #define S8 0x3408

  #define S9 0x3810

  #define S10 0x3410

  #define S11 0x2C01

  #define S12 0x1C01

  #define S13 0x2C02

  #define S14 0x1C02

  #define S15 0x2C04

  #define S16 0x1C04

  #define S17 0x2C08

  #define S18 0x1C08

  #define S19 0x2C10

  #define S20 0x1C10

  #define KEY_DELAY 20

  extern unsigned int Key_Value;

  extern void Init_Key();

  extern void Scan_Key();

  extern bit Key_Pressed;

  extern bit Key_Released;

  extern unsigned int idata Keypress_Count;

  extern unsigned int idata Keyrelease_Count;

  #endif

  key.c 文件內(nèi)容

  #include

  #include “key.h”

  bit Key_Down; //是不是有鍵按下的標(biāo)記

  unsigned int idata Keypress_Count;

  sbit Col_Key0 = P2^2;

  sbit Col_Key1 = P2^3;

  sbit Col_Key2 = P2^4;

  sbit Col_Key3 = P2^5;

  bit Key_Pressed;

  bit Key_Released;

  unsigned int Key_Value; bit Key_Down; //是不是有鍵按下的標(biāo)記

  unsigned int idata Keypress_Count; //一毫秒增加一次的變量

  unsigned int idata Keyrelease_Count; //一毫秒增加一次的變量

  //矩陣鍵盤(pán)施用間斷1作為鍵盤(pán)間斷

  void Init_Key()

  {

  P5 = 0; //行線全數(shù)置為0

  EX1 = 1; // 允許外部鐘表秒間斷

  IT1 = 1; // 外部鐘表間斷配備布置為邊緣觸發(fā)

  }

  void Key_Int() interrupt 2

  {

  Key_Pressed = 1;

  EX1 = 0;

  }

  void Scan_Key()

  {

  unsigned char temp,rowvalue;

  unsigned int key;

  int i;

  temp = P2;

  temp &= 0x3C;

  if(temp == 0x3C)

  {

  Key_Released = 0;

  Key_Pressed = 0;

  key = 滅茬_KEY;

  EX1 = 1;

  }

  else

  {

  key = temp;

  key = key《《8;

  rowvalue = 0x01;

  for(i=0;i《5;i )

  {

  P5 = rowvalue《

  DelayMs⑴;

  temp = P2;

  temp &= 0x3C;

  if(temp == 0x3c)

  {

  rowvalue = rowvalue《

  key = key | rowvalue;

  P5 = 0x00;

  break;

  }

  }

  P5 = 0x00;

  DelayMs⑴;

  }

  if(key!=滅茬_KEY) //如果有鍵按下

  { if(key==Key_Value) //如果按下的是不異的鍵

  {

  if(Keypress_Count》=KEY_DELAY)

  {

  Key_Down = 1;

  }

  }

  else if(Key_Down != 1)

  {

  Keypress_Count=0;

  Keyrelease_Count = 0;

  Key_Value=key;

  }

  }

  else //如果無(wú)鍵按下

  {

  if(Key_Down) //如果時(shí)下是鍵開(kāi)釋?zhuān)祷劓I值

  {

  if(Keyrelease_Count 》= KEY_DELAY)

  {

  Key_Down=0;

  Keypress_Count=0;

  Keyrelease_Count=0;

  Key_Released = 1;

  EX1 = 1;

  return;

  }

  }

  else

  {

  Keypress_Count=0;

  Keyrelease_Count=0;

  Key_Value = 滅茬_KEY;

  EX1 = 1;

  return;

  }

  }

  }

  在main.c中的挪用要領(lǐng)為

  if(Key_Pressed == 1)

  {

  //Key_Pressed = 0;

  Scan_Key();

  }

  if(Key_Released == 1)

  {

  Key_Released = 0;

  Ack_Key();

  }

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車(chē)的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車(chē)技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車(chē)工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車(chē)。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車(chē) 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉