基于DS18B20的自動(dòng)調(diào)溫醫(yī)用光療系統(tǒng)的設(shè)計(jì)
1 引言
本文引用地址:http://butianyuan.cn/article/199144.htm自動(dòng)調(diào)溫光療系統(tǒng)是一種醫(yī)用理療儀器,其原理是采用單片機(jī)對(duì)可控硅的控制來(lái)控制高壓下的激光輸出器進(jìn)行理療,在激光輸出器工作的同時(shí)對(duì)其進(jìn)行實(shí)時(shí)溫度檢測(cè),利用檢測(cè)到的溫度狀況決定可控硅的導(dǎo)通狀態(tài),達(dá)到改變激光輸出器輸出功率的目的,得到最佳的療效。
根據(jù)上述特點(diǎn),本文選擇了單總線數(shù)字溫度傳感器DS18B20進(jìn)行溫度采集,介紹了使用DS18B20的程序代碼。為了使可控硅的輸出功率連續(xù)均勻變化,本文設(shè)計(jì)了一種利用外部中斷和定時(shí)器中斷實(shí)現(xiàn)可控硅移相觸發(fā)的編程方法,滿足治療光的強(qiáng)度均勻靈敏變化的需要。
2 調(diào)溫光療系統(tǒng)介紹
2.1系統(tǒng)結(jié)構(gòu)介紹
本系統(tǒng)由5部分組成:CUP處理單元,鍵盤(pán)輸入單元,LCD顯示單元,測(cè)量溫度單元,可控硅控制激光器輸出單元。
CUP處理單元運(yùn)行系統(tǒng)程序調(diào)度所有任務(wù),鍵盤(pán)用于輸入系統(tǒng)設(shè)定參數(shù)及控制狀態(tài)模式選擇,LCD為系統(tǒng)提供了良好的操作界面,測(cè)量溫度單元負(fù)責(zé)對(duì)激光輸出器的溫度進(jìn)行實(shí)時(shí)檢測(cè),可控硅控制輸出單元針對(duì)設(shè)定參數(shù)及檢測(cè)到的溫度來(lái)控制激光輸出器的輸出。本文將詳細(xì)介紹測(cè)量溫度單元和可控硅控制單元的軟硬件設(shè)計(jì)。
2.2 系統(tǒng)程序流程介紹
本醫(yī)療系統(tǒng)的程序流程為:系統(tǒng)首先數(shù)據(jù)進(jìn)行初始化,這里的初始化主要包括定時(shí)器和外部中斷的設(shè)置,初始化完成后開(kāi)外部中斷,然后系統(tǒng)進(jìn)行溫度采集,根據(jù)采集的溫度及系統(tǒng)的設(shè)置參數(shù)來(lái)決定定時(shí)器定時(shí)參數(shù),該定時(shí)參數(shù)直接決定移相觸發(fā)可控硅時(shí)導(dǎo)通角的大小。接著系統(tǒng)再進(jìn)行溫度采集,選擇定時(shí)器定時(shí)時(shí)間參數(shù),依次循環(huán)下去。
在系統(tǒng)循環(huán)工作過(guò)程中,人工可以通過(guò)按鍵改變系統(tǒng)的各種工作參數(shù),工作參數(shù)直接影響控制可控硅導(dǎo)通角的定時(shí)器參數(shù)的選擇。系統(tǒng)的主流程框圖如圖1(a)所示意。當(dāng)系統(tǒng)循環(huán)執(zhí)行時(shí),外部過(guò)零脈沖信號(hào)會(huì)使系統(tǒng)進(jìn)入外部中斷服務(wù)程序,進(jìn)而控制可控硅的的導(dǎo)通。
圖1:系統(tǒng)程序流程圖
3 測(cè)量溫度單元介紹
熱電偶或鉑電阻,需放大電路和A/D轉(zhuǎn)換實(shí)現(xiàn)溫度信號(hào)采集。為簡(jiǎn)化系統(tǒng)硬件設(shè)計(jì),選用了DALLAS公司生產(chǎn)的單總線數(shù)字溫度傳感器DS18B20。
DS18B20提供的“一線”總線接口只需一個(gè)端口進(jìn)行通訊;測(cè)溫范圍為-55~+125℃,在-10~+85℃的范圍內(nèi),精度為±0.5℃;溫度以9~12位數(shù)字量讀出,分辨率為0.0625℃,該精度滿足本醫(yī)用光療系統(tǒng)的要求;同時(shí)DS18B20采用超小型的μSOP封裝,體積很小,可以直接敷貼在激光器的前端。由于DS18B20提供的“一線”總線接口只需一個(gè)端口與CPU通訊,因此在硬件上,利用單片機(jī)AT89C52的一個(gè)端口P2.0與DS18B20的DQ引腳相連。
3.1 DS18B20工作原理及程序
在對(duì)DS18B20進(jìn)行讀寫(xiě)操作之前,CPU首先發(fā)出一個(gè)復(fù)位脈沖,最小脈沖寬度為480μs的低電平信號(hào);然后CPU釋放單總線,使之處于接收狀態(tài)。單總線經(jīng)過(guò)上拉電阻被拉至高電平。當(dāng)DS18B20檢測(cè)測(cè)到I/0端的上升沿時(shí),就等待15—60μs,再向主CPU發(fā)出應(yīng)答脈沖(60一240μs的低電平信號(hào))。初始化子程序?yàn)椋?/p>
bit init_18b20(void);
{ bit presence; //用于保存DS18b20對(duì)CPU的應(yīng)答信號(hào)
DQ = 0; //復(fù)位脈沖低電平
delay_20us(25); // 延時(shí)500us
DQ = 1; //復(fù)位脈沖高電平
delay_20us(4); //延時(shí)80us
presence = DQ; //保存DQ的狀態(tài)
delay_20us(20); //延時(shí)400us
return(presence);//返回DQ的狀態(tài) }
當(dāng)主CPU將I/O線從高電平拉至低電平時(shí),且保持時(shí)間大于1μs,就作為一個(gè)讀周期的開(kāi)始。DS18B20的輸出數(shù)據(jù)在讀時(shí)序下降沿過(guò)后的15μs內(nèi)有效,在此期間,主CPU應(yīng)釋放I/O線,使之處于讀入狀態(tài)以便讀取DS18B20的輸出數(shù)據(jù)。15μs后讀時(shí)序結(jié)束,I/O線經(jīng)上拉電阻變?yōu)楦唠娖健MǔWx取一位數(shù)據(jù)至少要60μs,并且在兩位數(shù)據(jù)之間至少要有1μs的恢復(fù)期。讀溫度字節(jié)的子程序?yàn)椋?/p>
byte read_byte(void)
{byte i; //變量用于循環(huán)自加
byte value = 0;//用于移位操作的臨時(shí)變量
for (i=8;i>0;i--)
{value>>=1;
DQ = 0;
NOP_1uS; //延時(shí)1us的空操作宏的空操作宏
DQ = 1;
NOP_1uS; NOP_1uS; NOP_1uS;
if(DQ)value|=0x80;
delay_20us(3); // 延時(shí)60us
}return(value);//返回對(duì)到的字節(jié) }
CPU把I/O線從高電平拉至低電平時(shí),作為—個(gè)寫(xiě)周期的開(kāi)始。寫(xiě)時(shí)序包括兩種類型:寫(xiě)1時(shí)序和寫(xiě)0時(shí)序,寫(xiě)1或?qū)?必須保持至少60μs,在兩個(gè)寫(xiě)周期之間至少有1μs的恢復(fù)期。DS18B20在I/O線變低電平后的15—6Oμs的時(shí)間內(nèi)進(jìn)行采樣。
若I/O線為高電平,即認(rèn)為寫(xiě)入了一位1;反之,則認(rèn)為寫(xiě)入了一位0。主CPU在開(kāi)始寫(xiě)1周期時(shí),必須將I/O線拉至低電平,然后釋放,15μs內(nèi)將I/O線拉至高電平。主CPU在開(kāi)始寫(xiě)0時(shí),也將I/O拉至低電平,并保持60us的時(shí)間。寫(xiě)字節(jié)的子程序?yàn)椋?/p>
void write_byte(char val)//“val”用語(yǔ)傳遞需要寫(xiě)的字節(jié)
{unsigned char i;// 變量用于循環(huán)自加
for (i=8; i>0; i--)
{DQ = 0; NOP_1uS; NOP_1uS;
DQ = val0x01;
delay_20us(5); //延時(shí)間100us
DQ = 1;val=val/2; //右移一位
}delay_20us(5); //延時(shí)間100us }
每次訪問(wèn)DS18B20的操作都是以初始化器件開(kāi)始,然后發(fā)出ROM命令和功能命令。初始化器件會(huì)使主機(jī)接到應(yīng)答信號(hào),ROM 命令與各個(gè)從機(jī)設(shè)備的惟一64位ROM 代碼相關(guān),允許主機(jī)在1一Wire總線上連接多個(gè)從機(jī)設(shè)備時(shí),指定操作某個(gè)從機(jī)設(shè)備。這些命令還允許主機(jī)能夠檢測(cè)到總線上有多少個(gè)從機(jī)設(shè)備以及其設(shè)備類型,或者有沒(méi)有設(shè)備處于報(bào)警狀態(tài)。
本系統(tǒng)是只有一個(gè)溫度傳感器的單點(diǎn)系統(tǒng),利用跳過(guò)ROM(SKIP ROM)命令,主機(jī)不必發(fā)送64 b序列號(hào),從而節(jié)約了大量時(shí)間。ROM命令后,主機(jī)就可以發(fā)出指定功能命令(溫度轉(zhuǎn)換、讀暫存器等)來(lái)完成操作。本系統(tǒng)中讀取溫度的程序?yàn)椋?/p>
unsigned int Read_Temperature(void)
{ unsigned char a,b;// 用于存儲(chǔ)溫度數(shù)據(jù)的變量
if(init_18b20()==0)
{write_byte(0xCC); //發(fā)送Skip ROM指令
write_byte(0x44); // 發(fā)送溫度轉(zhuǎn)換指令
delay_20us(1);
if(init_18b20()==0)
{write_byte(0xCC); //發(fā)送Skip ROM指令
write_byte(0xBE); //發(fā)送讀取暫存寄存器指令
a=read_byte(); //讀出低八位溫度數(shù)據(jù)
b=read_byte(); //讀出高八位溫度數(shù)據(jù)
temperature=((b*256+a)/16);//計(jì)算出10進(jìn)制溫度值
}}return(temperature);}
4 可控硅控制輸出單元
4.1 可控硅控制單元硬件設(shè)計(jì)
圖2:可控硅控制輸出單元原理圖
本系統(tǒng)利用MOC3021光電隔離電路來(lái)觸發(fā)可控硅。AT89C52利用P21引腳與MOC3021的2腳相連。圖2(a)為觸發(fā)電路原理圖。MOC3021是雙向晶閘管輸出型的光電耦合器,其作用是隔離單片機(jī)系統(tǒng)和外部的雙向晶閘管。
4.2 過(guò)零檢測(cè)電路設(shè)計(jì)
利用過(guò)零檢測(cè)電路捕捉交變電壓的零點(diǎn)信號(hào)。以便在過(guò)零點(diǎn)啟動(dòng)定時(shí)器,當(dāng)計(jì)時(shí)時(shí)間到達(dá)后觸發(fā)可控硅。過(guò)零檢測(cè)電路如圖2(b)所示,利用兩個(gè)TIL117與18V的交流電相連,兩個(gè)TIL117分別在交流電的正負(fù)周期當(dāng)電壓達(dá)到0.3V使三極管T導(dǎo)通,進(jìn)而使三極管T的集電極在交流電的零點(diǎn)附近產(chǎn)生脈沖信號(hào)。
4.3 可控硅移相觸發(fā)程序設(shè)計(jì)
過(guò)零檢測(cè)電路在交變電壓每個(gè)周期產(chǎn)生兩個(gè)過(guò)零點(diǎn)電壓脈沖信號(hào),使AT89C52產(chǎn)生外部中斷。 在中斷服務(wù)程序中開(kāi)始定時(shí)器計(jì)時(shí)。定時(shí)器的定時(shí)時(shí)間小于兩個(gè)過(guò)零脈沖信號(hào)間隔,即10ms,這樣可以使定時(shí)器中斷在下一個(gè)外部中斷來(lái)到之前工作。
在定時(shí)器中斷服務(wù)程序中,觸發(fā)可控硅,并裝入新的定時(shí)器定時(shí)時(shí)間常數(shù)。等待下一個(gè)過(guò)零脈沖信號(hào)到來(lái)引發(fā)的外部中斷,進(jìn)而開(kāi)始新一個(gè)周期的可控硅觸發(fā)周期。程序流程圖如圖1(b)。
利用過(guò)零檢測(cè)電路產(chǎn)生的下降沿作為外部中斷信號(hào),在中斷程序中根據(jù)系統(tǒng)此時(shí)功率輸出判斷是否啟動(dòng)定時(shí)器,如果功率輸出為非零則啟動(dòng)定時(shí)器進(jìn)行計(jì)時(shí)。
void guicontrol(void) interrupt 2
{ if(power!=0) //判斷負(fù)載功率輸出是否為零時(shí),非零則進(jìn)入
{ DT=1;//關(guān)斷可控硅輸出,DT為AT89C52的P21引腳
TR0=1;//啟動(dòng)定時(shí)器 } }
當(dāng)定時(shí)器中斷產(chǎn)生時(shí),停止定時(shí)器計(jì)時(shí),并且在中斷函數(shù)中裝入在程序主控制流程中根據(jù)檢測(cè)到的溫度及系統(tǒng)的功率設(shè)定而實(shí)時(shí)變化的新定時(shí)時(shí)間常數(shù),觸發(fā)可控硅導(dǎo)通。可控硅導(dǎo)通時(shí)間會(huì)持續(xù)到負(fù)載電流每個(gè)半周的終點(diǎn)。
void time0(void) interrupt 1
{ TR0=0;//停止定時(shí)器計(jì)時(shí)
TH0=timehigh;//裝入新的定時(shí)器定時(shí)時(shí)間常數(shù)
TL0=timelow;
DT=0;//觸發(fā)可控硅導(dǎo)通,DT為AT89C52的P21引腳
TF0=0; //清除定時(shí)器溢出標(biāo)志位 }
5 結(jié)束語(yǔ)
本文闡述了醫(yī)療系統(tǒng)的溫度測(cè)控設(shè)計(jì)原理,選用了單總線數(shù)字傳感器DS18B20作為溫度傳感器,簡(jiǎn)化電路。設(shè)計(jì)了一種實(shí)現(xiàn)可控硅移相觸發(fā)的編程方法,給出了具體應(yīng)用電路和軟件設(shè)計(jì)。 所采用設(shè)計(jì)方案使該醫(yī)療系統(tǒng)硬件簡(jiǎn)單實(shí)用,可靠性增加。
更多醫(yī)療電子信息請(qǐng)關(guān)注:21ic醫(yī)療電子頻道
評(píng)論