Cách đo điện trở dùng Arduino

19/04/2021
cach-do-dien-tro-dung-arduino

Bạn có bao giờ từng nghĩ để đo điện trở người ta phải làm như thế nào, nguyên lý hoạt động của nó ra sao ? Bài viết này sẽ giới thiệu cho các bạn một cách đo điện trở dùng arduino kết hợp với điện tử và giới hạn đo tùy ý các bạn chọn với sai số cho phép. Mạch này có chức năng scan thang đo tự động giống kiểu đồng hồ vạn năng đời mới cải thiện hơn so với đồng hồ loại cũ có nhiều núm vặn cơ để chia thang đo. Ý tưởng và mạch điện này là mình tự nghĩ nên có thể trong một số đồng hồ vạn năng người ta sẽ dùng mạch điện nào đó đơn giản hơn mình nên mình cũng xin góp ý từ các bạn để cải thiện hơn ạ.

Yêu cầu  

Có kiến thức về lập trình cho IC 74HC595 và kiến thức về transistor PNP và mạch cầu phân áp.

Ý tưởng 

Giả sử chúng ta muốn đo giá trị điện trở từ 0 đến 100Ω , ta sẽ dùng mạch cầu phân áp với 1 con điện trở 100Ω   và mắc nối tiếp nó với giá trị điện trở cần đo như sau:

Ta có điện áp tại A thông qua analogRead và ta cần tìm giá trị của R nên áp dụng công thức tính U của mạch cầu phân áp ta có:

Với R1 là giá trị của điện trở R1 và với trường hợp trong hình trên, R1=100. Tương tự với các trường hợp khác. Ví dụ ta cần đo 100 đến 1k thì ta dùng điện trở 1k làm R1(vì nếu đo một điện trở có trị số càng lớn mà R1 có trị số càng nhỏ thì sai số sẽ lớn nên ta chia khoảng). Nên mình nói từ đầu bài là giới hạn tùy ý là vậy, các bạn muốn đo max 100k thì dùng 4 con (100,1k,10k và 100k) tương tự với 1M hay 10M. Bây giờ tiếp theo làm sao để nhận biết được điện trở tại hai đầu dây đo không được mắc vào tức là không có tải, thế thì điện áp tại 1 đầu sẽ là 5v => analogRead = 1023 và tất nhiên đầu GND sẽ là 0V nên ta cũng analogRead tại đó.

Phần cứng 

- 1 con arduino UNO hoặc Nano

- 1 con IC 74HC595

- Điện trở 100,1k,10k,... 

- Số lượng transistor PNP bằng số lượng điện trở. Có thể dùng các con PNP nhỏ như A1015.

- Nguồn 5V DC. (Có thể dùng ổn áp 7805)

Lắp mạch

Ở đây ta sẽ chọn data pin là chân 2, clock pin là chân 3 và latch pin là chân 4. Ở đây mình chỉ lắp cho trường hợp max là 100k tức là 4 con điện trở làm cho mạch điện nó dễ thương một xíu, trường hợp là 5 con thì các bạn cần viết thêm 1 hàm và thêm 1 con điện trở với 1 con transistor. Các bạn lắp mạch theo sơ đồ sau:

Mình sẽ chụp từng mảng cho các bạn dễ hình dung.

