• slider image 71
  • slider image 72
  • slider image 73
:::


Browsing this Thread:   1 Anonymous Users




« 1 (2)


Re: 12F1822耗電速度問題
#11
版主
版主


查看用戶資訊
[quote}以下為使用的功能:
16MHz內置振盪
Power-up timer
TMR1(8Hz,使用32768Hz低功耗外部振盪)
IOC(IOCAP=8)
所有輸入都有560ohm下拉電阻(RA1除外)
以FVR讀取ADC電源電壓,每分鐘只讀取一次
[/quote]

這是你之前的設定方式,個人建議是: 可以使用 Internal 1MHz RC 震盪頻率取代原先的 16MHz? MCU 是否真的需要到 16MHz 的執行速度? 這可以考慮一下。

TMR1 已經使用外部 32768Hz 的晶震,為何不直接就設預除器 除 8 後在計數 65535 後中斷一次,這樣就可以有 16 秒的時間了。

發表於: 2019/11/29 11:39
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 12F1822耗電速度問題
#12
資深會員
資深會員


查看用戶資訊
參照:
這是你之前的設定方式,個人建議是: 可以使用 Internal 1MHz RC 震盪頻率取代原先的 16MHz? MCU 是否真的需要到 16MHz 的執行速度? 這可以考慮一下。

因應SPI輸入的最低速度限制(我是使用自己撰寫的SPI輸入輸出程式碼),內振設太低會影響讀取輸入的準確度。


參照:
TMR1 已經使用外部 32768Hz 的晶震,為何不直接就設預除器 除 8 後在計數 65535 後中斷一次,這樣就可以有 16 秒的時間了。

程式內的時間模組可不能每16秒才計數一次吧...
而且因為需要準度校正,所以我在撰寫時間相關的程式所設定的中斷頻率一般不會低於8Hz,而4Hz是極限。

發表於: 2019/11/29 19:51
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 12F1822耗電速度問題
#13
資深會員
資深會員


查看用戶資訊
經過2個月,再跟進一下。

讓MCU以這個設定一直跑了兩個月,剛再測量電池電壓,仍然穩穩的在2.97V,只是如果沒有進行校準的話,時間誤差會是每天慢5秒。

就此順便一問,TMR1利用外部振盪時,實際跑出來的時間在沒校正的情況下總是比參考時間(例如氣象局的授時伺服器)的較慢,而沒一個會比較快,為什麼?

在5個有同樣硬件設定的作品中,全部都要設定在每256次中斷,就要有16-19次設定為較高的中斷頻率,才可達到平衡。用文字表達比較難,所以附圖表示。

TMR1中斷後初始值即為TMR1中斷事件(TMR1IF)發生後,立即把TMR1H和TMR1L的值重設,而61440為使用32768Hz振盪時達到8Hz中斷頻率的數值,即TMR1H=240而TMR1L=0。
if(PIR1.TMR1IF){
  
TMR1H=TMR1H_RST;
  
TMR1L=TMR1L_RST;
  
PIR1.TMR1IF=0;
...
}

//當中TMR1H_RST和TMR1L_RST為變數
//TMR1H_RST的值為239或240
//TMR1L_RST的值為1、0或255


在紅線的時間點發生中斷時,TMR1H仍是被重設為240但TMR1L則設定為1。

Attach file:



gif  (0.00 KB)


發表於: 1/30 3:32
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 12F1822耗電速度問題
#14
版主
版主


查看用戶資訊
回覆有關石英震盪器 32768Hz 不準的問題:

32768Hz 的頻率得準確度是要依廠商的規格而定,如果廠商所提供的規格是 25ppm 的話就會有誤差到 +- 2.5 秒/日。

而且溫度也是個重要的影響因素,像 Microchip 所出的萬年曆時鐘晶片 MCP7940N 本身就有內建 "On-Chip Digital Trimming/Calibration" 可以自行設定 Crystal 的誤差值及溫度影響值後自我修正頻率的差異。

參照:
只是如果沒有進行校準的話,時間誤差會是每天慢5秒


以這表現的誤差是 5秒/86400秒 = 58ppm,算是高了一點,可以試著修改 C1 & C2 的電容值及使用無溫度系數的 NPO 陶瓷電容。還有如果測試幾顆 Crystal 都是一樣的誤差值,那就可以在軟體裡修正。請自行計算是否在幾次的中斷後修改 Timer1 的值使其符合精確的計時。

發表於: 1/30 9:45
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 12F1822耗電速度問題
#15
資深會員
資深會員


查看用戶資訊
時間是不等人的...
也不等程式...


---+-------+-------+-------+-------+-------

