cpubbs论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

LabVIEW+单片机学习套件全套教程资料下载[免费]LabVIEW论坛精华列表贴USB0816数据采集卡《LabVIEW宝典》
LabWindows/CVI论坛精华贴NET0816以太网数据采集卡RC0210远程设备授权系统 关闭关停锁定打开设备 户外分布式数据采集
NET1624低速高精度以太网数据采集卡WIFI0824SD无线WIFI网络数据采集卡脱机运行 SD存储 小尺寸微型 串口采集远程采集 安卓 手持移动采集 纪录仪
查看: 2472|回复: 9

無線傳輸血壓計,附程序源码[转贴]

[复制链接]
发表于 2009-2-2 18:58:34 | 显示全部楼层 |阅读模式
原贴地址:http://www.cycu.edu.tw/~mil/muscle/final.htm

無線傳輸血壓計
A Wireless Blood Pressure Monitor
指導老師:蔡育秀

製作學生:醫學工程學系
溫國棟
邱大倫
葉昱甫

中原大學醫療資訊研究室





目錄:                        

一.
前提
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%的高血壓病人死於心血管病,腦中風比正常人高八倍。

血壓的重要性
最近美國加州NovatoBuck老化研究中心就發表了一個歷經28年的資料收集,6500人的大型研究成果,他們宣稱四項與健康長壽最重要的指標分別是:
(1)體重不過重
(2)不吸煙
(3)正常的血壓
(4)正常的血糖
由於物質生活的富裕,現代人罹患文明病的機會大幅提升,當四十歲以上的成年人,其高血壓罹患率已高達五分之一。
相對於傳統量測血壓時不僅儀器攜帶不便而且量測時亦需要專門的技術所以,我們想到用數位電子的方式,讓受測者能方便的攜帶且容易操作量測血壓值。與市售血壓計最大的不同點,在於我們設計的電子式血壓計除了能夠在LCD上顯示外,也可以經由無線即時的傳輸方式,將資料透過RS232介面傳輸,將血壓變化的情況在個人電腦的顯示器中呈現且將資料儲存,以供長期監測及生理分析用。
在下面的敘述,我們將根據血壓的原理及症狀、傳統和電子式血壓計的比較、成品的功能及特色、硬體電路及原理及軟體流程控制等作深入的介紹。
 楼主| 发表于 2009-2-2 18:58:54 | 显示全部楼层
本帖最后由 cpubbs 于 2009-2-2 19:12 编辑

