Monday, January 12, 2015

Mạch đo nhịp tim - Bài 1.Mạch xử lý tín hiệu tương tự

Bài này mình sẽ hướng dẫn các bạn thiết kế mạch thu tín hiệu và tính nhịp tim.Mình chỉ tập trung vào mạch tương tự,cách thu và tách được sóng xung tạo ra khi tim bắt đầu co bóp.Phần mạch số có nhiệm vụ thu tín hiệu từ mạch tương tự,số hóa bằng ADC ,hiển thị dạng sóng tương tự như trên Oxilo,và từ đó tính được nhịp tim.Phần xử lý số có phần hiển thi GLCD phức tạp nhưng không cần thiết,các bạn có thể dùng Oxilo để thay thế,nếu cần mình sẽ đề cập trong 1 bài khác thiết kế Oxilo số.

Một chú ý quan trọng là mạch này sử dụng pin,nên sẽ không có mạch lọc loại bỏ tần số 50Hz từ điện lưới,vì vậy các bạn cần chắc chắn ngắt mọi nguồn nối mạch này với điện lưới(Ví dụ như dây nạp chương trình của MSP430),vì nó sẽ gây nhiễu đến tín hiệu.Đây là lỗi nhiều bạn rất hay gặp khi debug chương trình.



1.Sơ đồ khối

Phần mạch tương tự gồm 3 phần:
- Khối led thu tín hiệu từ ngón tay.
- Mạch lọc thông cao Butter worth tần số cắt 160Hz.
- Mạch khuếch đại đảo với hệ số khuếch đại 100 lần.
- Có thể bao gồm thêm mạch lọc thông thấp tần số cắt 40 Hz nếu không dùng mạch số,vì trong mạch số,Vi điều khiển có phần chương trình xử lý số thay thế.

Phần mạch số chủ yếu là chương trình xử lý trên vi điều khiển.Tại đây tín hiệu tương tự sẽ được số hóa,lọc nhiễu,tạo ra tín hiệu dạng nhịp tim,tách đỉnh xung khi tim bắt đầu co bóp để tính nhịp tim.

Dưới đây chúng ta sẽ đi phân tích chi tiết từng phần.

2.Mạch thu tín hiệu

Mạch thu tín hiệu có dạng như hình.Nguyên lý của mạch này là dựa vào mức độ che sáng khác nhau của mạch máu trên ngón tay khi tim co bóp.Khi co bóp,tiết diện và áp suất trong máu thay đổi,dẫn đến mức độ che sáng đi qua thay đổi.Chúng ta phát ánh sáng thường qua ngón tay bằng led siêu sáng.Cần chú ý cấp nguồn ổn định cho led này để tránh nhiễu cao tần.Ánh sáng được thu lại bằng quang trở.Để lấy tín hiệu đầu ra cần phân áp cho quang trở theo mạch sau.
Để tín hiệu ra tốt nhất,cần lấy giá trị của R bằng căn bậc 2 ( R(LDR)max nhân với R(LDR)min).
Tín hiệu thu được có dạng như hình bên dưới là ổn.Các bạn chú ý là các hình Oxilo trong bài này đều đã được xử lý số lọc nhiễu cao tần,nên nếu bạn dùng Oxilo để đo có thể thấy nhiều xung răng cưa thì cũng là bình thường.

3.Mạch lọc thông cao và mạch khuếch đại

Nhiệm vụ của phần mạch này là tách được phần sóng đi xuống của tín hiệu vừa thu ở trên (Là lúc tim bắt đầu co bóp).Thực chất tín hiệu sẽ được đi qua bộ lọc thông cao Butterworth (bản chất là mạch vi phân) và mạch khuếch đại đảo,dùng Opam.Tín hiệu thu được là tín hiệu đã được loại bỏ thành phần 1 chiều và khuếch đại lên.Nó giúp vi điều khiển dễ dàng sử lý tín hiệu hơn.Nếu không có bộ lọc thông cao thì tín hiệu sẽ vẫn có dạng trên nhưng bị trôi(do thành phần 1 chiều) nên rất khó hiển thị dạng sóng.Ngoài ra vì sau khi lọc,ta sẽ chỉ lấy sóng xung tạo ra mỗi lần tim bắt đầu co bóp nên rất dễ dàng khi tính nhịp tim.
Dưới đây là sơ đồ nguyên lý của mạch:
Nguồn VCC+ và VCC- nên để trị tuyệt đối giống nhau và nên để trên 3.7V là tốt nhất,bắt buộc là nguồn pin(Lithium hoặc pin 9V).Phần mạch lọc thông cao là phần trước tụ C7,phần còn lại là mạch khueehcs đại đảo.Tụ C7 và C8 chỉ dùng để ổn định tín hiệu,có thể bỏ qua.Thực tế khi triển khai,mình để ý thấy Opam nên dùng loại LM741 thay vì 324 hay 358 vì nhiễu ít hơn.Bộ lọc Butterworth là bộ lọc thông cao có tần số cắt là 160Hz,được tính theo công thức:
Hệ số khuếch đại của mạch lọc thông cao là: K1= 1+ R5/R67 = 2.
Các bạn có thể để cao hơn nhưng tốt nhất không nên để cao quá,mạch sẽ không ổn định.
Phần thứ 2 là mạch khuếch đại đảo,rất đơn giản,hệ số khuếch đại là K2=R2/R3

