關於PIC微控制器的定時器精準計時的計算

2021-05-24 03:21:40 字數 1117 閱讀 5185

關於pic微控制器的定時器精準計時的計算

在此用了16c711微控制器的tmr0做定時中斷,希望實現精準計時,在程式中,tmr0用了晶振的32分頻,初值#0fch,因此popbear兄弟計算出每個定時中斷的計時時間為(256-x)*32*4/32768=0.015625秒。注意,問題就在這裡!實際上這個時間是tmr0的初值被置入後兩個指令週期後(見pic微控制器定時器/計數器資料)到下一次中斷發生時的時間。如果要用到定時器的精準定時,必須理解這一概念!

如採用32768hz的晶振,每個指令週期為122us,在中斷處理程式中,到tmr0的初值被置入,共有7條指令,加上tmr0的初值被置入後兩個指令週期,如果中斷處理程式不直接放在0004h位址而採用goto指令的兩個週期,一共為11個指令週期。也就是說,每個定時中斷發生的間隔為0.015625秒+11*122us。程式中64次中斷為1秒,那麼1秒誤差為64*11*122us=85.9375ms,1分鐘的誤差為5.156s。

那麼怎樣得到精準計時呢?這就要在對定時器的初值賦值上和中斷處理程式中做文章。

關於如何產生乙個大致比較精準的時間中斷 

使用tmr0

的時候,如果僅

tmr0

乙個中斷,顯然,使用 

tmr0=tmr0+offset

的方式就能夠產生乙個比較精準的時間中斷。特別是不用考慮從中斷到

tmr0

的賦值中間間隔了多少時間的延時。

但是使用tmr1

時,就產生了問題,因為

tmr1是16

位的,所以

tmr1l=tmr1l+offset_l

時,就得考慮

tmr1h

得進製問題。

使用c內欠套彙編如下(如用賦值而不是增量方式,

c中就得中斷到賦值得時間了),且

tmr1_revalue_h

得值不會為

0xff

。方法兩種

1)利用

ccp模組在

compare

模式下特殊事件觸發功能實現精確的

tmr1

定時中斷

2)普通模式下在重灌定時初值前

tmr1

暫停計數,設定完畢後再開啟。注意補償中間置初值的延時時間 

微控制器定時器雙擊 關於51微控制器定時器的靈活使用

前段時間,做乙個專案,有串列埠收發指令判斷,按鍵型別判斷,長短按之類,power的定時關電,事件的輪詢掃瞄更新和display的定時掃瞄。這些要求就對定時器提出了要求,但是我的51微控制器只有兩個定時器,其中乙個又有debug口的波特率產生之用。於是乎我可以用的定時器就只剩下了乙個。怎麼辦?可能大家...

PIC微控制器之定時器(TMR1)

之前我們講解了tmr0定時器,現在我們來講解16位定時器tmr1,tmr1和tmr0最大的差別就是tmr1是16位定時器。所以tmr1兩個八位暫存器 tmrh 和trmrl組成.許多有關定時器的基礎知識我就不在贅述了可以看tmr0的文章。我單刀直入講例項了。例項講解 如果我們想隔0.5s輸出個高電平...

微控制器的定時器

定時器則是由微控制器自身提供的乙個非常穩定的計數器,這個穩定的計數器就是微控制器上連線的晶振部件,晶振經過12分頻之後提供給微控制器的只有1mhz的穩定脈衝 晶振的頻率是非常準確的,所以微控制器的計數脈衝之間的時間間隔也是非常準確的,這個準確的時間間隔是1微秒 12mhz晶振內部的工作頻率 時鐘脈衝...