加號(+)是中斷點
有些人以為(中斷)程式,是從 中斷點 加號(+) 開始執行
其實算對,也算不對....

如果你對時間不敏感,是對的...
如果你對時間很敏感,可能就會出錯...

這是什麼意思,在說什麼....

這要從中斷機制說起....
看起來 只有一個 加號(+)的中斷點,
包含很多機制與一些學問在其中....

如果我們細看(慢動作)中斷過程
(把中斷點 加號(+) 展開來看)...
+ => +A----B------
加號展開,加入A點,B點來說明....

原來中斷
---+--------------+--------------

展開
---+A----B--------+A----B--------

(如果你不變更中斷設定,中斷週期不會改變...)

A點 一樣是原來中斷位置(加號 +)
B點 你的中斷程式開始的位置

尤其你中間還會有一堆判斷
if(PIR1.TMR1IF){
// 這裏是(中斷)B點
...
}

註: B點的位置,基本上是不可控,而且有可能長短不一...

如果你在中斷點重設 timer計數器,例:
TMR1H=TMR1H_RST;
TMR1L=TMR1L_RST;

註: 在autoload的MCU中,不需重設計數器
在沒有autoload/preload的,才需要重設計數器

沒有autoload/preload,重設計數器
TMR1H = TMR1H + TMR1H_SET;
TMR1L = TMR1L + TMR1L_SET;
用修正的不是,直接設定...

為什麼是這樣....
因為你的程式碼,是在(中斷)B點重設計數器,不是在(中斷)A點
註: 有autoload/preload是在(中斷)A點,MCU幫你重設計數器...

原本中斷周期是這樣
---+A----B--------+A----B--------+....

當你在(中斷)B點,"誤設"計數器後,變成這樣
---+A----B------------+A----B------------+...

原本的中斷周期變.......長......長了

也就是你觀察結果,永遠都變慢,不變快....

以上供參考...

發表於: 1/30 10:37
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 12F1822耗電速度問題
#16
資深會員
資深會員


查看用戶資訊
參照:
可以試著修改 C1 & C2 的電容值及使用無溫度系數的 NPO 陶瓷電容

針對TMR1外部振盪電路我一律使用20pF的NPO陶瓷電容。這部分我也曾經參看過一些文章說明NPO在這類型電路的應用和重要性。使用較小的電容值可以減少中斷之間的額外延遲,但也會降低穩定性。

參照:
還有如果測試幾顆 Crystal 都是一樣的誤差值,那就可以在軟體裡修正。請自行計算是否在幾次的中斷後修改 Timer1 的值使其符合精確的計時。

經過5年多以來的持續更新和測試,誤差值都不一,只是在軟體上設定的校準值,幾個作品之間差異都很小(最小16,最大19),近期我針對程式架構增設更精準的校正方式。而且在ISR內還有其他中斷式,即例如TMR0、TMR2、TMR4以及IOC等等,以及中斷判斷式的次序排列,也會影響ISR捕捉TMR1中斷事件的時機。
通常每次修改完涉及到TMR1中斷的程式碼後,都需要花最少兩星期來觀察和校準,有時可能要花上一個月。


回覆jason680的解說:
明白你的意思,而且了解到由MCU在偵測到中斷到跑進去ISR執行,是有時間差距,也就是MCU永遠無法即測即跑。

就你所說的,時間點A和B永遠都有個最小差距,而且是無法進一步縮小,也是中斷在沒校正的情況下只會越跑越跟不上去。

發表於: 2/2 17:19
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 12F1822耗電速度問題
#17
版主
版主


查看用戶資訊
談到校正,有一種叫 TCXO (溫度補償控制的石英振盪器) 其準確度可達 5ppm。可以用一個 1MHz TCXO 做一個標準頻率輸出的電路板用來校正 Timer1 的 32768Hz 的誤差。 因為 TCXO 是很準確的頻率可以做為校正的基礎,在固定的時間內 (1分鐘) 測量 32768Hz 的誤差值,並將此誤差值寫到內部的 EEPROM。這樣每次開機的時候就可用這校正值來修正 32768Hz 的誤差。

麻煩的是每個產品都要做校正,不過這也算是最便宜的作法。

發表於: 2/3 11:32
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部







You can view topic.
You cannot start a new topic.
You cannot reply to posts.
You cannot edit your posts.
You cannot delete your posts.
You cannot add new polls.
You cannot vote in polls.
You cannot attach files to posts.
You cannot post without approval.
You cannot use topic type.
You cannot use HTML syntax.
You cannot use signature.
You cannot create PDF files.
You cannot get print page.

[進階搜尋]