無線傳輸血壓計
指導老師:蔡育秀
製作學生:醫學工程學系
溫國棟 邱大倫 葉昱甫
中原大學醫療資訊研究室
目錄:
一.
前提 P. 2
二、血壓原理及症狀 P.4
@什麼叫做血壓? P.4
@高血壓的症狀 P.4
三、比較傳統血壓計與電子式血壓計的測量方法 P.4
@傳統血壓計的測量方法 P.4
@電子式血壓計的測量方法 P.5
四、成品介紹 P.6
@系統功能與特色 P.6
@電路相關知識和原理 P.6
@系統方塊圖 P.8
@系統方塊圖動作說明 P.9
@電路圖 P.11
@程式流程圖 P.12
五、製作過程及心得 P.26
六、參考資料 P.27
一.前提
西元2000年初,行政院制訂了一項重要的法規,那就是“病歷是屬於病患所有,非醫院所屬”,這項新法規,使得個人病歷資料能夠快速的在醫院間傳送,免除許多轉診及會診所帶來的不便。
而在這項法令發佈以後,從前書面的病歷資料都將改成數位化的電子媒體來儲存,包括各項動態或靜態的生理信號資料,這也使得數位資料的取得成為一個問題。
為了取得數位資料,一些醫院都會雇用專門人員來從事轉換的工作,使得大家懷疑電子化的病歷系統是否能夠帶來真正的便利性,因此,在醫療資訊研究室裡,我們藉著這次的PIC盃單晶片大賽,以及醫院資料庫方面的專長,試著發展出這一套新產品。
藉著這套系統,能夠輕易的將量測者的精確血壓波形,輸入至後端Sever中做儲存,而這些血壓波形及數據的直接取得,都可輕易的由醫生來進行操作,不需他人幫忙,甚至,我們發展出這套無線傳輸血壓計,使得在一定的範圍內都可以進行量測,只需按下一個鍵,電子病歷就可輕鬆的存入資料庫中,方便性不在話下。
根據調查,醫院中最常進行的量測工作就是血壓量測,而最不準確的也是血壓的量測,這就是為何我們從血壓的量測著手,希望克服各種難題,製作出一個以
MiCcroChip 16F877為核心的無線傳輸血壓計。

