單片機(jī)頻率計(jì)算,看似簡單,實(shí)際操作中卻常常暗藏玄機(jī)。我曾經(jīng)因?yàn)楹雎砸粋€(gè)小細(xì)節(jié),導(dǎo)致項(xiàng)目延誤了整整一天,至今記憶猶新。
最基本的頻率計(jì)算,建立在對(duì)單片機(jī)晶振頻率的了解之上。 假設(shè)你的單片機(jī)使用的是一個(gè)16MHz的晶振,那么單片機(jī)的系統(tǒng)時(shí)鐘頻率就是16MHz。 這看起來非常直觀,但實(shí)際情況可能更復(fù)雜。有些單片機(jī)內(nèi)部會(huì)進(jìn)行分頻,例如,一些MCU會(huì)將16MHz的晶振頻率除以2,得到8MHz的系統(tǒng)時(shí)鐘。 這時(shí)候,你如果直接使用16MHz進(jìn)行計(jì)算,結(jié)果就會(huì)大錯(cuò)特錯(cuò)。 所以,查閱單片機(jī)的datasheet至關(guān)重要,它會(huì)明確告訴你系統(tǒng)時(shí)鐘頻率是如何產(chǎn)生的,以及相關(guān)的分頻系數(shù)。
我遇到的那個(gè)問題,就出在這里。我當(dāng)時(shí)使用的單片機(jī),datasheet里明確說明了系統(tǒng)時(shí)鐘頻率是晶振頻率的一半。我一開始卻忽略了這一點(diǎn),直接用晶振頻率進(jìn)行計(jì)算,導(dǎo)致定時(shí)器中斷的頻率完全不對(duì),程序運(yùn)行結(jié)果自然也大相徑庭。調(diào)試了很久才發(fā)現(xiàn)問題所在,浪費(fèi)了不少時(shí)間。
除了系統(tǒng)時(shí)鐘頻率,還需要考慮定時(shí)器的預(yù)分頻系數(shù)。 許多單片機(jī)都帶有定時(shí)器,它們可以用來產(chǎn)生精確的時(shí)間間隔。定時(shí)器的頻率通常是系統(tǒng)時(shí)鐘頻率的幾分之一,這個(gè)比例由預(yù)分頻系數(shù)決定。 例如,如果系統(tǒng)時(shí)鐘頻率是8MHz,定時(shí)器預(yù)分頻系數(shù)是64,那么定時(shí)器的頻率就是8MHz / 64 = 125kHz。 這個(gè)預(yù)分頻系數(shù)同樣可以在datasheet中找到,千萬別漏看了。
另一個(gè)容易出錯(cuò)的地方是計(jì)數(shù)方式。定時(shí)器通常有不同的計(jì)數(shù)模式,例如計(jì)數(shù)到某個(gè)值后產(chǎn)生中斷,或者計(jì)數(shù)到溢出后產(chǎn)生中斷。不同的計(jì)數(shù)模式會(huì)影響最終的頻率計(jì)算。例如,一個(gè)16位的定時(shí)器,在計(jì)數(shù)到65536后溢出,如果預(yù)分頻系數(shù)是1,那么它的頻率就是系統(tǒng)時(shí)鐘頻率。但如果采用不同的計(jì)數(shù)模式,例如只計(jì)數(shù)到65535,那么頻率計(jì)算就需要相應(yīng)調(diào)整。
最后,我還想提醒大家,在實(shí)際編程中,要仔細(xì)檢查代碼中與頻率相關(guān)的參數(shù)設(shè)置,確保它們與計(jì)算結(jié)果一致。一個(gè)小小的數(shù)字錯(cuò)誤,都可能導(dǎo)致程序運(yùn)行出現(xiàn)偏差。 經(jīng)驗(yàn)告訴我,多寫注釋,多進(jìn)行代碼審查,能夠有效降低這類錯(cuò)誤的發(fā)生概率。 記住,細(xì)心和嚴(yán)謹(jǐn),是單片機(jī)編程成功的關(guān)鍵。
路由網(wǎng)(www.lu-you.com)您可以查閱其它相關(guān)文章!