2014年9月15日

SJ2000 行車紀錄器更換電池時間不歸零

前言:
當初看在SJ2000的超高C/P值買了這台行車紀錄器,因為一顆電池只能撐兩小時,還順便買了兩顆電池來替換,想不到他竟然拔掉電池時間就會歸零= =,這讓我買了兩顆電池也沒用處了,在網路上找找好像大家都有這問題,可是也沒解答,只好來找資料想想辦法。

SJ2000 外觀
電路板正面
電路板背面
拆解取出電路板來研究電路,Main chip 為 NT96650,這顆是台灣聯詠科技出的 MIPS32 24Kec + DSP + H.264 Codec,是專門來做行車紀錄器的SoC,在市面上有不少白牌的行車紀錄器都是NT96650 + AR0330 CMOS Sensor 這超便宜又好用的組合。
NT96650 - Block Diagram
這次改造的目標是要讓時間能夠保持不要歸零,看了看電路上沒有RTC 的IC,不過NT96650內部有RTC 及 VDD_RTC的Power Pin,那看來時間應該是交給NT96650 來計算及維持,只要讓VDD_RTC 維持在1.5~3.6V就可以讓內部RTC持續工作。


在網路上努力的尋找有關NT96650 的電路圖,這類的公板電路有些都會簽保密協議,所以找了好久終於才找到外流的電路。

看了電路後發現VDD_RTC 是由一顆3.3V 的LDO 供應的,所以只要在這LDO之後加上電池電路就可以持續的供應VDD_RTC電源,不過也不能一直持續由電池供電給RTC,這樣電池很快就會沒電了,所以要利用二極體的特性,正常時電池電壓(3V)比LDO(3.3V)低,所以當LDO 供電時電池的迴路會開路,當LDO 沒供電時二極體才會導通由電池供電。

電池供電電路

由於找到的電路並不是我的SJ2000的,所以零件編號對不起來,經過一番的量測及確認IC型號後,終於找到這顆3.3V LDO的位子。
3.3V LDO

想了想決定把原來的LDO拿掉,跳成自己的電路比較好設計。
將VCC_RTC 跳線出來


將自己設計的LDO小板與SJ2000 連接後第一次上電測試基本功能是否正常。

LDO + 雙二極體電路
電源供應器供電測試
接下來將電池接上去後測試斷電後時間是否會跑掉。

將CR2032電池接上

經過測試時間沒有因換電池歸零,我買的備用電池有用了。

完畢!~


2015.06.01 - 新增LDO小板電路:
LDO是用TI的TPS73633,如果有其他類似的LDO也是可以替換,二極體是用BAT54C,比較省體積。

LDO 小板 電路圖


2014年6月9日

FatFs - FAT file system module - 筆記

FatFs Module 是日本的嵌入式系統工程師 ChaN 所撰寫的可用於商業的開放式程式碼。

架構如下圖:
圖檔來源:http://elm-chan.org/fsw/ff/00index_e.html
FatFs module 架構

圖檔來源:http://elm-chan.org/fsw/ff/en/appnote.html
FatFs module 程式碼檔案架構































檔案:
  1. ff.c、ff.h:FatFs module 主要的程式碼。
  2. diskio.c:使用者須自行在這添加與底層連接的函數。
  3. ffconf.h:設定及是否打開 FatFs 參數及函數。
     - _FS_READONLY:唯讀模式。
     - _USE_STRFUNC:開啟可使用字串函數。

