新聞中心

EEPW首頁(yè) > 電源與新能源 > 設(shè)計(jì)應(yīng)用 > 基于熱敏打印機(jī)的心電圖形快速打印方法的研究及應(yīng)用實(shí)例

基于熱敏打印機(jī)的心電圖形快速打印方法的研究及應(yīng)用實(shí)例

——
作者:作者:天津大學(xué)精密儀器與光電子工程學(xué)院 于 超 李 剛 林 凌 諶雅琴 時(shí)間:2007-01-26 來(lái)源:《電子技術(shù)應(yīng)用》 收藏

目前,我國(guó)各醫(yī)院普遍使用的心電圖機(jī)絕大多數(shù)是機(jī)電式的,即通過(guò)電極檢測(cè)心電信號(hào),放大后直接記錄,存在著打印效率低、噪聲污染嚴(yán)重、心電波形失真等缺點(diǎn)。與之相比,數(shù)字式心電圖機(jī)通過(guò)軟件實(shí)現(xiàn)噪聲抑制和心電參數(shù)的提取,并采用數(shù)字式打印機(jī)輸出心電圖形,可為醫(yī)護(hù)人員提供更完美心電圖和更多診斷信息,必將成為市場(chǎng)的發(fā)展趨勢(shì),有著更廣闊的應(yīng)用前景。由于數(shù)字心電圖機(jī)通過(guò)adc采集的數(shù)據(jù)是離散的,要將其在圖紙上還原為原始的心電圖形,除了要將數(shù)據(jù)與圖紙上的離散點(diǎn)對(duì)應(yīng)起來(lái),還要根據(jù)信號(hào)變化的趨勢(shì),在這些點(diǎn)之間連線,使之成為連續(xù)的圖形。將心電數(shù)據(jù)尤其是多導(dǎo)聯(lián)心電數(shù)據(jù)同步、準(zhǔn)確、快速打印出來(lái)是整個(gè)系統(tǒng)開(kāi)發(fā)的難點(diǎn)和關(guān)鍵,而高效打印算法對(duì)數(shù)字心電圖機(jī)的開(kāi)發(fā)無(wú)疑是很有意義的。

隨著電子技術(shù)的發(fā)展,打印機(jī)已經(jīng)廣泛應(yīng)用到各個(gè)領(lǐng)域,成為各種智能數(shù)字化儀器儀表的重要數(shù)據(jù)輸出手段。而其中熱敏打印機(jī)憑其體積小、重量輕、可靠性高、打印字符清晰、無(wú)噪聲、走紙均勻等獨(dú)特能而越來(lái)越受到青睞,更是成為小型醫(yī)療儀器如心電圖機(jī)的首先。

下面以筆者課題組開(kāi)發(fā)的12導(dǎo)同步心電圖機(jī)為例,介紹以普通52單片機(jī)為主控芯片應(yīng)用串行熱敏打印機(jī)實(shí)現(xiàn)多種方式的心電圖形打印,并重點(diǎn)描述了12導(dǎo)聯(lián)同步打印方式的程序?qū)崿F(xiàn)方案。

本文引用地址:http://butianyuan.cn/article/21446.htm

1 系統(tǒng)硬件設(shè)計(jì)

系統(tǒng)配置了一個(gè)內(nèi)置式數(shù)字打印機(jī),它主要由熱敏打印頭(w216-qs)和步進(jìn)電機(jī)組成。w126-qs點(diǎn)陣式熱敏打印頭打印數(shù)據(jù)采用串行輸入,其內(nèi)部不僅包含有由c-mos集成芯片構(gòu)成的1728位移位寄存器,還包含借助高密度厚膜工藝制成的加熱元件。這些加熱元件通過(guò)鎖存和切換晶體管驅(qū)動(dòng),可在熱敏打印紙上產(chǎn)生1728個(gè)點(diǎn),對(duì)應(yīng)的打印寬度為216mm,分辨率為8dot/mm。熱敏打印頭所需的打印數(shù)據(jù)為串行數(shù)據(jù),數(shù)據(jù)傳輸遵循spi口的通信協(xié)議。系統(tǒng)采用了口線模擬spi的工作方式與打印頭通信,電路如圖1所示。

考慮到52單片機(jī)內(nèi)部令有256字節(jié)的內(nèi)部ram,系統(tǒng)還外擴(kuò)1片hm628128存儲(chǔ)12導(dǎo)心電數(shù)據(jù)和中間轉(zhuǎn)換結(jié)果。

2 系統(tǒng)軟件編寫(xiě)

