熱敏打印機直驅開發

    應公司要求,最近的工做內容是作熱敏打印機直接用GPIO驅動,添加字庫字符調用功能實現圖形打印,併兼容ESC/POS指令集。特此記錄一下,以備未來查閱和整理。首先,開始驅動打印機,讓打印機跑起來。java

    先來一段拷貝,說明一下要開發的產品微型熱敏打印機芯特色:性能

    微型熱敏打印機打印更均勻、運行更平穩;機芯具備體積小,工做電壓寬(3.5~8.5 DC V),高效等特色。獨特的設計使得熱敏打印機機芯具備易裝紙,高可靠性特色;該機芯在與我公司的熱敏打印機機芯僅爲與整機鏈接的FPC 的長度爲加長型(120mm)外,其它性能、結構均爲相同,因熱敏打印機機芯配置的其與整機PCB 鏈接的FPC 長度爲足夠的長,所以便於直接與整機的PCB 鏈接,能夠省去一般的轉接板,也便於生產裝配和維修之操做性。熱敏打印機在安裝結構及電器插口與日本富士通公司的FTP-628MCL101 機芯相兼容,適用於微型熱敏票據打印機以及熱敏票據打印電子收款機等.優化

上圖中,PHEPHK爲光傳感器發射級和陰級,VSEN(LPT_VDD)爲光傳感器電源。光傳感器在進紙口下部,它們的做用是檢測是否有紙。VH爲打印機電源。DICLK爲打印機數據和時鐘輸入口。STB1STB6爲選通脈衝。因爲打印機加熱對電量需求較大,因此開發者能夠根據自身的設備調節選通訊號的選通順序,以達到分散加熱,以防電流過大,設備沒法運行的目的。LAT是數據鎖存控制,DO是打印數據輸出。在啓動加熱以前,須要先經過DICLK輸入點陣數據,而後拉低LAT100ns以上將數據鎖存。
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

相關文章
相關標籤/搜索