血壓對人的影響
長期病程中,過高的血壓機械性地損傷動脈血管內膜,通透性增加,血膽固醇沉積於血管壁,引起心、腦、腎動脈發生動脈粥樣硬化。最終形成冠心病、腦動脈硬化、中風、腎固縮功能衰竭。有學者統計指出有45.4%的高血壓病人死於心血管病,腦中風比正常人高八倍。
血壓的重要性
最近美國加州Novato的Buck老化研究中心就發表了一個歷經28年的資料收集,6500人的大型研究成果,他們宣稱四項與健康長壽最重要的指標分別是:
(1)體重不過重
(2)不吸煙
(3)正常的血壓
(4)正常的血糖
由於物質生活的富裕,現代人罹患文明病的機會大幅提升,當四十歲以上的成年人,其高血壓罹患率已高達五分之一。
相對於傳統量測血壓時不僅儀器攜帶不便而且量測時亦需要專門的技術所以,我們想到用數位電子的方式,讓受測者能方便的攜帶且容易操作量測血壓值。與市售血壓計最大的不同點,在於我們設計的電子式血壓計除了能夠在LCD上顯示外,也可以經由無線即時的傳輸方式,將資料透過RS232介面傳輸,將血壓變化的情況在個人電腦的顯示器中呈現且將資料儲存,以供長期監測及生理分析用。
在下面的敘述,我們將根據血壓的原理及症狀、傳統和電子式血壓計的比較、成品的功能及特色、硬體電路及原理及軟體流程控制等作深入的介紹。
二、血壓原理及症狀
@什麼叫做血壓?
血壓,是血液流經血管壁時的壓力。由心臟出來的血液,需要有推力,才能繞行身體一周,心臟就是藉著不停的收縮、放鬆,將血液推送前進。
血壓有二種表現法
(1)收縮壓:收縮壓又叫心縮壓,是當心臟收縮把血液打到血管所測得的血壓。
(2)舒張壓:舒張壓又叫心舒壓,是心臟在不收縮所得的壓力。
根據世界衛生組織定義:
(1)收縮壓超過140毫米汞柱
(2)舒張壓超過90毫米汞柱
符合此兩個條件,就稱為高血壓。
@高血壓的症狀
大部份高血壓的病人,不一定有什麼特別的症狀,因此定期檢查血壓十分的重要。
三、比較傳統血壓計與電子式血壓計的測量方法
@傳統血壓計的測量方法
1.自備血壓計,聽診器。
2.採平躺或坐姿,將手臂置於有支托的位置,露出上臂。
3.血壓計的零點與心臟在同一水平線上,壓脈帶纏於上臂距肘關節上1吋處(約2.5公分)。
4.以食指,中指觸診肱動脈之脈動處(在肘關節內面之內側)。
5.將聽診器的膜面置於肱動脈處,關緊血壓計之充氣囊,並擠壓之,將空氣打入氣囊,此時血壓計之水銀柱會緩慢上升,約打到180mmHg左右。
6.再慢慢放氣(每秒約下降2mmHg之速度),一面注視血壓計上的讀數一面傾聽聲音,第一聲噗通聲為收縮壓,最後一聲消失音為舒張壓。
7.測量完之後記錄日期、時間及血壓值,如有懷疑可再重測一次以證實無誤。
資料來源:台北榮民總醫院測量血壓法(http://www.vghtpe.gov.tw/pat/nurs/nurste02.htm)
@電子式血壓計的測量方法
1.自備電子式血壓計。
2.採平躺或坐姿,將手臂置於有支托的位置(這樣會比較準確),不需要捲袖
子。
3.血壓計的零點與心臟在同一水平線上(這樣子會比較準確)。
4.按鍵後等待LCD顯示即可。
由以上的比較,我們可以知道電子式血壓計的方便性,它只需一台儀器,不像傳統式血壓計尚需其它相對較重且體積大的配備。
另外,一般人在量測血壓時,希望量測動作愈簡單愈好,最好可以克服技術上的問題,而電子式的血壓計做到了,它亦只需要一個按鍵的動作即可量測血壓,有別於傳統血壓繁雜且需要技術的動作,所以它對大眾的適用性較高。
最後我們再來看量測的時間,以我們所做的電子式血壓計測量時間大約只需要30秒左右(正常情形下量測),所以它在量測時間也是符合省時的需要,對於一般忙錄生活的人也都非常的適合。

四、成品介紹
@系統功能與特色
我們製作的數位電子血壓計,它的特色分述如下:
1. 精確的血壓波形資料傳送至PC端資料庫,給予醫生更正確的會診資料。
2. 個人血壓資料數位化,方便未來電子病歷的發展。
3. 無線操作提升便利性。
4. 特殊防震程式設計,避免人為或天然的外力,增加正確性。
5. 遇到特殊錯誤量測情況 (Ex:血壓計未綁好),會在LCD及PC端顯示發生錯誤之可能原因,供使用者及醫師參考。
6. 腕上型血壓計較臂型血壓計更方便、快速。
7. 可隨身攜帶,適用於辦公室或交通路途中。
8. 測量時間短,正常情況下約30秒。
9. 由於16f877內嵌式A/D converter及USART傳送機制,因此不需加掛其他周 邊,更省電,更有效率。

@電路相關知識和原理
何謂血壓?
我們可以知道若是一條河流原本是暢通無阻的,但若強行將它塞住,則當壓力過大的時候,水壓的力量將足以衝破這些阻力,以維持流動。血壓的概念就是血液流經血管壁時的壓力。由心臟出來的血液,需要有推力,才能繞行身體一周,心臟就是藉著不停的收縮、放鬆,將血液推送前進。
如何將血壓轉換成電壓?
知道了血壓計的原理之後,我們選購壓力感測器,主要的目的是想要將血壓這個物理量轉換成電壓的訊號,它的工作原理是透過pump的充氣、漏氣來調整氣體的壓力。因為壓力讓壓力感測器內部的材料發生形變,在經過惠司同電橋後反應出相對的電壓差,反過來我們也可以從其電壓的變化知道當時的壓力。
什麼是我們要的訊號?
當我們腕帶的壓力等於血壓時,血液開始可以流通而產生所謂的cuff聲,這時候也就是收縮壓,我們必須開始從這裡做紀錄,直到最後當cuff聲沒有的時候,此點即為舒張壓。
如何取得收縮壓與舒張壓的訊號?
當壓力感測器經由我們線性充放氣的控制時會有直流的電壓變化,我們若將壓力感測器得來的訊號做一定比例的放大,可發現壓力在收縮壓與舒張壓之間的時候,我們可以由示波器上看到會另有交流的訊號。此時我們將訊號分為二處其一經高通濾波器,所以當收縮壓與舒張壓發生的時候,相對交流訊號也發生,那麼相對應另一經由低通濾波器的訊號(也就是當時的壓力),這樣就可以得知此人的收縮壓及舒張壓了。
如何將訊號表達?
我們將獲得的血壓訊號經由A/D Converter的轉換,再將其轉換後的資料顯示在LCD及monitor上。
@系統方塊圖

◎系統方塊圖動作說明:
1. 人體血壓訊號經由壓力感測器及儀表放大後進入系統,所得波形如下圖。
2. 此訊號在經過0.8Hz二階高通濾波後,去除DC準位值,避免在血管脈動訊號放大時,放大器進入飽和區,所得波形如下圖。
3. 訊號經過150~200倍非反向放大,成為血壓脈動波形,在經過38Hz 二階低通濾波後,去除電源及皮膚與臂帶摩擦的高頻雜訊,並將此訊號維持在0~5Volt之間,以供PIC16F877擷取,所得波形如下圖。
4. 將得到之血壓脈動波形配合LM311脈波成形電路輸入pic16f877 RB2的CCP1進行A/D觸發工作
5. 訊號經由A/D進入PIC16F877 中(以VCC/2做為DC準位值;血壓波形則是使用A/D兩個channel做另外的資料轉換)
6. 訊號在PIC16F877內做訊號處理,及自動控制(控制pump開關及閉氣閥動作)。
7. 放大器所產生的震盪血壓如下圖,先找出最大振幅值Amax,在往前找0.5Amax的值即為收縮壓,往後找0.8Amax的值為舒張壓,將上述兩點與DC電壓做對照,在DC電壓值所對應之伏特數經過換算,則為收縮壓及舒張壓的值,如下圖所示。

8. 運算出來之數據先經由非同步USART及無線傳輸機制傳送至PC端。
9. PC端做即時單向接收,並且在VB上show出波形圖,此資料儲存至虛擬的醫院資料庫中。
10. 在所有訊號擷取及運算完畢後,將收縮壓與舒張壓顯示在LCD monitor 上。

@電路圖

@程式流程圖
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Hemadynamometer
with wireless connect to PC ~
; ~
;~~~~~~~~~~~~~~~~~~~~~~~~~~By
Talun, Jelly, Ijb~~~~~~~~~~~~~~~~~~~~~~~~
#include
p16f877.inc
LIST
P=16F877
W_STK EQU 0X20
STATUS_STK EQU 0X21
PCLATH_STK EQU 0X22
DELAYCNT0 EQU 0X23
DELAYCNT1 EQU 0X24
DELAYCNT2 EQU 0X25
SWITCH1 EQU 0X26
OLDDATA EQU 0X27
CNT EQU 0X28 ;use
for 40 times check if repump or not
CNT0 EQU 0X29 ;use
to check how long with "no signal event"
CNT1 EQU 0X2A ;use
for count the MAXVAL address..
CNT2 EQU 0X2B
CALCUCNT EQU 0X2C
OLDVAL EQU 0X2D
MAXVAL EQU 0X2E
AD0VAL EQU 0X2F
MAX EQU 0X30
OLDMAX EQU 0X31
CNTREC EQU 0X32
SWITCH2 EQU 0X33
CNT3 EQU 0X34
#DEFINE _UV_ADDR1 0X40
#DEFINE _UV_ADDR2 0XA0
ORG 0X00
NOP
GOTO START
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; INTERRUPT
ROUTINE START AT HERE
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ORG 0X04
MOVWF W_STK
MOVF STATUS,W
CLRF STATUS
MOVWF STATUS_STK
MOVF PCLATH,W
MOVWF PCLATH_STK
CLRF PCLATH
;---------<<CAPTURE>>------------
BTFSC PIR1,CCP1IF ;use CCP1 to capture AD3
GOTO CCP1_ISR
;---------<<TMR0>>------------
BTFSC INTCON,T0IF
GOTO TMR0_ISR
;---------<<AD>>------------
BTFSC PIR1,ADIF
GOTO AD_ISR
ISR_END: ;give
all value return after interrupt.
BCF STATUS,RP0
MOVF PCLATH_STK,W
MOVWF PCLATH
MOVF STATUS_STK,W
MOVWF STATUS
MOVF W_STK,W
RETFIE
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Program start at here
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
START:
CLRF INTCON
CALL PIC_INIT1
START1:
BTFSS PORTB,0
GOTO START2 ;if
touch the switch,go start..
GOTO START1 ;if
no touch the switch,go loop..
START2:
BSF PORTB,3 ;STOP
AIR OUT..
CALL LDELAY
CALL LDELAY
GOTO AD1
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Program Initialize(include PORT,USART,A/D)
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PIC_INIT1:
CLRF INTCON ;Turn
off all interrupt
BSF STATUS,RP0 ;choose BANK1
;----------------SET
UP TMR0 PRESCALER AND RB0 INTERRUPT------------------~
MOVLW B'11000010'
MOVWF OPTION_REG ;1:8 PRE0SCAL0ER
;------------------0............................0000000000000-------------------------------------------
MOVLW B'11111111'
MOVWF TRISA
MOVLW B'00000011' ;portB 0,1 for Buttom & 2,3,4 for output pump
and
;beeper..
MOVWF TRISB
MOVLW B'00000100' ;portC 2 for CCP1 & 3,4,5,for LCD control
& 6 for
;TX
MOVWF TRISC
MOVLW B'00000000' ;
MOVWF TRISD ;portD
for LCD
MOVLW B'00000000' ;choice A/D's Vref/2
MOVWF ADCON1
;-----------------------SET
UP RS232 TRANSPORTATION-------------------------------
MOVLW .31
MOVWF SPBRG ;9600bps @20Mhz ,Async ,BRGH=0
MOVLW B'00100000'
MOVWF TXSTA ;8
Bit, Async Mode, Enable
;---------------------------------------------------------------------------------
BCF STATUS,RP0 ;choose
Bank0
MOVLW B'00000011'
MOVWF PORTB ;set
portB initial value
BCF PORTC,6 ;set
port C TX
MOVLW B'00000000' ;set port D initial low
MOVWF PORTD
MOVLW B'11111111' ;Count 90 times that there have siganl or not
MOVWF CNT ;
(normal is no
signal at beginning)
MOVLW B'00000011' ;4 points to count repump event..
MOVWF CNT0 ;
MOVLW B'11111111' ;256 points ..
MOVWF CNT3
MOVLW B'01000001' ;choice A/D channel 0 ,Fosc/8(FAST AD)
MOVWF ADCON0
CLRF CNT2 ;use
to remember data address
CLRF SWITCH1 ;use
to know that if A/D end or not..
CLRF SWITCH2
CLRF OLDVAL ;use
to calculate old data-new data
CLRF MAX
CLRF OLDMAX
CLRF OLDDATA
CLRF CALCUCNT
RETURN
;#######################################
; START PUMP
AND DETECT DC VALUE
;#######################################
AD1:
BSF ADCON0,GO ;triger
CH0's A/D to go go go ...
BSF PORTB,2 ;start
Air pump
CALL DELAY
MOVF ADRESH,W ;put the A/D value to
the DCVAL register
ADDLW B'00110011'
BTFSS STATUS,0
GOTO AD1 ;continue
pumping..
BCF PORTB,2
BCF PORTB,2
MOVLW B'01001001' ;choice A/D channel 1 ,Fosc/8(FAST AD)
MOVWF ADCON0
GOTO AD2
;#######################################
; A/D1
INITIAL VALUE DETECT
;#######################################
AD2:
MOVLW B'01010101'
MOVWF PORTC
NOP ;in
case that the shock wave of pump mechine
BSF ADCON0,GO
CALL SMDELAY ;about 1 second with
33 points..(512uS)
GOTO AD22
AD22:
BTFSC ADCON0,GO
CALL
ADLOOP
MOVF ADRESH,W
ADDLW B'00000001' ;prevent that the signal is noise from other
factor..
BTFSC STATUS,0 ;if the
signal is noise from other factor,go back and
;detect again
GOTO AD2CNT
MOVF ADRESH,W
SUBLW B'01010000' ;make the threshold is about 1.56 Volt
BTFSS STATUS,0 ;if the
value NOT over 1.56 volt,go check 60
;points..
GOTO AD2_1 ;the
value is over 1.56...go repump routine
GOTO AD2_2
ADLOOP:
NOP
GOTO
AD22
AD2CNT:
MOVLW B'11111111' ;90 POINTS
MOVWF CNT
DECFSZ CNT3
GOTO AD2
GOTO PERROR3
;#######################################
; repump
again routine
;#######################################
AD2_1:
MOVLW B'00001111'
MOVWF PORTC
BSF PORTB,2
CALL LDELAY
CALL LDELAY
CALL LDELAY
CALL LDELAY
CALL LDELAY
BCF PORTB,2
CALL LDELAY
CALL LDELAY
CALL LDELAY
CALL LDELAY
DECFSZ CNT0 ;after
4 times repump.. go print error
GOTO AD2
GOTO PERROR1
;#######################################
; 4 SECONDS
DOWN COUNT..
;#######################################
AD2_2:
DECFSZ CNT ;to
count if there are over 256 points to wait..
GOTO AD2
BSF STATUS,RP0 ;Choose
bank1
BSF INTCON,T0IE ;TMR0
Interrupt
BSF PIE1,CCP1IE ;Capture
Interrupt
BSF PIE1,ADIE ;AD
Interrupt
BCF STATUS,RP0 ;Choose
bank0
MOVLW B'00000100' ;Capture Mode,Falling Edge
MOVWF CCP1CON
BSF INTCON,PEIE ;enable
peripheral interrupt..
BSF INTCON,GIE ;enable
golbal interrupt
GOTO MAINLOOP
MAINLOOP:
MOVLW B'11111111'
MOVWF PORTC
NOP
MOVF SWITCH1,W
ADDLW B'11111000'
BTFSC STATUS,0 ;if switch
turn on,go Calculate the data..
GOTO CALCU ;the
value is all set..waiting for calculate..
MOVF SWITCH2,W ;AN ERROR OCCUR..
ADDLW B'11110000'
BTFSC STATUS,0
GOTO PERROR2
GOTO MAINLOOP
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; DATA
CALCULATION AT THIS ROUTINE ~
; ~
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CALCU:
CLRF INTCON ;close
all interrupt function..
MOVLW B'10101010'
MOVWF PORTC
BCF PORTB,3 ;Let
all air out..
MOVF MAX,W
MOVWF OLDMAX
MOVF CNT1,W ;final
counter's value is in CNT1
SUBWF CNT2,W ;CNT2-CNT1,the
initial is always 0
BTFSC STATUS,0 ;test if
CNT1=CNT2 or not,initial always 0..
GOTO CALCU2 ;the
max max value is know, so go next calculate
MOVLW _UV_ADDR1
ADDWF CNT2,W
MOVWF FSR
MOVF INDF,W
SUBWF OLDMAX,F ;old data-new data
BTFSC STATUS,0 ;the
initial value is always 0
GOTO CALCU_1 ;when new
data>old data,must refresh the old
;data.
INCF CNT2
GOTO CALCU
CALCU_1: ;refresh
the old data
MOVWF OLDMAX
MOVWF MAX
MOVF CNT2,W
MOVWF CNTREC ;the
address which it's value is biggest
INCF CNT2
GOTO CALCU
CALCU2:
RRF MAX,F ;MAX
value / 2
CALCU2_1:
MOVLW _UV_ADDR1
ADDWF CALCUCNT,W
MOVWF FSR
MOVF INDF,W
SUBWF MAX,W ;old
data-new data
BTFSS STATUS,0 ;the
initial value is always 1
GOTO CALCU2_2 ;when new data>old
data,go next calculate...
INCF CALCUCNT
GOTO CALCU2_1
CALCU2_2:
MOVLW _UV_ADDR2
ADDWF CALCUCNT,W
BSF STATUS,RP0 ;choose
Bank1
MOVWF FSR
MOVF INDF,W
BCF STATUS,RP0 ;Choose
Bank0
MOVWF PORTC ;
!!!! print out this value with contraction
;pressure !!!!
GOTO CALCU3
CALCU3:
RRF OLDMAX,W
MOVWF MAX
RRF MAX,F
ADDWF MAX,F ;MAX*0.8
store in MAX
CALCU3_1:
MOVLW _UV_ADDR1
ADDWF CNTREC,W
MOVWF FSR
MOVF INDF,W
SUBWF MAX,W
BTFSC STATUS,0 ;the
initial value is always 0
GOTO CALCU3_2
INCF CNTREC
GOTO CALCU3_1
CALCU3_2:
MOVLW _UV_ADDR2
ADDWF CNTREC,W
BSF STATUS,RP0 ;Choose
Bank1
MOVWF FSR
MOVF INDF,W
BCF STATUS,RP0 ;Choose
Bank0
MOVWF PORTC ;
!!!! PRINT OUT THIS VALUE WITH
;DIASTOLIC PRESSURE !!!!
GOTO CALCU3_2 ;THE END OF THIS
PROGRAM..
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; ALL
INTERRUPT SUB ROUTINE PLACE AT HERE
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;===============TMR0
ISR===================
TMR0_ISR:
BCF INTCON,T0IF ;Clear
Interrupt Flag
BSF ADCON0,GO
GOTO ISR_END
;===============CCP1
ISR===================
CCP1_ISR:
BCF PIR1,CCP1IF
BSF PORTB,4
CLRF TMR0
MOVF MAXVAL,W
ADDLW B'00000010' ;if the value is over,4.9Volt...
BTFSC STATUS,0 ;go Full
routine and cover data from old data
CALL FULL_ERR
MOVF AD0VAL,W
ADDLW B'11110000' ;if the AD0VAL<1 Volt,go to CALCU(turn on the
switch)
BTFSS STATUS,0
BSF SWITCH1,7 ;use
to control the end of the measurement
MOVLW _UV_ADDR1 ;record
AD1's data in BANK0 40h~
ADDWF CNT1,W
MOVWF FSR
MOVF MAXVAL,W
MOVWF INDF
MOVWF OLDDATA
MOVLW _UV_ADDR2 ;record
AD0's data in BANK1 A0h~
ADDWF CNT1,W
BSF STATUS,RP0
MOVWF FSR
BCF STATUS,RP0
MOVF AD0VAL,W
MOVWF INDF
INCF CNT1,F
CLRF OLDVAL ;because
every capture have different MAXVAL.
CLRF MAXVAL
BCF PORTB,4
BSF ADCON0,GO
GOTO ISR_END
;===============AD
ISR====================
AD_ISR:
BCF PIR1,ADIF
MOVF MAXVAL,W ;use to rebuilt the MAXVAL !! no
false !!
MOVWF OLDVAL
MOVF ADRESH,W
ADDWF 00000010 ;if
the value is over,4.9Volt...
BTFSC STATUS,0 ;means that
this value is fault...
GOTO ISR_END ;so
don't record this data..
MOVF ADRESH,W
SUBWF OLDVAL,F ;old data - new data
BTFSC STATUS,0
GOTO ISR_END ;If
new data is smaller than old data,don't
;record this value
MOVWF MAXVAL ;If
new data is bigger than old data,save it to
;MAXVAL
MOVWF OLDVAL
CALL AD_0 ;record
the AD0's value in the same time.
GOTO ISR_END
AD_0: ;if
there are change in MAXVAL,record AD0's value
MOVLW B'01000001' ;choice A/D channel 0 ,Fosc/8
MOVWF ADCON0
BSF ADCON0,GO
MOVF ADRESH,W
MOVWF AD0VAL
MOVLW B'01001001' ;choice A/D channel 1 ,Fosc/8
MOVWF ADCON0
RETURN
FULL_ERR:
MOVF OLDDATA,W
MOVWF MAXVAL
RETURN
;#######################################
; ALL ERROR PRINT OUT ROUTINE IS HERE
;#######################################
PERROR1:
MOVLW B'11001100'
MOVWF PORTC
GOTO PERROR1
PERROR2: ;use
to prevent there are no signal very long time..
MOVLW B'00110011'
MOVWF PORTC
GOTO PERROR2
PERROR3: ;use
to prevent there are no signal very long time..
MOVLW B'11001100'
MOVWF PORTC
GOTO PERROR3
;#######################################
; ALL KINDS
OF DELAY ROUTINE
;#######################################
DELAY:
MOVLW 0XFF
MOVWF DELAYCNT0
MOVWF DELAYCNT1
DELAY0:
DECFSZ DELAYCNT0,F
GOTO DELAY0
DECFSZ DELAYCNT1,F
GOTO DELAY0
RETURN
SMDELAY:
MOVLW 0XFF
MOVWF DELAYCNT0
MOVLW 0X50
MOVWF DELAYCNT1
SMDELAY0:
DECFSZ DELAYCNT0,F
GOTO SMDELAY0
DECFSZ DELAYCNT1,F
GOTO SMDELAY0
RETURN
LDELAY:
MOVLW 0XFF
MOVWF DELAYCNT0
MOVWF DELAYCNT1
MOVLW 0X7
MOVWF DELAYCNT2
LDELAY0:
DECFSZ DELAYCNT0,F
GOTO LDELAY0
DECFSZ DELAYCNT1,F
GOTO LDELAY0
DECFSZ DELAYCNT2,F
GOTO LDELAY0
RETURN
END
;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;上述只是程式中的一部分,另外還有RS232的控制部份、發射器的控制、LCD
;的錯誤顯示、防震以及自我記憶的功能,尚在改進中,故在此不予列出。
;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
五、製作過程及心得
今年四月,在研究室的公告欄上看到microchip公司寄來的單晶片比賽宣傳單,感到十分有興趣,因為藉由它,我們我們可以試著將PIC單晶片與人體生理訊號的量測做結合。
而根據調查,醫院中最常進行的量測工作就是血壓量測,最不準確的也是血壓量測,這就是為何我們從血壓的量測著手,希望能克服各種難題,製作出一個以 MiCcroChip 16F877為核心的無線傳輸血壓計,甚至,在電子病歷的時代來臨前,發展出出一套有模範性質的個人病歷擷取系統,其功能決非一般市售電子血壓計所能比擬。
對於這次參賽所遇到的困難很多。首先是對於壓力感測器的選擇,因為不好的感測器對於量測到的訊息無法做到良好的表達,且溫度、濕度都有可能會影響其工作品質,在經過一段時間找尋與測試後,我們選擇了SCC05DG2的感測器,不僅符合我們所要量測的壓力範圍,而且對於線性和誤差要求也不錯,最重要的,他的價錢符合我們的預算。
在生理訊號方面,因為經由人體所取得的訊號變數往往很大,所以如果沒有好的前端做訊號處理,之後輸入單晶片內的訊號正確率也會大打折扣,自然得到的結果就會與預期有段落差,因此在前端的高通、低通與放大中,我們不但測試了各種不同的形式的濾波器、放大器、甚至各種牌子及型號的操作放大器來相互搭配(741系列、TML3616smd系列、LM324、TL074),在做出比較後,才選定使用二階巴夫沃滋濾波器搭配TML3616 & LM324作為濾波及放大的部分,如此不但可以在電池提供的5Volt下穩定工作,同時也能得到最理想的波形輸出。
在完成了標準硬體的架設後,我們開始正式在MPLAB-ICD simulator上發展程式,程式中包括了一般市售電子血壓計所包含的功能,還加入了一些市售血壓計所沒有的判斷程式,靠著這些子程式,我們可以清楚的分離雜訊與原始的訊號,讓量測的結果能夠更正確,譬如我們發現,人為所產生的一些碰撞,再放大後往往會蓋過生理訊號,這些Noise在放大後都會呈現5Volt
,因此我們將生理訊號的範圍調整在0~4.5Volt間,如果程式發現訊號大於4.5volt,就判定這是Noise,而此次所擷取的值由上次的遞補,這個小機制讓正確率提升許多,另外在USART傳送機制方面,為了配合一般1024X1280的電腦螢幕,我們一秒鐘所丟的值不能太多或太少,太多則螢幕無法全部顯現,太少則訊號無法忠實呈現(根據Nyquist
equation,取樣率要大於訊號頻率之兩倍方能完整呈現),因此校正與測試後發現,一秒鐘丟出約20點訊號,符合了上述要求。
在程式撰寫工作完成後,我們開始實際繞線來架構全部的硬體,並將程式燒錄好的Pic16F877安裝在此版上,卻赫然發現,原本在ICD上的電路經過移植後卻不能完整的工作,有時跑跑就停了,有時甚至開始不了,這個問題困擾我們許久,畢竟與醫療相關的儀器最忌諱的就是”干擾”的問題,如果這個問題解決不了,這項產品價值可說是大打折扣,因此在詢問了熱心的興華公司工程師後,我們著手進行一連串的實驗來改進干擾的問題,包括了捨棄繞線版、使用Protel來Layout整個電路、將空腳位接地….等,值到截稿,這項工作仍然持續再進行,希望6月24日能呈現最完美的一面。
以上這些工作讓我們深刻的瞭解到分工的重要,沒有大家的分工合作,是不可能在短短的兩個月內實現這個共同的夢想,這也是此次參加pic單晶片大賽所學到最寶貴的經驗。
六、參考資料:
RS-232C介面技術應用 白中和編譯
PIC16F87X快速上手 何信能李雪銀編譯
PIC16C7X入門與應用範例 何信能李雪銀編譯
PIC16X84入門與實作 鄧錦城編著
MPLAB IDE,
SIMULATOR, EDITOR USER’S GUIDE
MICROCHIP
PIC16F87X DATA SHEET
MPLAB ICD USER
GUIDE
pulse dynamics
dynapulse by Pulse Metric .Inc
醫測儀表
INTRODUCTION TO
BIOMEDICAL EQUIPMENT TECHNOLOGY
感測器應用技術
游金湖 編譯
感測器
陳瑞和 編譯 全華書局
SCC05DG2
擎岡實業有限公司 提供