Cụ thể ở đây chân Q0 sẽ mắc vào R1, Q1 vào R2, Q2 vào R3, Q3 vào R4 và Q7 vào chân analogReference (AREF) trên Arduino. SH_CP (clock) vào chân 3, ST_CP (latch) vào chân 4 và DS (data) vào chân 2. Phần nối chung của 4 con điện trở R5 đến R8 thì mắc vào A0, phần GND sau tải thì mắc vào A1. Sau đó các bạn nạp đoạn code sau:

 
  1. int count=1;
  2. byte daybit[9]={1,2,4,8,16,32,64,128};
  3. byte dataPin = 2;
  4. byte clockPin = 3;
  5. byte latchPin = 4;
  6. float dientro;
  7. float dienap;
  8. void setup() {
  9. for(int i=2;i<=5; i++){
  10. pinMode(i, OUTPUT);
  11. }
  12. analogReference(EXTERNAL);
  13. Serial.begin(9600);
  14. }
  15. void loop() {
  16. while(count==1){
  17. write();
  18. if(analogRead(A0)<=513){
  19. dienap = ((analogRead(A0)*5.00)/1023.00);
  20. dientro = ((100.00*dienap)/(5.00-dienap));
  21. Serial.println(dientro);
  22. }
  23. else{
  24. count=2;
  25. }}
  26. while(count==2){
  27. write();
  28. if((analogRead(A0)<=513)&&(analogRead(A0)>=93)){
  29. dienap = ((analogRead(A0)*5.00)/1023.00);
  30. dientro = ((1000.00*dienap)/(5.00-dienap));
  31. Serial.println(dientro);
  32. }
  33. else{
  34. ​if(analogRead(A0)<93){count=1;
  35. ​else
  36. count=3;}
  37. }}
  38. while(count==3){
  39. write();
  40. if((analogRead(A0)<=513)&&(analogRead(A0)>=93)){
  41. dienap = ((analogRead(A0)*5.00)/1023.00);
  42. dientro = ((10000.00*dienap)/(5.00-dienap));
  43. Serial.println(dientro);
  44. }
  45. else{
  46. ​if(analogRead(A0)<93){count=2;
  47. ​else
  48. count=4;}}
  49. }
  50. while(count==4){
  51. write();
  52. if((analogRead(A0)<=513)&&(analogRead(A0)>=93)){
  53. dienap = ((analogRead(A0)*5.00)/1023.00);
  54. dientro = ((100000.00*dienap)/(5.00-dienap));
  55. Serial.println(dientro);
  56. }
  57. else{
  58. ​if(analogRead(A0)<93){count=3;
  59. else{
  60. count=5;}}
  61. }
  62. while(count==5){
  63. Serial.println("R is too high");
  64. count=4;
  65. }
  66. }
  67. void write(){
  68. byte x= count-1;
  69. digitalWrite(latchPin, LOW);
  70. shiftOut(dataPin, clockPin,MSBFIRST, 255-daybit[x]);
  71. digitalWrite(latchPin, HIGH);
  72. }

Ở đây mình sẽ phân tích kỹ code một chút. Nguyên lý tự động scan thì mình sẽ chia ra nhiều hàm với biến count. Với count=1 đo từ 0 đến 100 ohms, count=2 từ 100 đến 1k,.... Và khi count=1, IC sẽ được truyền 1 dữ liệu là 0B01111111 (255-daybit[0]) nên con PNP thứ nhất sẽ mở và có dòng điện chạy qua con R6 (100) đến tải tương tự các trường hợp khác. Xét trường hợp tổng quát với count=i (i khác 1 và 5) và  Rx=100.10i. Khi R tải cần đo lớn hơn hoặc bằng Rx lúc này analogRead(A0)>513 và tăng count lên i+1. Còn R tải cần đo nhỏ hơn 10 lần so với Rx lúc này analogRead(A0)<93 và giảm count xuống i-1. Trường hợp i=1 thì chỉ có tăng chứ không giảm, i=5 chỉ có giảm chứ không tăng. Còn analogReference thì do khi qua cực E đến cực C của transistor, điện áp tại cực C không còn nguyên 5v và may mắn là điện áp tại Q7 xấp xỉ bằng nó nên mình đặt tiêu chuẩn analogReference tại đó luôn nhằm giảm sai số.

Cuối cùng, mọi thuật toán đều không thể tránh khỏi sai số (của mình khá lớn, lên đến 1%) nên mình xin góp ý từ các bạn để cải thiện thêm ạ. 

Bình luận
Nội dung này chưa có bình luận, hãy gửi bình luận đầu tiên của bạn.
VIẾT BÌNH LUẬN CỦA BẠN