二、血壓原理及症狀
@什麼叫做血壓?
血壓,是血液流經血管壁時的壓力。由心臟出來的血液,需要有推力,才能繞行身體一周,心臟就是藉著不停的收縮、放鬆,將血液推送前進。
血壓有二種表現法
(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秒左右(正常情形下量測),所以它在量測時間也是符合省時的需要,對於一般忙錄生活的人也都非常的適合。







 楼主| 发表于 2009-2-2 19:13:42 | 显示全部楼层
四、成品介紹
@系統功能與特色
我們製作的數位電子血壓計,它的特色分述如下:

1.
精確的血壓波形資料傳送至PC端資料庫,給予醫生更正確的會診資料。

2.
個人血壓資料數位化,方便未來電子病歷的發展。

3.
無線操作提升便利性。

4.
特殊防震程式設計,避免人為或天然的外力,增加正確性。

5.
遇到特殊錯誤量測情況 (Ex:血壓計未綁好),會在LCDPC顯示發生錯誤之可能原因,供使用者及醫師參考。

6.
腕上型血壓計較臂型血壓計更方便、快速。

7.
可隨身攜帶,適用於辦公室或交通路途中。

8.
測量時間短,正常情況下約30秒。

9. 由於16f877內嵌式A/D converterUSART傳送機制,因此不需加掛其他周

邊,更省電,更有效率。


@電路相關知識和原理
何謂血壓?
我們可以知道若是一條河流原本是暢通無阻的,但若強行將它塞住,則當壓力過大的時候,水壓的力量將足以衝破這些阻力,以維持流動。血壓的概念就是血液流經血管壁時的壓力。由心臟出來的血液,需要有推力,才能繞行身體一周,心臟就是藉著不停的收縮、放鬆,將血液推送前進。

如何將血壓轉換成電壓?
知道了血壓計的原理之後,我們選購壓力感測器,主要的目的是想要將血壓這個物理量轉換成電壓的訊號,它的工作原理是透過pump的充氣、漏氣來調整氣體的壓力。因為壓力讓壓力感測器內部的材料發生形變,在經過惠司同電橋後反應出相對的電壓差,反過來我們也可以從其電壓的變化知道當時的壓力。

什麼是我們要的訊號?
當我們腕帶的壓力等於血壓時,血液開始可以流通而產生所謂的cuff聲,這時候也就是收縮壓,我們必須開始從這裡做紀錄,直到最後當cuff聲沒有的時候,此點即為舒張壓。

如何取得收縮壓與舒張壓的訊號?
當壓力感測器經由我們線性充放氣的控制時會有直流的電壓變化,我們若將壓力感測器得來的訊號做一定比例的放大,可發現壓力在收縮壓與舒張壓之間的時候,我們可以由示波器上看到會另有交流的訊號。此時我們將訊號分為二處其一經高通濾波器,所以當收縮壓與舒張壓發生的時候,相對交流訊號也發生,那麼相對應另一經由低通濾波器的訊號(也就是當時的壓力),這樣就可以得知此人的收縮壓及舒張壓了。

如何將訊號表達?
我們將獲得的血壓訊號經由A/D Converter的轉換,再將其轉換後的資料顯示在LCDmonitor上。








@系統方塊圖


人 體
訊號源

pump

壓力
感測器

LCD
輸出

系統晶片
PIC 16F877

儀錶放大器

高通濾波器 (0.8Hz)

非反相放大器(150~200)

低通濾波器(38Hz)

史密特觸發器

RS-232介面

無線發射器

RS232介面

VB
應用程式

臨床
資料庫

顯示器

無線接收器

AD0


AD1

CCP1

TX






























START


 楼主| 发表于 2009-2-2 19:14:32 | 显示全部楼层
◎系統方塊圖動作說明:

1.
人體血壓訊號經由壓力感測器及儀表放大後進入系統,所得波形如下圖。






2.
此訊號在經過0.8Hz二階高通濾波後,去除DC準位值,避免在血管脈動訊號放大時,放大器進入飽和區,所得波形如下圖。






3.
訊號經過150~200倍非反向放大,成為血壓脈動波形,在經過38Hz 二階低通濾波後,去除電源及皮膚與臂帶摩擦的高頻雜訊,並將此訊號維持在0~5Volt之間,以供PIC16F877擷取,所得波形如下圖。






4.
將得到之血壓脈動波形配合LM311脈波成形電路輸入pic16f877
RB2CCP1進行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端做即時單向接收,並且在VBshow出波形圖,此資料儲存至虛擬的醫院資料庫中。

10.
在所有訊號擷取及運算完畢後,將收縮壓與舒張壓顯示在LCD monitor 上。




 楼主| 发表于 2009-2-2 19:15:04 | 显示全部楼层





@程式流程圖
NO

YES

START

1.
PIC16F877的暫存器、中斷、變數、週邊及輸出入埠的初始化
2.
LCD的初始化

是否按下RB0鍵?

NO

對小型幫浦充氣、關掉止氣閥,並偵測血壓DC值是否大於4伏特?

是否大於4伏特?

NO

YES

偵測血壓AC值是否介於1.57伏特和4.9伏特之間。超過4.9伏特可能是震動所引起的,而小於1.57伏特代表加壓不足,需再加壓


介於1.574.9伏特之間?

加壓或忽略此值

YES

利用CCP1的觸發來擷取A/D Channel1的血壓交流訊號,並儲存在暫存器內

將血壓值即時顯示在LCD(每秒約1~2)monitor(每秒約30個點,並儲存在硬碟內。

開始放氣,並記錄相關資料,放氣完畢後,計算出收縮壓和舒張壓

將受測者的收縮壓、舒張壓和脈搏數顯示在LCDmonitor

END

 楼主| 发表于 2009-2-2 19:15:25 | 显示全部楼层
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;
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

 楼主| 发表于 2009-2-2 19:15:42 | 显示全部楼层
;#######################################

;       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
 楼主| 发表于 2009-2-2 19:15:50 | 显示全部楼层
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
 楼主| 发表于 2009-2-2 19:16:18 | 显示全部楼层
;===============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

;的錯誤顯示、防震以及自我記憶的功能,尚在改進中,故在此不予列出。

;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 楼主| 发表于 2009-2-2 19:16:24 | 显示全部楼层
五、製作過程及心得

今年四月,在研究室的公告欄上看到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                  擎岡實業有限公司 提供
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|cpubbs论坛. ( 粤ICP备09171248号 )

GMT+8, 2025-4-5 09:51 , Processed in 0.717022 second(s), 6 queries , Gzip On, File On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表