函數:
  1. f_mount(&fp, "", 0):掛載儲存裝置 。
     - fp: 檔案結構指針。

  2. f_mount(NULL, "", 0):載卸儲存裝置。

  3. f_stat("file name", &filinfo):確認該檔案或資料夾是否存在,如不用file info 可輸入NULL。
     - filinfo: FILINFO型態變數 - 參考

  4. f_opendir(&fp, path):開啟資料夾
     - path:要開啟的資料夾名稱。

  5. f_readdir(&dir, &fno):讀取資料夾內所有檔案或資料夾名稱。
     - fno:名稱放置的陣列位址。

  4. f_open(&fp, "file name", mode):開啟檔案,並將檔案訊息放在結構指針。
     - fp: 檔案結構指針。
     - mode :
        1. FA_READ:  讀取檔案指令
        2. FA_WRITE:寫入檔案指令
        3. FA_OPEN_EXISTING:開啟檔案,不存在則開啟失敗。
        4. FA_OPEN_ALWAYS: 開啟檔案,不存在則建立新檔案。
        5. FA_CREATE_NEW:    建立檔案,已有相同名稱則失敗。
        6. FA_CREATE_ALWAYS:建立檔案,有相同名稱則覆蓋過去。

  5. f_close(&fp):關閉檔案,每次開啟檔案不使用時皆要關閉。

  6. f_sync(&fp):刷新檔案,與close 一樣的作用可是沒實際關閉檔案,可防止檔案遺失。
     -參考:http://elm-chan.org/fsw/ff/en/appnote.html - Critical Section

  7. f_read(&fp, &buff, data len, read len):讀取data len 數量byte 到Buffer。
     -buff:資料放置的陣列位址。
     -data len:要讀取的檔案Byte 數量。
     -read len:實際讀取到的Byte 數量,data len 超過檔案大小會只讀取到檔案的最後Byte。

  8. f_write(&fp, &buff, data len, write len):寫入data len 數量byte 到儲存裝置。
     -buff:資料放置的陣列位址。
     -data len:要寫入的檔案Byte 數量。
     -write len:實際寫入的Byte 數量,如儲存裝置已滿會停止寫入。

  9. f_puts(*str, &fp):寫入一字串到檔案。(#字串函數)

  10. f_printf(&fp, "%d", 123):使用方法與 printf() 一樣。(#字串函數)

File function return:
  1.   FR_OK: 所呼叫的Function 執行任務完成。
  2.   FR_DISK_ERR
  3.   FR_INT_ERR
  4.   FR_NOT_READY
  5.   FR_NO_FILE:沒有該檔案
  6.   FR_NO_PATH
  7.   FR_INVALID_NAME
  8.   FR_DENIED
  9.   FR_EXIST
  10. FR_INVALID_OBJECT
  11. FR_WRITE_PROTECTED
  12. FR_INVALID_DRIVE
  13. FR_NOT_ENABLED
  14. FR_NO_FILESYSTEM
  15. FR_MKFS_ABORTED
  16. FR_TIMEOUT
  17. FR_LOCKED
  18. FR_NOT_ENOUGH_CORE
  19. FR_TOO_MANY_OPEN_FILES
  20. FR_INVALID_PARAMETER

參考文獻及資料來源:
1. http://elm-chan.org/fsw/ff/00index_e.html

2014年3月7日

[QT] 將QString 轉成 Char 型態


由於要使用 fopen() 函數,需要給檔案路徑,可是fopen 只吃char 字元陣列,
而程式取路徑的方式是使用QFileDialog 的getOpenFileName ,傳出的是QString 類型。
所以得經過轉換才可以。

QString 透過 QByteArray 將字串轉為字元陣列。

QString str;
QByteArray byteArray = str.toLocal8Bit ();
char *c = byteArray.data();

參考資料:
1. http://0rz.tw/aNtB6

2014年3月6日

靜電保護-ESD 概念

靜電容易對電子產品造成傷害,輕微的可能重開機可以排除,嚴重的會造成電子元件永久性的損毀。

EDS元件防護原理(TVS):當有瞬間電壓超過電路正常工作電壓時,TVS會產生雪崩,產生一個對地的超低電阻通道,將瞬間電流由TVS引開保護其元件,脈衝結束後,TVS會回復高阻抗,使元件可以正常工作。

ESD國際規範:IES 61000-4-2

根據EN 61000-4-2 靜電測試方法:

  1. 空氣放電測試:模擬人的手指觸碰電子產品時所發生的靜電放電情況。
    測試方式:靜電槍用8mm的放電頭,測試電壓由低到高,對經常容易觸碰的非金屬部位做測試,通常最高測到正負8KV,法規中保留容許高於正負15KV的測試條件。
  2. 接觸放電測試:模擬操作人員直接或間接,接觸到電子產品所產生的放電情況。
    測試方式:靜電槍對待測品金屬部位做放電測試,通常測試到正負4KV。

IEC 61000-4-2 測試電壓與還境條件

測試結果評估判定:
ESD 測試結果評估須按被測試產品功能受影響的程度做判定, 
依法規係將受影響的程度分為四級: 
  • 第一級為 A 級判定 (Criterion A): 指產品功能在測試前後及測試過程中完全可 以正常操作, 無任何功能減低或異常現象出現, 完全不受 ESD 放電影響, 則稱產 品符合 A 級判定結果.
  • 第二級為 B 級判定 (Criterion B): 指產品在測試過程中,功能會受 ESD 放電影響, 在放電瞬間會暫時性的功能降低, 但可以自動回復, 這樣的產品則稱符合 B 級判 定結果.
  • 第三級為 C 級判定 (Criterion C):指產品功能在測試前可正常被操作,但測試過程 中受 ESD 放電影響, 出現功能降低或異常, 且功能無法自動回復, 必須經由操作 人員做重置(Re-set)或重開機的動做才能回復功能, 這情形則僅符合 C 級判定結 果.
  • 第四級為 D 級判定 (Criterion D): 指產品功能在測試前可正常被操作,但測試過 程中出現異常,雖經由操作人員做重置(Re-set)或重開機也不能回復功能, 這種情 況大概產品已損傷嚴重, 僅符合 D 級判定結果. (這屬不合格).
依IEC 61000-4-2法規建議,產品採購驗證必須符合A級或B級的判定才能接受, C 級和 D 級判定是不合格的. 


常見的ESD元件:
1. Varistor
2. ESD Guard:超低電容值,適合用在高頻訊號。
3. Zener Diode
4. TVS Diode:常用。

參考資料:

  1. http://www.digitimes.com.tw/tw/dt/n/shwnws.asp?id=0000160028_COJ1T6HK1WRFXA97F4HMK
  2. http://www.eettaiwan.com/ART_8800352147_480402_TA_ec8aeb8f.HTM
  3. http://www.lcis.com.tw/paper_store/paper_store/esd-test-protect-20141270243921.pdf



2014年1月13日

Keil 計算ROM (Flash) Size 及 RAM Size

Keil 編譯成功後會在 Build Output 事窗出現一條訊息:
Program Size: Code=5124 RO-data=696 RW-data=92 ZI-data=22316
這條訊息可以計算出所使用的 Code Size 。

Code:程式碼所佔的大小。
RO-data :程式中定義的常量 (Read Only)
RW-data:程式中有初始值的變數 (Read/Write)
ZI-data   :程式中沒初始值的變數 (Zero Initialize)

Code、RO-data、RW-data:這三個類型內容不可因斷電資料就消失,所以需要存在ROM裡。
RW-data、ZI-data:這兩個類型變數需在程式執行時可隨時改變用於計算,所以需在程式執行時放置在RAM裡。

所以:
ROM (Flash) Size = Code + RO-data + RW-data。
RAM Size = RW-data + ZI-data。

2014年1月7日

CAN Bus 筆記 (for STM32) - 文章撰寫中

CAN協定:
  1. Protocol:
   
CAN 2.0A
   
CAN 2.0B
















  2. 訊號狀態:
    閒置:TX電位H、隱性電平、雙線電壓差0V。
    通訊:TX電位L、顯性電平、雙線電壓差2V以上。

  3.優先權比較:
    當RX偵測到 L 則轉為監聽模式,直到該筆送完。
    仲裁優先權: ID越小優先權越高。
    防碰撞檢測方式: CSMA/CD

  4.Message Type : (參考2-P17)
    i.Data Frame: 傳送資料。
    ii.Remote Transmit Request Frame: 要求資料。
    iii.Error Frame: 送出錯誤檢查。
    iv.Overload Frame: 要求下筆資料需要延遲。
    v. Inter frame Space: 間距 (參考4)

  5.傳輸速率與距離:
    Bit Rate(Kbit/S)    Bus Length(M)
      1000                     30
      500                       100
      250                       250
      125                       500
      62.5                      1000
      5                           10000