數(shù)字打印實(shí)現(xiàn)的兩個(gè)關(guān)鍵問(wèn)題:①如何將心電數(shù)據(jù)轉(zhuǎn)換成打印數(shù)據(jù);②如果將數(shù)據(jù)輸出到數(shù)字打印機(jī)。通常采用的方法是轉(zhuǎn)換數(shù)據(jù)同時(shí)將其輸出到打印機(jī)打印。這樣節(jié)省了存儲(chǔ)器空間;缺點(diǎn)是程序?qū)崿F(xiàn)復(fù)雜,通用性差(不同打印方式的數(shù)據(jù)輸出程序不同),系統(tǒng)功能不易擴(kuò)展,數(shù)據(jù)轉(zhuǎn)換和輸出都要考慮打印點(diǎn)位置,并且每輸出一點(diǎn)的數(shù)據(jù)都要調(diào)用一次程序,加大了系統(tǒng)開(kāi)銷(xiāo)。系統(tǒng)軟件中沒(méi)有采有這種方式,而是在內(nèi)存中開(kāi)辟216字節(jié)打印緩沖區(qū),將熱敏打印頭1728個(gè)點(diǎn)與216×8位數(shù)據(jù)相對(duì)應(yīng),每次將要打印的一線數(shù)據(jù)都轉(zhuǎn)換完再輸出。這樣只需在數(shù)據(jù)轉(zhuǎn)換時(shí)考慮打印位置和方式,輸出程序只需將216字節(jié)的數(shù)據(jù)按位輸出即可,并且每打印一線數(shù)據(jù)只需調(diào)用一次輸出子程序,字節(jié)了系統(tǒng)開(kāi)銷(xiāo)。缺點(diǎn)是占用系統(tǒng)資源,這一點(diǎn)在12導(dǎo)同步打印表現(xiàn)得尤為明顯。

系統(tǒng)程序?qū)崿F(xiàn)三種打印方式:分兩次打印12導(dǎo)聯(lián)數(shù)據(jù),每次打印6導(dǎo)、12導(dǎo)同步打印、縱向打?。ù蛴⌒Ч鐖D2)。在每一種打印程序中實(shí)現(xiàn)模擬spi口將打印數(shù)據(jù)送至數(shù)字打印機(jī)的子程序共用,不同處在于如何將心電數(shù)據(jù)轉(zhuǎn)換成打印數(shù)據(jù)。

2.1 i/o口線模擬spi口

spi(serial peripheral interface)總線串口是由motorola公司提出的一種同步串行外設(shè)接口,通過(guò)四根線進(jìn)行通信:時(shí)鐘線(spkclk)、數(shù)據(jù)輸出線(spimiso)、數(shù)據(jù)輸出線(spimosi)、片選線(cs),內(nèi)部通過(guò)spidat寄存器完成串-并/并-串轉(zhuǎn)換。它主要工作在主從式系統(tǒng)中,一個(gè)主器件可以帶多個(gè)從器件,主器件通過(guò)片選線控制總線沖突,使同一時(shí)刻只有一個(gè)從器件與從器件交換數(shù)據(jù)。

系統(tǒng)應(yīng)用的串行熱陣式打印機(jī)數(shù)據(jù)傳輸采用spi時(shí)序,但普通52單片機(jī)無(wú)spi口,所以采用i/o口線模擬spi時(shí)序。考慮到系統(tǒng)中mcu作為主器件總是發(fā)送數(shù)據(jù),而數(shù)字打印機(jī)作為唯一從器件又總是接收數(shù)據(jù),所以只需用口線模擬spi口的時(shí)鐘線(spikclk)、數(shù)據(jù)輸出線(spimosi),程序模擬spidat完成并-串轉(zhuǎn)換即可。如前所提到打印頭打印的數(shù)據(jù)點(diǎn)數(shù)為1728點(diǎn),分辨率為8mm/mv,對(duì)應(yīng)216字節(jié)的數(shù)據(jù),為此從內(nèi)部ram中分配出216字節(jié)的空間作為打印緩沖區(qū),程序從緩沖區(qū)依次讀數(shù)據(jù),在模擬時(shí)鐘線的控制下將并行數(shù)據(jù)轉(zhuǎn)換成的串行數(shù)據(jù)按位依次送至打印機(jī)的移位寄存器中,結(jié)束后送latch鎖存信號(hào)和打印頭加熱脈沖strobe,從而在熱敏打印紙打印出一線心電圖形,驅(qū)動(dòng)步進(jìn)電機(jī)向前走紙即可以連續(xù)打印。spi口模擬程序如下:

output:

現(xiàn)場(chǎng)保護(hù)

lcall intram ;初始化內(nèi)部打印緩沖區(qū)

mov r0,#dat_buff ;初始化r0為緩沖區(qū)末位地址

dat_out:

mov a,@r0 ;從緩沖區(qū)讀數(shù)據(jù)

mov r7,#08h ;初始化r7控制并/串?dāng)?shù)據(jù)轉(zhuǎn)換

cont_chg:

rrc a ;對(duì)acc循環(huán)右移實(shí)現(xiàn)并-串轉(zhuǎn)換

mov p1.3,c 將串行數(shù)據(jù)送至打印機(jī)

setb p1.1 ;模擬spi時(shí)鐘

nop

clr p1.1

djnz r7,cont_chg ;判斷1字節(jié)數(shù)據(jù)是否轉(zhuǎn)換完

dec r0 ;尋址下一字節(jié)

cjne r0,#15h,dat_out;判斷數(shù)據(jù)是否全部轉(zhuǎn)換完

clr p1.2 ;產(chǎn)生數(shù)據(jù)鎖存信號(hào)

nop

setb p1.2

nop

clr p1.0 ;產(chǎn)生加熱脈沖

lcall heatdly ;調(diào)用加熱延時(shí)程序

setb p1.1

lcall motor_run ;步進(jìn)電機(jī)走紙

恢復(fù)現(xiàn)場(chǎng)

ret

2.2 打印算法

數(shù)字打印機(jī)實(shí)質(zhì)上實(shí)現(xiàn)了數(shù)據(jù)與打印點(diǎn)的對(duì)應(yīng),也就是說(shuō)8位心電數(shù)據(jù)數(shù)值范圍為0~255,對(duì)應(yīng)于熱敏打印紙上的256點(diǎn),通過(guò)加熱敏單元使紙上某點(diǎn)變黑顯示數(shù)據(jù)的大小。這就需要將表征實(shí)際心電大小的數(shù)據(jù)(以下稱為原始數(shù)據(jù))轉(zhuǎn)換成能夠指示加熱點(diǎn)位置的數(shù)據(jù)(以下稱為位置數(shù)據(jù)),通過(guò)位置數(shù)據(jù)的控制將心電數(shù)據(jù)對(duì)應(yīng)的點(diǎn)依次打印出來(lái),就可獲得心電圖。但是由于系統(tǒng)模數(shù)轉(zhuǎn)換器獲得的心電數(shù)據(jù)是離散的,如果僅將它們對(duì)應(yīng)的點(diǎn)打印出來(lái),得到只是一些離散的點(diǎn),要想獲得連續(xù)的心電圖形,需要將相鄰的離散點(diǎn)按照一定的算法將它們連接起來(lái),對(duì)于縱向打印方式和橫向打印方式,離散點(diǎn)連線算法是不同的。限于篇幅,在下面介紹打印方式的實(shí)現(xiàn)中,僅對(duì)橫向12導(dǎo)同步打印和縱向打印進(jìn)行詳細(xì)闡述,而對(duì)6導(dǎo)聯(lián)打印僅介紹其實(shí)現(xiàn)思想。

2.2.1 橫向6導(dǎo)聯(lián)打印

心電圖紙長(zhǎng)度為216mm,為每一導(dǎo)聯(lián)心電信號(hào)分配32mm,對(duì)應(yīng)于打印緩沖區(qū)中連續(xù)的32字節(jié),打印數(shù)據(jù)轉(zhuǎn)換后的位置數(shù)據(jù)存儲(chǔ)于這32個(gè)字節(jié)中。12導(dǎo)聯(lián)的心電數(shù)據(jù)被分為兩大組,當(dāng)一組打印完成再打印剩下的6導(dǎo)聯(lián)的數(shù)據(jù)。具體的實(shí)現(xiàn)過(guò)程可參考橫向12導(dǎo)聯(lián)打印方式。

2.2.2 橫向12導(dǎo)聯(lián)同步打印

在6導(dǎo)聯(lián)打印方式實(shí)現(xiàn)過(guò)程中,注意到在大多情況下一個(gè)完事心電波形中僅qrs波主峰較高可以點(diǎn)滿整個(gè)空間外,其他波段幅值都較小占用空間很少,而這些波段可以提供更多的信息,此外將12導(dǎo)聯(lián)分開(kāi)打印,不利于醫(yī)生對(duì)比同一時(shí)刻不同導(dǎo)聯(lián)的心電波形。而采用12導(dǎo)聯(lián)同步打印,雖然會(huì)出現(xiàn)波形部分重疊,但是在一些心臟疾病診斷中影響不大,且可以得取更直觀的效果。