Tín hiệu sau khi qua mạch này có dạng sau:


Đến đây về cơ bản thì quá trình xử lý tín hiệu tương tự đã hoàn tất.Mạch lọc thông thấp tần số 40 Hz có thể thêm vào,tuy nhiên không quan trọng lắm.

4.Tính nhịp tim

Từ tín hiệu sóng co bóp tim được tách ra từ phần 3,có nhiều cách để tính nhịp tim,tuy nhiên đều dựa và việc bắt một trong 2 xung sườn lên hoặc xuống của tín hiệu.Ở đây mình sử dụng cách bắt xung sườn lên của tín hiệu.Cụ thể là tín hiệu sau khi được chuyển đổi ADC sẽ được qua một bộ vi phân.Bộ này triển khai rất đơn giản,chỉ cần lấy mẫu ADC với tần số cố định,lấy giá trị ADC lần đo cuối trừ đi giá trị lần trước đó,Kết quả thu được tương đương với tín hiệu được đi qua 1 bộ vi phân.Tần số lấy mẫu ADC càng cao thì tín hiệu càng chi tiết.Ở đây mình lấy mẫu ở tần số 40Hz,nếu nhỏ hơn có thể bắt trượt xung sườn lên.



Do chỉ quan tâm đến xung sườn lên,ta bỏ qua các giá trị vi phân nhỏ hơn 0.Nhìn hình có thể thấy tín hiệu thu được rất sạch,gốc là 0,Sau đó chỉ cần một vòng quét,mỗi lần tín hiệu vi phân vượt qua 1 giá trị ngưỡng nào đó thì là 1 lần tim đập.Tính thời gian giữa 2 lần co bóp tim và tính ra nhịp tim tức thời

Phần mạch hiển thị số khá phức tạp vì có nhiều lệnh xử lý LCD Graphic,mình sẽ hướng dẫn chi tiết trong một bài khác.

Chúc các bạn thành công!

8 comments:

  1. theo như mình được biết thì về việc lọc, thay vì lọc bằng phần cứng mình có thể lọc bằng phần mềm ? bạn đã tìm hiểu về cái này chưa ? có thể giới thiệu cho mình được không ? tks.

    ReplyDelete
    Replies
    1. Trong bài này mình có dùng lọc bằng phần mềm đó bạn,có một bộ lọc thông thấp trong chương trình hiển thị như trong sơ đồ khối.Còn các bộ lọc thông cao,thông dải,dải chắn thì mình chưa thử bằng phần mềm,nhưng chắc chắn là có,chỉ có điều chưa so sánh hiệu quả giữa phần cứng và phần mềm thôi.

      Delete
    2. bạn có thể cho mình xin code và mạch nguyên lí dc k. nếu được bạn gửi vào mail : tungcoly@gmail.com
      tks

      Delete
    3. Ví dụ như đây là code bộ lọc thông thấp dùng phương pháp cửa sổ lọc Blackman-Harris ,đầu vào là ADC[0],đầu ra là ADC_Filter[0].Bạn có thể đọc thêm tại đây http://www.mikroe.com/chapters/view/72/
      Temp_0[8] = Temp_0[7];
      Temp_0[7] = Temp_0[6];
      Temp_0[6] = Temp_0[5];
      Temp_0[5] = Temp_0[4];
      Temp_0[4] = Temp_0[3];
      Temp_0[3] = Temp_0[2];
      Temp_0[2] = Temp_0[1];
      Temp_0[1] = Temp_0[0];
      Temp_0[0] = ADC[0];
      ADC_Filter[0]= (Temp_0[3]+Temp_0[5])*59/250 + Temp_0[4]*53/100-(Temp_0[1]+Temp_0[7])/400;

      Delete
    4. ok. tks. còn phần sử lí ocsillo bạn làm phần đấy đi :v

      Delete
    5. Ờ bạn chờ vài hôm,mấy hôm nay đang nhiều việc lằng nhằng quá :3

      Delete
    6. bạn có thể gửi cho mình code với mạch nguyên lí được k, mình tìm tài liệu mà k có với lại có thì những tài liệu đó cũng k giúp ích được nhiểu lắm.

      Delete
    7. Bạn chờ vài hôm để mình viết nốt bài tutorial nữa,vì code giờ có gửi thì cũng khó hiểu lắm.Mình viết trên MSP430F5419 bằng kit tự thiết kế,nó là 2 module khá lằng nhằng.Mà chương trình đấy được viết cho Kit nên còn nhiều code của các chương trình khác nữa.

      Delete

END COMMENT FACEBOOK-->