0 đánh giá

Tự làm Máy Hiện Sóng (oscilloscope) với Arduino

Máy hiện sóng rất hữu dụng nhưng giá thành không hề rẽ, bài hướng dẫn này mình sẽ hướng dẫn các bạn làm sao để làm một chiếc máy hiện sóng giá rẽ dễ dàng.

Thông số: 

  • Khả năng lấy mẫu 50K mẫu/giây
    (Có thể đến 100K nhưng tín hiệu sẽ bị nhiễu)
  • Tự động trigger
  • Đếm tần số
  • Đọc chính sác điện áp (cần dùng điện trở chính xác cao).
  • Có thể chọn các giới hạn điện áp: 5V, 6.6V, 10V, 20V

Bước 1: Chuẩn bị linh kiện
  1. - 1 arduino 5V
  2. - 2 kẹp cá sấu hoặc đầu thử
  3. - 1 tụ 0.1µF
  4. - 1 Điốt Zener 5.1V
  5. - 1 Máy tính
  6. - Dây Nối
  7. - 2 Trở 3K, 1.5K, 1K
  8. -Board tự ráp
  9. - 2 nút nhấn 2 cực
Bước 2: Ráp mạch hiện sóng

   Dựa vào mạch nguyên lý ở trên, bạn tiến hành ráp mạch như hình trên

Bộ chia điện áp đầu vào (Bộ chia được thực hiện bởi R 1K và 3K).

       Ví dụ đầu dò đo điện 5V thì điện áp vào A0 là 5V/4 (Bộ chia được thực hiện bởi R 1K và 3K) vì vì vậy nếu bạn nối vào điện Áp 20V thì sau khi chia 4 đầu vào A0 là 5V sẽ không làm hỏng Arduino.  

Bộ chọn điện áp tham chiếu

       Các công tác sẽ có tác dụng thay đổi điện áp tham chiếu analog AREF thay vì 5V. Từ đó ta có thể đo được điện áp 5V, 6.64V, 10V, 20V. 

Với công tấc SWB1, SWB2.

  • Nếu 2 công tắc tắt thì AREF là 5V.
    Khi đó ADC sẽ đọc 1.25/5 = 25%
  • Nếu công tắc 1 tắc và công tắc 2 bật, thì AREF là 2.5V
    Khi đó ADC sẽ đọc 1.25/2.5 = 50%
  • Nếu công tắc 1 bật và công tắc 2 tắt, thì AREF là 1.66V
    Khi đó ADC sẽ đọc 1.25/1.66 = 75%
  • Nếu 2 công tắc bật, thì AREF là 1.25V
    Khi đó ADC sẽ đọc 1.25/1.25 = 100%

Với công tấc SWA1, SWA2.

      Chọn mức hiển thị điện áp

(CHÚ Ý CẨN THẬN KHÔNG ĐƯỢC ĐO ĐIỆN ÁP ÂM VÀ LỚN HƠN 20V NHÉ).

Bước 3: Chương trình nạp Aruino
#define bytesPerPackage 32
#define switch1 4               //sw1 pin
#define switch2 3               //sw2 pin

uint8_t bytesRead;
byte inputBuffer[bytesPerPackage];
byte outputBuffer[bytesPerPackage];
boolean sw1, sw2;

void setup() {
  pinMode(switch1, INPUT);
  digitalWrite(switch1, HIGH);  // enable internal pullup
  pinMode(switch2, INPUT);
  digitalWrite(switch2, HIGH);
  ADMUX =  B00000000;           // set external aref and port
  ADCSRA = B10101101;           // ADC enable, interrupt enable, set default prescaler
  ADCSRB = B00000000;           // free running mode
  sei();		        // enable interrupts
  ADCSRA |=B01000000;           // start first conversion
  Serial.begin(115200);
}

void loop() {
  sw1 = digitalRead(switch1);
  sw2 = digitalRead(switch2);
  if (bytesRead >= bytesPerPackage) {  // Buffer full. Send the package.
    cli();
    bytesRead = 0;
    for (uint8_t i = 0; i < bytesPerPackage; i += 2) {
      byte adch = inputBuffer[i];
      if (!sw1) adch |= B00001000;      // switch position in bits 10 & 11 of each byte pair 
      if (!sw2) adch |= B00000100;
      outputBuffer[i] = adch;
      outputBuffer[i+1] = inputBuffer[i+1];
    }
    sei();
    Serial.write(outputBuffer, bytesPerPackage);
  }
  
  if (Serial.available()) {                // incoming byte -> set prescaler
    byte inByte = (byte)Serial.read();
    cli();
    ADCSRA= B10101000|(inByte&B00000111);  // last 3 bytes of ADCSRA set the prescaler
    sei();
    ADCSRA |=B01000000;                    // start first conversion
  }
}

ISR(ADC_vect) {
  if(bytesRead<bytesPerPackage-1){
    inputBuffer[bytesRead+1] = ADCL;
    inputBuffer[bytesRead] = ADCH;
    bytesRead+=2;
  }
}

 

Bước 4: Chương trình hiển thị trên Máy tính

Bạn tải về phần mềm Processing tại đây

Tải 2 file scope về, đổi tên thành scope.pde vào mở bằng Processing, chạy chương trình lên kết nối Aruino qua cổng USB, chọn Port phù hợp.

Như vậy là bạn đã làm xong máy hiện sóng đơn giản cho mình, Chúc bạn thành công

 

(!) Nếu có bất kỳ thắc mắc nào cần hỏi vui lòng đặt câu hỏi tại HỏiHay.Net, Cộng đồng Hỏi đáp Hỏi Hay sẽ trả lời bạn.
2,107 lượt xem ^tháng ^ngày, ^năm
admin 2,030 điểm

Please log in or register to Comment this Media.