12導(dǎo)聯(lián)同步打印程序?qū)崿F(xiàn)的基本思想與6導(dǎo)聯(lián)同步打印相同,不同在于將12導(dǎo)聯(lián)的數(shù)據(jù)同時(shí)在216mm寬的打印紙上打印出來(lái),不可避免地出現(xiàn)不同導(dǎo)聯(lián)心電圖形重疊的現(xiàn)象,對(duì)應(yīng)的內(nèi)存單元也會(huì)出現(xiàn)復(fù)用的情況。如果簡(jiǎn)單地套用6導(dǎo)聯(lián)打印程序,那么前一導(dǎo)聯(lián)的數(shù)據(jù)會(huì)被相鄰導(dǎo)聯(lián)數(shù)據(jù)沖掉,從而使圖形無(wú)法正確顯示。圖3列出了為各個(gè)導(dǎo)聯(lián)分配的熱敏打印紙空間與緩沖內(nèi)存單元(這里假定緩存地址為0x1dh~0xedh)。從圖3中可以看出除了i導(dǎo)聯(lián)前16mm空間和v6導(dǎo)聯(lián)的后16mm空間沒(méi)有被復(fù)用,打印紙的其它空間都是被兩個(gè)導(dǎo)聯(lián)共用。內(nèi)部ram使用情況也與之類(lèi)似。為此在外部ram開(kāi)辟一個(gè)內(nèi)部打印緩沖區(qū)的影像區(qū)(大小為216字節(jié),單元地址的低8位與內(nèi)存相應(yīng)單元相同,如內(nèi)部ram 0x1dh單元與外部ram 0xxx1dh相對(duì)應(yīng)),將12導(dǎo)聯(lián)分為兩組:一組(i,iii,avl,v1,v3,v5)仍然存儲(chǔ)于內(nèi)部存儲(chǔ)器,而另一組(ii,avf,v2,v4,v6)存儲(chǔ)于外部影像區(qū),在12導(dǎo)聯(lián)一線數(shù)據(jù)轉(zhuǎn)換完要打印時(shí),將兩部分按照對(duì)應(yīng)單元相與即可。這樣做不但可以解決上述問(wèn)題,而且節(jié)省了內(nèi)部資源、降低程序編寫(xiě)的難度。

如前所述不同導(dǎo)聯(lián)所占的打印空間不同,所以,對(duì)于某導(dǎo)聯(lián)心電信號(hào),先要確定其打印區(qū)間,然后再確定打印數(shù)據(jù)在該區(qū)間的相對(duì)位置。

假定某導(dǎo)聯(lián)所占打印空間的起始字節(jié)為第n個(gè)字節(jié),而要打印的心電數(shù)據(jù)為m,將m除以8,得商k,余數(shù)為1,則此心電數(shù)據(jù)對(duì)應(yīng)點(diǎn)對(duì)數(shù)(n-k)字節(jié)的第1位。即該心電數(shù)據(jù)對(duì)應(yīng)的位置數(shù)據(jù)為第(n-k)字節(jié)(該字節(jié)的1位置1,其它位清零)。因此,打印此心電數(shù)據(jù)時(shí),該導(dǎo)聯(lián)所要傳送的32字節(jié)打印數(shù)據(jù)中只有第(n-k)字節(jié)的第1位為1,其他都為0。

與液晶顯示相類(lèi)似,對(duì)于一個(gè)導(dǎo)聯(lián)的心電信號(hào),要實(shí)現(xiàn)心電圖打印,必須將盯連兩個(gè)心電數(shù)據(jù)用線連接。即對(duì)于一條心電曲線,起始顯示數(shù)據(jù)點(diǎn)在起始列只顯示1點(diǎn);從第二個(gè)數(shù)據(jù)點(diǎn)開(kāi)始,要在下一列顯示上一數(shù)據(jù)點(diǎn)到此次數(shù)據(jù)點(diǎn)之間的線段。在熱敏打印紙上表現(xiàn)為將兩數(shù)據(jù)點(diǎn)之間的點(diǎn)都加熱,對(duì)應(yīng)于內(nèi)存則是將兩點(diǎn)之間的數(shù)據(jù)都置1。

