應公司要求,最近的工做內容是作熱敏打印機直接用GPIO驅動,添加字庫字符調用功能實現圖形打印,併兼容ESC/POS指令集。特此記錄一下,以備未來查閱和整理。首先,開始驅動打印機,讓打印機跑起來。java
先來一段拷貝,說明一下要開發的產品微型熱敏打印機芯特色:性能
微型熱敏打印機打印更均勻、運行更平穩;機芯具備體積小,工做電壓寬(3.5~8.5 DC V),高效等特色。獨特的設計使得熱敏打印機機芯具備易裝紙,高可靠性特色;該機芯在與我公司的熱敏打印機機芯僅爲與整機鏈接的FPC 的長度爲加長型(120mm)外,其它性能、結構均爲相同,因熱敏打印機機芯配置的其與整機PCB 鏈接的FPC 長度爲足夠的長,所以便於直接與整機的PCB 鏈接,能夠省去一般的轉接板,也便於生產裝配和維修之操做性。熱敏打印機在安裝結構及電器插口與日本富士通公司的FTP-628MCL101 機芯相兼容,適用於微型熱敏票據打印機以及熱敏票據打印電子收款機等.優化
上圖中,PHE和PHK爲光傳感器發射級和陰級,VSEN(LPT_VDD)爲光傳感器電源。光傳感器在進紙口下部,它們的做用是檢測是否有紙。VH爲打印機電源。DI和CLK爲打印機數據和時鐘輸入口。STB1到STB6爲選通脈衝。因爲打印機加熱對電量需求較大,因此開發者能夠根據自身的設備調節選通訊號的選通順序,以達到分散加熱,以防電流過大,設備沒法運行的目的。LAT是數據鎖存控制,DO是打印數據輸出。在啓動加熱以前,須要先經過DI和CLK輸入點陣數據,而後拉低LAT腳100ns以上將數據鎖存。
spa
打印機每行有384個點,點距爲0.125mm。每一個點1bite數據表示,因此每行48byte。如下是輸入數據代碼:設計
static int jx_write_line(unsigned char *p) { int i, j; int ret = 0; unsigned char data; int *tmp = (int *)p; for(j=0; j<48; j++){ data = p[j]; for(i=0; i<8; i++) { if((data&0x80) == 0) gpio_set_value(IUNIN_GPIO_LPT_DIN, 0); else gpio_set_value(IUNIN_GPIO_LPT_DIN, 1); data = data << 1; ndelay(twCLK_DELAY); gpio_set_value(IUNIN_GPIO_LPT_CLK, 1); ndelay(twCLK_DELAY); gpio_set_value(IUNIN_GPIO_LPT_CLK, 0); } } gpio_set_value(IUNIN_GPIO_LPT_LAT, 0); ndelay(twLAT_DELAY); gpio_set_value(IUNIN_GPIO_LPT_LAT, 1); ndelay(setup_LAT_DELAY); return 0; }
接下來是打印機的步進機了。如下是步進機原理圖:code
由圖可知,步進機由定子和轉子組成。經過給四個位置上電驅動裏邊的轉子移動,步進機有兩相三相四相等等。熱敏打印機 的步進電機採用1-2 相驅動方式,有4 個位置。MT/A(正),MT/A(負),MT/B(正),MT/B(負)。如下是熱敏打印機採用的步進機控制時序圖:開發
由上圖可知,步進機行進一點行的上電時序爲:從A(正)單獨加電到A(負)單獨上電,由步進機原理圖可知,行進一點行相應的步進機跑了半圈。由此咱們的行進方式應該爲先後半圈交替的順序。如下是步進機驅動代碼:產品
if (line == 0) { gpio_set_value(IUNIN_GPIO_LPT_MOT_AP, 1); //STEP1 gpio_set_value(IUNIN_GPIO_LPT_MOT_BP, 0); gpio_set_value(IUNIN_GPIO_LPT_MOT_AN, 0); gpio_set_value(IUNIN_GPIO_LPT_MOT_BN, 1); MOTOR_DELAY; gpio_set_value(IUNIN_GPIO_LPT_MOT_AP, 0); //STEP2 gpio_set_value(IUNIN_GPIO_LPT_MOT_BP, 0); gpio_set_value(IUNIN_GPIO_LPT_MOT_AN, 0); gpio_set_value(IUNIN_GPIO_LPT_MOT_BN, 1); MOTOR_DELAY; gpio_set_value(IUNIN_GPIO_LPT_MOT_AP, 0); //STEP3 gpio_set_value(IUNIN_GPIO_LPT_MOT_BP, 0); gpio_set_value(IUNIN_GPIO_LPT_MOT_AN, 1); gpio_set_value(IUNIN_GPIO_LPT_MOT_BN, 1); MOTOR_DELAY; gpio_set_value(IUNIN_GPIO_LPT_MOT_AP, 0); //STEP4 gpio_set_value(IUNIN_GPIO_LPT_MOT_BP, 0); gpio_set_value(IUNIN_GPIO_LPT_MOT_AN, 1); gpio_set_value(IUNIN_GPIO_LPT_MOT_BN, 0); } else { gpio_set_value(IUNIN_GPIO_LPT_MOT_AP, 0); //STEP1 gpio_set_value(IUNIN_GPIO_LPT_MOT_BP, 1); gpio_set_value(IUNIN_GPIO_LPT_MOT_AN, 1); gpio_set_value(IUNIN_GPIO_LPT_MOT_BN, 0); MOTOR_DELAY; gpio_set_value(IUNIN_GPIO_LPT_MOT_AP, 0); //STEP2 gpio_set_value(IUNIN_GPIO_LPT_MOT_BP, 1); gpio_set_value(IUNIN_GPIO_LPT_MOT_AN, 0); gpio_set_value(IUNIN_GPIO_LPT_MOT_BN, 0); MOTOR_DELAY; gpio_set_value(IUNIN_GPIO_LPT_MOT_AP, 1); //STEP3 gpio_set_value(IUNIN_GPIO_LPT_MOT_BP, 1); gpio_set_value(IUNIN_GPIO_LPT_MOT_AN, 0); gpio_set_value(IUNIN_GPIO_LPT_MOT_BN, 0); MOTOR_DELAY; gpio_set_value(IUNIN_GPIO_LPT_MOT_AP, 1); //STEP4 gpio_set_value(IUNIN_GPIO_LPT_MOT_BP, 0); gpio_set_value(IUNIN_GPIO_LPT_MOT_AN, 0); gpio_set_value(IUNIN_GPIO_LPT_MOT_BN, 0); }
代碼中, MOTOR_DELAY 爲步進機行進等待時間,在此時間內,咱們能夠驅動 STB1 到 STB6 的選通脈衝。驅動方式根據設備供電能力分時段分別對 STB1 到 STB6 進行加熱,也能夠調節加熱時長和頻率,以達到調節灰度級的效果。 it
自此, 熱敏打印機能打點了,基本驅動實現。接下來是優化的過程了。。。io