1 引言
自動調溫光療系統是一種醫用理療儀器,其原理是采用單片機對可控硅的控制來控制高壓下的激光輸出器進行理療,在激光輸出器工作的同時對其進行實時溫度檢測,利用檢測到的溫度狀況決定可控硅的導通狀態,達到改變激光輸出器輸出功率的目的,得到最佳的療效。
根據上述特點,本文選擇了單總線數字溫度傳感器DS18B20進行溫度采集,介紹了使用DS18B20的程序代碼。為了使可控硅的輸出功率連續均勻變化,本文設計了一種利用外部中斷和定時器中斷實現可控硅移相觸發的編程方法,滿足治療光的強度均勻靈敏變化的需要。
2 調溫光療系統介紹
2.1系統結構介紹
本系統由5部分組成:CUP處理單元,鍵盤輸入單元,LCD顯示單元,測量溫度單元,可控硅控制激光器輸出單元。
CUP處理單元運行系統程序調度所有任務,鍵盤用于輸入系統設定參數及控制狀態模式選擇,LCD為系統提供了良好的操作界面,測量溫度單元負責對激光輸出器的溫度進行實時檢測,可控硅控制輸出單元針對設定參數及檢測到的溫度來控制激光輸出器的輸出。本文將詳細介紹測量溫度單元和可控硅控制單元的軟硬件設計。
2.2 系統程序流程介紹
本醫療系統的程序流程為:系統首先數據進行初始化,這里的初始化主要包括定時器和外部中斷的設置,初始化完成后開外部中斷,然后系統進行溫度采集,根據采集的溫度及系統的設置參數來決定定時器定時參數,該定時參數直接決定移相觸發可控硅時導通角的大小。接著系統再進行溫度采集,選擇定時器定時時間參數,依次循環下去。
在系統循環工作過程中,人工可以通過按鍵改變系統的各種工作參數,工作參數直接影響控制可控硅導通角的定時器參數的選擇。系統的主流程框圖如圖1(a)所示意。當系統循環執行時,外部過零脈沖信號會使系統進入外部中斷服務程序,進而控制可控硅的的導通。
圖1:系統程序流程圖
3 測量溫度單元介紹
熱電偶或鉑電阻,需放大電路和A/D轉換實現溫度信號采集。為簡化系統硬件設計,選用了DALLAS公司生產的單總線數字溫度傳感器DS18B20。
DS18B20提供的“一線”總線接口只需一個端口進行通訊;測溫范圍為-55~+125℃,在-10~+85℃的范圍內,精度為±0.5℃;溫度以9~12位數字量讀出,分辨率為0.0625℃,該精度滿足本醫用光療系統的要求;同時DS18B20采用超小型的μSOP封裝,體積很小,可以直接敷貼在激光器的前端。由于DS18B20提供的“一線”總線接口只需一個端口與CPU通訊,因此在硬件上,利用單片機AT89C52的一個端口P2.0與DS18B20的DQ引腳相連。
3.1 DS18B20工作原理及程序
在對DS18B20進行讀寫操作之前,CPU首先發出一個復位脈沖,最小脈沖寬度為480μs的低電平信號;然后CPU釋放單總線,使之處于接收狀態。單總線經過上拉電阻被拉至高電平。當DS18B20檢測測到I/0端的上升沿時,就等待15—60μs,再向主CPU發出應答脈沖(60一240μs的低電平信號)。初始化子程序為:
bit init_18b20(void);
{ bit presence; //用于保存DS18b20對CPU的應答信號
DQ = 0; //復位脈沖低電平
delay_20us(25); // 延時500us
DQ = 1; //復位脈沖高電平
delay_20us(4); //延時80us
presence = DQ; //保存DQ的狀態
delay_20us(20); //延時400us
return(presence);//返回DQ的狀態 }
當主CPU將I/O線從高電平拉至低電平時,且保持時間大于1μs,就作為一個讀周期的開始。DS18B20的輸出數據在讀時序下降沿過后的15μs內有效,在此期間,主CPU應釋放I/O線,使之處于讀入狀態以便讀取DS18B20的輸出數據。15μs后讀時序結束,I/O線經上拉電阻變為高電平。通常讀取一位數據至少要60μs,并且在兩位數據之間至少要有1μs的恢復期。讀溫度字節的子程序為:
{byte i; //變量用于循環自加
byte value = 0;//用于移位操作的臨時變量
for (i=8;i》0;i--)
{value》》=1;
DQ = 0;
NOP_1uS; //延時1us的空操作宏的空操作宏
DQ = 1;
NOP_1uS; NOP_1uS; NOP_1uS;
if(DQ)value|=0x80;
delay_20us(3); // 延時60us
}return(value);//返回對到的字節 }
CPU把I/O線從高電平拉至低電平時,作為—個寫周期的開始。寫時序包括兩種類型:寫1時序和寫0時序,寫1或寫0必須保持至少60μs,在兩個寫周期之間至少有1μs的恢復期。DS18B20在I/O線變低電平后的15—6Oμs的時間內進行采樣。
若I/O線為高電平,即認為寫入了一位1;反之,則認為寫入了一位0。主CPU在開始寫1周期時,必須將I/O線拉至低電平,然后釋放,15μs內將I/O線拉至高電平。主CPU在開始寫0時,也將I/O拉至低電平,并保持60us的時間。寫字節的子程序為:
void write_byte(char val)//“val”用語傳遞需要寫的字節
{unsigned char i;// 變量用于循環自加
for (i=8; i》0; i--)
{DQ = 0; NOP_1uS; NOP_1uS;
DQ = val&0x01;
delay_20us(5); //延時間100us
DQ = 1;val=val/2; //右移一位
}delay_20us(5); //延時間100us }
每次訪問DS18B20的操作都是以初始化器件開始,然后發出ROM命令和功能命令。初始化器件會使主機接到應答信號,ROM 命令與各個從機設備的惟一64位ROM 代碼相關,允許主機在1一Wire總線上連接多個從機設備時,指定操作某個從機設備。這些命令還允許主機能夠檢測到總線上有多少個從機設備以及其設備類型,或者有沒有設備處于報警狀態。
本系統是只有一個溫度傳感器的單點系統,利用跳過ROM(SKIP ROM)命令,主機不必發送64 b序列號,從而節約了大量時間。ROM命令后,主機就可以發出指定功能命令(溫度轉換、讀暫存器等)來完成操作。本系統中讀取溫度的程序為:
unsigned int Read_Temperature(void)
{ unsigned char a,b;// 用于存儲溫度數據的變量
if(init_18b20()==0)
{write_byte(0xCC); //發送Skip ROM指令
write_byte(0x44); // 發送溫度轉換指令
delay_20us(1);
if(init_18b20()==0)
{write_byte(0xCC); //發送Skip ROM指令
write_byte(0xBE); //發送讀取暫存寄存器指令
a=read_byte(); //讀出低八位溫度數據
b=read_byte(); //讀出高八位溫度數據
temperature=((b*256+a)/16);//計算出10進制溫度值
}}return(temperature);}
評論
查看更多