關於PIC單片機的定時器精準計時的計算

關於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時,就產生了問題,因爲TMR116位的,所以TMR1L=TMR1L+OFFSET_L時,就得考慮TMR1H得進位問題。

 

使用C內欠套匯編如下(如用賦值而不是增量方式,C中就得中斷到賦值得時間了),且TMR1_Revalue_H得值不會爲0xFF

 

 

 

 

 

 

 

 

 

 

方法兩種

1)利用CCP模塊在Compare模式下特殊事件觸發功能實現精確的TMR1定時中斷

 

2)普通模式下在重裝定時初值前TMR1暫停計數,設定完畢後再開啓。注意補償中間置初值的延時時間 

發佈了24 篇原創文章 · 獲贊 2 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章