對(duì)于—導(dǎo)聯(lián)的心電信號(hào),先讀出第一個(gè)心電數(shù)據(jù),將其轉(zhuǎn)換成32字節(jié)位置數(shù)據(jù)直接打印。從第二個(gè)心電數(shù)據(jù)開(kāi)始,除了要轉(zhuǎn)換成位置數(shù)據(jù)外,還要與上一個(gè)數(shù)據(jù)相比較,用大數(shù)對(duì)應(yīng)的位置數(shù)據(jù)減去小數(shù)對(duì)應(yīng)的,然后結(jié)果與大數(shù)的位置數(shù)據(jù)相加,結(jié)果即為此心電數(shù)據(jù)應(yīng)送打的32字節(jié)數(shù)據(jù),也即完成了與上一心電數(shù)據(jù)連線的操作。分析發(fā)現(xiàn)連線算法只影響相連兩個(gè)位置數(shù)據(jù)中非零字節(jié)之間的數(shù)據(jù),為了簡(jiǎn)化計(jì)算,只需對(duì)這些字節(jié)進(jìn)行減法操作,而不必計(jì)算所有的32個(gè)字節(jié)。對(duì)于加法,也只需將大數(shù)對(duì)應(yīng)位置數(shù)據(jù)中的非零字節(jié)進(jìn)行加法,即進(jìn)行單字節(jié)加法。

舉例說(shuō)明,對(duì)于導(dǎo)聯(lián)v6心電信號(hào),前一個(gè)數(shù)據(jù)37h,下一個(gè)數(shù)據(jù)為55h,導(dǎo)聯(lián)v6分配的打印區(qū)間為1dh~3dh,按照位置數(shù)據(jù)轉(zhuǎn)換算法,37h的位置數(shù)據(jù)為第37h字節(jié),該字節(jié)內(nèi)容為80h,其他字節(jié)都為00h;55h的位置數(shù)據(jù)為第33h字節(jié),該字節(jié)內(nèi)容為20h,其他字節(jié)為00h。由于37h〈55h,因此應(yīng)是心電數(shù)據(jù)55h的位置數(shù)據(jù)減去33h的位置數(shù)據(jù),計(jì)算如圖4所示。

2.3 縱向打印程序

縱向打印能夠?qū)崿F(xiàn)將12導(dǎo)聯(lián)數(shù)據(jù)無(wú)重疊同步顯示。這樣醫(yī)生可以參考比較同一時(shí)刻的各個(gè)波形的變化趨勢(shì),為疾病的診斷提供方便。

熱敏打印紙寬度為216mm,分辨率為8dot/mm,這樣最多能夠打印1728點(diǎn),將這些點(diǎn)與某一導(dǎo)聯(lián)連續(xù)的1728個(gè)心電數(shù)據(jù)相對(duì)應(yīng),也就是說(shuō)導(dǎo)聯(lián)順序第n個(gè)數(shù)據(jù)對(duì)應(yīng)于一線圖形中的第n個(gè)點(diǎn)。與模向打印相比縱向打印仍然要解決將離散的點(diǎn)連接起來(lái)的問(wèn)題;但與橫向順序打印方式,即打印點(diǎn)按時(shí)間順序打印相比,其難點(diǎn)在于需要將不同時(shí)刻同一幅值的多個(gè)點(diǎn)同時(shí)打印出來(lái),即打印點(diǎn)按空間順序打印。

首先定義一個(gè)內(nèi)存單元存儲(chǔ)掃描值,使其從當(dāng)前通道數(shù)據(jù)最大值變化到0,依次與通道的每一個(gè)數(shù)據(jù)進(jìn)行比較:相同則對(duì)應(yīng)點(diǎn)被描記;小則不被描記;大則需要將當(dāng)前心電數(shù)據(jù)相鄰的兩點(diǎn)與掃描值相比較,只要其中一個(gè)比掃描值大,則對(duì)應(yīng)點(diǎn)被描記,要描記的噗將其內(nèi)存對(duì)應(yīng)的數(shù)據(jù)位置1。

舉例說(shuō)明,如果打印內(nèi)存緩沖區(qū)的首字節(jié)為n,大小為216字節(jié),而當(dāng)前某一導(dǎo)聯(lián)順序第m個(gè)心電數(shù)據(jù)是v,而此時(shí)的掃描值為w:①v>w,則繼續(xù)比較第m+1個(gè)數(shù)據(jù);②v=w,則對(duì)應(yīng)點(diǎn)需要被描記;③v



關(guān)鍵詞:

評(píng)論


相關(guān)推薦

技術(shù)專(zhuān)區(qū)

關(guān)閉