Thiết kế và phát triển mô đun phát hiện tia phóng xạ phục vụ công tác giám sát an toàn bức xạ trong bệnh viện Thiết kế và phát triển mô đun phát hiện tia phóng xạ phục vụ công tác giám sát an toàn bức xạ trong bệnh viện luận văn tốt nghiệp thạc sĩ
TRƢỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI LUẬN VĂN THẠC SĨ Thiết kế phát triển mô-đun phát tia phóng xạ phục vụ cơng tác giám sát an tồn xạ bệnh viện NGUYỄN ĐỨC TUYẾN ductuyenbg@gmail.com Ngành Kỹ thuật Y sinh Giảng viên hƣớng dẫn: TS Đào Việt Hùng Chữ ký GVHD Viện: Điện tử - Viễn thông, Trường ĐH Bách Khoa Hà Nội HÀ NỘI, 7/2020 CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập – Tự – Hạnh phúc BẢN XÁC NHẬN CHỈNH SỬA LUẬN VĂN THẠC SĨ Họ tên tác giả luận văn: Nguyễn Đức Tuyến Đề tài luận văn: Thiết kế phát triển mơ-đun phát tia phóng xạ phục vụ cơng tác giám sát an tồn xạ bệnh viện Chuyên ngành: Kỹ thuật y sinh Mã số SV: CB180190 Tác giả, Người hướng dẫn khoa học Hội đồng chấm luận văn xác nhận tác giả sửa chữa, bổ sung luận văn theo biên họp Hội đồng ngày 25 tháng năm 2020 với nội dung sau: Chỉnh sửa lại bố cục luận văn Chỉnh sửa lại lỗi chế hình vẽ mờ Ngày … tháng … năm 2020 Giáo viên hƣớng dẫn Tác giả luận văn CHỦ TỊCH HỘI ĐỒNG ĐỀ TÀI LUẬN VĂN THIẾT KẾ VÀ PHÁT TRIỂN MƠ-ĐUN PHÁT HIỆN TIA PHĨNG XẠ PHỤC VỤ CƠNG TÁC GIÁM SÁT AN TỒN BỨC XẠ TRONG BỆNH VIỆN Giáo viên hướng dẫn Ký ghi rõ họ tên LỜI CẢM ƠN Trong trình học tập Trường Đại học Bách Khoa Hà Nội, Quý thầy cô trang bị cho kiến thức chuyên sâu, giúp trưởng thành học tập nghiên cứu khoa học Tôi xin gửi lời biết ơn đến tất Q thầy tận tình giảng dạy suốt thời gian học trường Với lịng kính trọng biết ơn sâu sắc, tơi xin bày tỏ lòng cảm ơn chân thành tới TS Đào Việt Hùng – giảng viên Bộ môn Công nghệ Điện tử Kỹ thuật Y Sinh, người thầy dành nhiều thời gian hướng dẫn, tận tình bảo định hướng cho tơi suốt q trình nghiên cứu hồn thành Luận văn Trong q trình nghiên cứu hồn thành Luận văn, tơi nhận động viên, chia sẻ, giúp đỡ gia đình, anh em, bạn bè, đồng nghiệp, người thân Tôi xin phép bày tỏ lòng biết ơn sâu sắc Xin trân trọng cảm ơn! TÓM TẮT NỘI DUNG LUẬN VĂN Để đáp ứng nhu cầu an toàn xạ ngày trọng y tế, hệ thống phát xạ thiết kế để đảm bảo việc phát cảnh báo có nguồn phóng xạ tạo suất liều khơng khí khoảng cách năm mét mà không ảnh hưởng đến hoạt động bệnh viện Hệ thống đặt trạng thái hoạt động đảm bảo hoạt động liên tục thời gian dài có hệ thống cảnh báo chỗ hình, đèn, cịi có phần mềm kết nối điều khiển toàn phần mềm hệ thống Các giải phải thiết kế phát triển mô-đun triển khai chạy thử, đo đạc tham số đánh giá hiệu hệ thống HỌC VIÊN Ký ghi rõ họ tên MỤC LỤC DANH MỤC HÌNH VẼ i DANH MỤC BẢNG BIỂU iii DANH MỤC TỪ VIẾT TẮT iv MỞ ĐẦU CHƢƠNG TỔNG QUAN 1.1 Ứng dụng xạ ion hóa y tế 1.2 Thực trạng cơng tác giám sát an tồn xạ bệnh viện 1.3 1.2.1 Các nguyên tắc bảo vệ an toàn bệnh viện 1.2.2 Kiểm sốt chơn cất chất thải phóng xạ 1.2.3 Một số thiết bị để đo xạ bệnh viện Các nguy an toàn xạ 1.3.1 Sơ lược xạ sở y tế 1.3.2 Khảo sát hệ thống giám sát phóng xạ có 10 1.3.3 Những vấn đề tồn 14 CHƢƠNG CƠ SỞ THỰC HIỆN ĐỀ TÀI 15 2.1 Lý thuyết phóng xạ 15 2.2 Các cơng nghệ ghi đo phóng xạ 15 2.3 2.4 2.2.1 Công nghệ sử dụng ống đếm Geiger – Muller 15 2.2.2 Cơng nghệ sử dụng đầu dị 17 Lý thuyết ống đếm Geiger – Muller 19 2.3.1 Khái niệm 19 2.3.2 Phân loại 20 2.3.3 Nguyên lý hoạt động 21 Ghi đo phóng xạ ống đếm GM 23 CHƢƠNG THIẾT KẾ HỆ THỐNG 24 3.1 Kiến trúc tổng quát hệ thống 24 3.2 Sơ đồ khối phần đầu đo 24 3.3 Sơ đồ khối phần mạch xử lý 25 3.4 Sơ đồ khối thuật tốn tính tốn 26 3.5 Sơ đồ khối hệ thống 28 3.6 Khối nguồn 28 3.6.1 Khối nguồn cao áp 28 3.6.2 Khối nguồn nuôi mạch xử lý 29 3.7 Khối mạch tiền khuếch đại, khuếch đại xử lý tín hiệu 29 3.8 Khối mạch đếm xung 30 3.9 Mạch truyền thông 32 3.10 Phân tích lựa chọn cơng cụ lập trình 34 3.11 3.12 3.10.1 Nhiệm vụ phần mềm điều khiển 34 3.10.2 Lựa chọn ngơn ngữ lập trình mơi trường phát triển 35 Thiết kế lưu đồ thuật toán 35 3.11.1 Thuật tốn điều khiển giao tiếp với đầu dị phóng xạ 35 3.11.2 Thuật toán điều khiển giao tiếp với mạch thu nhận LoRa 37 3.11.3 Thuật toán điều khiển giao tiếp với mạch nguồn 38 3.11.4 Thuật toán điều khiển với hình cảm ứng 40 Xây dựng phần mềm điều khiển mạch trung tâm 44 3.12.1 Hàm bkRDMBlockReady (callback) 44 3.12.2 Hàm bkRDMCloseUnit 45 3.12.3 Hàm bkRDMGetValues 45 3.12.4 Hàm bkRDMOpenUnit 46 3.12.5 Hàm bkRDMRunBlock 47 3.12.6 Hàm bkLoRaRunStreaming 48 3.12.7 Triển khai mơ-đun phần mềm cho trình điều khiển 48 CHƢƠNG KẾT QUẢ VÀ KẾT LUẬN 55 4.1 4.2 Kết 55 4.1.1 Sản phẩm thiết kế 55 4.1.2 Chạy thử mạch điện 56 Kết luận kiến nghị 58 4.2.1 Kết luận chung 58 4.2.2 Hướng phát triển đề tài 58 4.2.3 Kiến nghị đề xuất 59 TÀI LIỆU THAM KHẢO 60 3.12.5 Hàm bkRDMRunBlock Khai báo hàm: BK_STATUS bkRDMRunBlock ( int16_t handle, int32_t noOfPreTriggerSamples, int32_t noOfPostTriggerSamples, uint32_t timebase, int16_t oversample, int32_t * timeIndisposedMs, uint32_t segmentIndex, bkRDMBlockReady void lpReady, * pParameter ) Đây hàm thu nhận liệu từ đầu dị phóng xạ theo kiểu lấy thông tin theo khối liệu Bảng 3.5 Đặc điểm hàm bkRDMRunBlock Chế độ thu nhận theo khối Áp dụng noOfPreTriggerSamples, số lượng liệu trước thời điểm kiện trigger noOfPostTriggerSamples, số lượng mẫu sau thời điểm xuất kiện trigger oversample, không lấy liệu Biến thành phần *timeIndisposedMs, thời gian mẫu liệu tính theo mili-giây segmentIndex, số phân đoạn nhớ sử dụng lpReady, trỏ báo hiệu thu nhận liệu lấy đủ lượng mẫu, chưa giá trị NULL *pParameter, trỏ đề gọi hàm callback cho việc lấy liệu từ thu nhận Kết trả BK_OK BK_CONFIG_FAIL 47 3.12.6 Hàm bkLoRaRunStreaming Khai báo hàm: BK_STATUS bkLoRaRunStreaming ( int16_t handle, uint32_t * sampleInterval, BK_LoRa10_TIME_UNITS int16_t sampleIntervalTimeUnits, autoLoRaStop, uint32_t overviewBufferSize ) Hàm phát liệu mà thu nhận lấy mẫu từ đầu dị phóng xạ sau phát trực tuyến lên thu nhận LoRa Khi liệu thu nhận từ đầu dị phóng xạ chuyển lên phần mềm, xử l đóng gói liệu truyền trở thành liệu phát tới thu nhận LoRa Bảng 3.6 Đặc điểm hàm bkLoRaRunStreaming Áp dụng Chế độ hoạt động thu nhận liệu truyền trực tuyến Streaming handle, định danh thu nhận, trả từ lệnh bkRDMOpenUnit *sampleInterval, thời gian mẫu liệu Biến thành phần sampleIntervalTimeUnits, thời gian phát liệu autoLoRaStop, cờ thiết lập chế độ tự dừng đo sau lần gửi liệu overviewBufferSize, ích thước nhớ đệm BK_OK Kết trả BK_STREAMING_FAILED BK_NOT_RESPONDING 3.12.7 Triển khai mơ-đun phần mềm cho trình điều khiển Dựa kết thu nhận từ phân tích, thiết kế thuật tốn điều khiển xây dựng, nhóm nghiên cứu triển khai thực tế trình điều khiển cho mạch điều khiển trung tâm, kết nối điều khiển phối hợp mô-đun thành phần 48 a) Khởi tạo định thời Timer0 hàm gọi ngắt void Init_1Hz_SamplingTimer0(void) { ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); ROM_TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC); uint32_t ui32Period = SysCtlClockGet()/2; ROM_TimerLoadSet(TIMER0_BASE, TIMER_A, ui32Period -1); ROM_IntEnable(INT_TIMER0A); ROM_TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT); } void Timer0AIntHandler(void) ROM_TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT); Timer0_counter++; } b) Khởi tạo định thời Timer4 hàm gọi ngắt void Init_1Hz_Timer4(void) { ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER4); ROM_TimerConfigure(TIMER4_BASE, TIMER_CFG_PERIODIC); uint32_t ui32Period = SysCtlClockGet()/1; ROM_IntEnable(INT_TIMER4A); ROM_TimerEnable(TIMER4_BASE, TIMER_A); } void Timer4AIntHandler(void) { ROM_TimerIntClear(TIMER4_BASE, TIMER_TIMA_TIMEOUT); if(key_active == true) Timer4_counter++; } c) Khởi tạo định thời Timer5 hàm gọi ngắt void Init_10Hz_Timer5(void) { ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER5); ROM_TimerConfigure(TIMER5_BASE, TIMER_CFG_PERIODIC); uint32_t ui32Period = SysCtlClockGet()/200; ROM_TimerLoadSet(TIMER5_BASE, TIMER_A, ui32Period -1); ROM_IntEnable(INT_TIMER5A); ROM_TimerIntEnable(TIMER5_BASE, TIMER_TIMA_TIMEOUT); } void Timer5AIntHandler(void) { 49 ROM_TimerIntClear(TIMER5_BASE, TIMER_TIMA_TIMEOUT); Timer5_counter++; PWMPulseWidthSet(PWM1_BASE,PWM_OUT_6, (uint32_t)Timer5_counter); if(Timer5_counter >= Dimmer_Time) { ROM_TimerDisable(TIMER5_BASE, TIMER_A); } } d) Mô-đun phần mềm khối điều khiển độ sáng hình, PWM6 void M1PWM7_Init(void) { ROM_SysCtlPWMClockSet(SYSCTL_PWMDIV_1); ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM1); ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); ROM_GPIOPinTypePWM(GPIO_PORTF_BASE, GPIO_PIN_3); ROM_GPIOPinConfigure(GPIO_PF3_M1PWM7); PWMGenConfigure(PWM1_BASE, PWM_GEN_3, PWM_GEN_MODE_DOWN | PWM_GEN_MODE_NO_SYNC); float fPWM = 80000000 / 250000.0; PWMGenPeriodSet(PWM1_BASE, PWM_GEN_3, (uint32_t)fPWM); float pulse_width = 125 / 12.5; PWMPulseWidthSet(PWM1_BASE,PWM_OUT_7,(uint32_t)pulse_width); PWMOutputState(PWM1_BASE, PWM_OUT_7_BIT, true); PWMGenEnable(PWM1_BASE, PWM_GEN_3); } e) Thực thi tương tác từ người dùng void Timer5AIntHandler(void) { ROM_TimerIntClear(TIMER5_BASE, TIMER_TIMA_TIMEOUT); Timer5_counter++; PWMPulseWidthSet(PWM1_BASE,PWM_OUT_6, (uint32_t)Timer5_counter); if(Timer5_counter >= Dimmer_Time) { ROM_TimerDisable(TIMER5_BASE, TIMER_A); } } f) Khai báo chân điều khiển cảm ứng #define TS_XP_PERIPH SYSCTL_PERIPH_GPIOD #define TS_XP_BASE GPIO_PORTD_BASE #define TS_XP_PIN GPIO_PIN_1 #define TS_XP_ADC ADC_CTL_CH6 #define TS_XN_PERIPH SYSCTL_PERIPH_GPIOD 50 #define TS_XN_BASE GPIO_PORTD_BASE #define TS_XN_PIN GPIO_PIN_6 #define TS_YP_PERIPH SYSCTL_PERIPH_GPIOD #define TS_YP_BASE GPIO_PORTD_BASE #define TS_YP_PIN GPIO_PIN_3 #define TS_YP_ADC ADC_CTL_CH4 #define TS_YN_PERIPH SYSCTL_PERIPH_GPIOD #define TS_YN_BASE GPIO_PORTD_BASE #define TS_YN_PIN GPIO_PIN_2 g) Khai báo bước lần tính tốn tọa độ X, Y cảm ứng static uint32_t g_ui32TSState; #define TS_STATE_INIT #define TS_STATE_SKIP_X #define TS_STATE_READ_X #define TS_STATE_SKIP_Y #define TS_STATE_READ_Y h) Khai báo ngưỡng lực nhấn vào cảm ứng #define TOUCH_MIN 150 i) Thủ tục khởi tạo cảm ứng void TouchScreenInit() { g_ui32TSState = TS_STATE_INIT; g_pfnTSHandler = 0; ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0); ROM_SysCtlPeripheralEnable(TS_XP_PERIPH); ROM_SysCtlPeripheralEnable(TS_YP_PERIPH); ROM_SysCtlPeripheralEnable(TS_XN_PERIPH); ROM_SysCtlPeripheralEnable(TS_YN_PERIPH); ROM_GPIOPinTypeGPIOInput(TS_XP_BASE, TS_XP_PIN); ROM_GPIOPinTypeGPIOInput(TS_YP_BASE, TS_YP_PIN); ROM_GPIOPinTypeGPIOInput(TS_XN_BASE, TS_XN_PIN); ROM_GPIOPinTypeGPIOInput(TS_YN_BASE, TS_YN_PIN); ROM_GPIOPinTypeGPIOOutput(TS_XP_BASE, TS_XP_PIN); ROM_GPIOPinWrite(TS_XP_BASE, TS_XP_PIN, 0); ROM_GPIOPinTypeGPIOOutput(TS_YP_BASE, TS_YP_PIN); ROM_GPIOPinWrite(TS_YP_BASE, TS_YP_PIN, 0); ROM_GPIOPinTypeGPIOOutput(TS_XN_BASE, TS_XN_PIN); ROM_GPIOPinWrite(TS_XN_BASE, TS_XN_PIN, 0); ROM_GPIOPinTypeGPIOOutput(TS_YN_BASE, TS_YN_PIN); ROM_GPIOPinWrite(TS_YN_BASE, TS_YN_PIN, 0); ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0); ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1); ROM_ADCHardwareOversampleConfigure(ADC0_BASE, 4); ADCSequenceConfigure(ADC0_BASE, 3, ADC_TRIGGER_TIMER, 0); 51 ROM_ADCSequenceStepConfigure(ADC0_BASE, 3, 0, TS_YP_ADC | ADC_CTL_END | ADC_CTL_IE); ROM_ADCSequenceEnable(ADC0_BASE, 3); ROM_ADCIntEnable(ADC0_BASE, 3); ROM_IntEnable(INT_ADC0SS3); if((HWREG(TIMER1_BASE + TIMER_O_CTL) & TIMER_CTL_TAEN) == 0) { ROM_TimerConfigure(TIMER1_BASE, (TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PERIODIC | TIMER_CFG_B_PERIODIC)); ROM_TimerLoadSet(TIMER1_BASE, TIMER_A, (SysCtlClockGet() / 1000) - 1); ROM_TimerControlTrigger(TIMER1_BASE, TIMER_A, true); ROM_TimerEnable(TIMER1_BASE, TIMER_A); } } j) Vòng lặp đọc giá trị tọa độ X, Y so sánh với ngưỡng void TouchScreenIntHandler(void) { HWREG(ADC0_BASE + ADC_O_ISC) = ADC_ISC_IN3; switch(g_ui32TSState) { case TS_STATE_SKIP_X: { HWREG(ADC0_BASE + ADC_O_SSFIFO3); HWREG(TS_YP_BASE + GPIO_O_AMSEL) |= TS_YP_PIN; HWREG(TS_YP_BASE + GPIO_O_DIR) &= ~TS_YP_PIN; HWREG(TS_YN_BASE + GPIO_O_DIR) &= ~TS_YN_PIN; g_ui32TSState = TS_STATE_READ_X; break; } case TS_STATE_READ_X: { g_i16TouchX = HWREG(ADC0_BASE + ADC_O_SSFIFO3); HWREG(TS_YP_BASE + GPIO_O_AMSEL) &= ~TS_YP_PIN; HWREG(TS_XP_BASE + GPIO_O_DIR) |= TS_XP_PIN; HWREG(TS_XN_BASE + GPIO_O_DIR) |= TS_XN_PIN; HWREG(TS_YP_BASE + GPIO_O_DIR) |= TS_YP_PIN; HWREG(TS_YN_BASE + GPIO_O_DIR) |= TS_YN_PIN; HWREG(TS_XP_BASE + GPIO_O_DATA + (TS_XP_PIN