Mục lục:

Đo tần số và điện áp của nguồn điện bằng Arduino: 6 bước
Đo tần số và điện áp của nguồn điện bằng Arduino: 6 bước

Video: Đo tần số và điện áp của nguồn điện bằng Arduino: 6 bước

Video: Đo tần số và điện áp của nguồn điện bằng Arduino: 6 bước
Video: Học lập trình Arduino KHÔNG HỀ KHÓ - Bộ KIT học tập Arduino Uno R3 BLK 2024, Tháng mười một
Anonim
Đo tần số và điện áp của nguồn điện bằng Arduino
Đo tần số và điện áp của nguồn điện bằng Arduino

Giới thiệu:

Mục tiêu của dự án này là đo tần số và điện áp cung cấp, nằm trong khoảng từ 220 đến 240 Volts và 50Hz tại Ấn Độ. Tôi đã sử dụng Arduino để bắt tín hiệu và tính toán tần số và điện áp, bạn có thể sử dụng bất kỳ vi điều khiển hoặc bo mạch nào khác mà bạn có. Mạch yêu cầu một số ít các thành phần và khá chính xác cho tất cả các mục đích thực tế.

Bước 1: Các thành phần cần thiết

  • Arduino Uno
  • IC LM358
  • Biến áp bước xuống (220V xuống 12V)
  • Tụ điện:

    • 0,1uF
    • 2 x 1uF
  • Điện trở:

    • 3 x 1kOhm
    • 2 x 100kOhm
    • 1.5kOhm
    • 3,3kOhm
    • 6,8kOhm
  • 3 x 1N4148 diode
  • Bảng mạch bánh mì và dây Jumper (tùy chọn)

Bước 2: Sơ đồ

Sơ đồ
Sơ đồ
Sơ đồ
Sơ đồ

Trong mạch trên, sơ cấp của máy biến áp được kết nối với nguồn điện cung cấp và sơ cấp được kết nối với mạch đo của chúng tôi

Bước 3: Tìm hiểu mạch

Hiểu về mạch
Hiểu về mạch
Hiểu về mạch
Hiểu về mạch
Hiểu về mạch
Hiểu về mạch

Theo chức năng, mạch này có thể được chia thành bốn phần:

A: Mạch phát hiện cắt ngang 0

Mạch này tạo ra một xung vuông 5V bất cứ khi nào sóng sinewave đi từ dương sang âm. Điện trở R1 kết hợp với D1 và D2 giới hạn dao động điện áp đầu vào tại điểm giao nhau điốt là -0,6V đến + 5,6V (giả sử điện áp chuyển tiếp của diode là 0,6V). Hơn nữa, bạn có thể tăng dải điện áp đầu vào của mạch bằng cách tăng giá trị của R1.

Điện trở R2 và R3 tạo thành một bộ phân áp để giới hạn dao động điện áp âm xuống -0,24Volt vì điện áp chế độ chung đầu vào của LM358 được giới hạn ở -0,3Volt.

Điện trở R4, R5, tụ điện C1 và op-amp (ở đây được sử dụng như một bộ so sánh) tạo thành mạch Schmitt Trigger trong đó điện trở R4 và R5 đặt độ trễ ở đầu vào + 49,5mV so với mặt đất. Đầu ra của Schmitt Trigger được cấp cho Arduino PIN2 để xử lý thêm.

B: Cách ly và giảm điện áp

Như tên cho thấy phần này cô lập và giảm điện áp xuống khoảng 12Vrms. Điện áp bước xuống được tiếp tục cấp cho mạch thiết bị đo.

C: Mạch dò đỉnh

Mạch này xác định điện áp đỉnh tối đa của tín hiệu đầu vào. Bộ chia điện trở R6 và R7 giảm điện áp đầu vào một hệ số 0,23 (12Vrms được giảm xuống 2,76Vrms). Diode D3 chỉ dẫn nửa chu kỳ tích cực của tín hiệu. Điện áp trên C2 tăng lên đến giá trị đỉnh của tín hiệu đã được chỉnh lưu, được đưa đến chân A0 tương tự của Arduino để tính toán thêm điện áp.

Ngoài ra, bạn có thể thay thế mạch này bằng một mạch dò đỉnh chính xác như được đề cập ở đây. Nhưng đối với mục đích trình diễn của tôi, mạch trên sẽ là đủ.

D: Arduino

Trong phần này, Arduino bắt các xung vuông được tạo ra bởi mạch Schmitt Trigger và đọc điện áp tương tự từ mạch dò đỉnh. Dữ liệu được tiếp tục xử lý để xác định khoảng thời gian (do đó tần số) của xung vuông (bằng với thời gian của nguồn cung cấp xoay chiều) và điện áp của nguồn cung cấp.

Bước 4: Tính toán tần số và điện áp

Tính toán tần số:

Với sự trợ giúp của Arduino, chúng ta có thể đo khoảng thời gian T của tín hiệu. Các xung sóng vuông từ bộ tách sóng 0 được đưa đến chân 2, từ đó chúng ta có thể đo khoảng thời gian của mỗi xung. Chúng ta có thể sử dụng bộ đếm thời gian bên trong của Arduino (cụ thể là Timer1) để tính toán khoảng thời gian giữa hai cạnh Tăng của xung vuông với sự trợ giúp của các ngắt. Bộ đếm thời gian tăng 1 mỗi chu kỳ đồng hồ (không có bộ đếm trước = 1) và giá trị được lưu trong thanh ghi TCNT1. Do đó, xung nhịp 16Mhz tăng bộ đếm lên 16 mỗi micro giây. Tương tự như vậy đối với prescaler = 8, bộ đếm thời gian được tăng thêm 2 mỗi micro giây. Do đó khoảng thời gian giữa hai cạnh tăng

T = (giá trị TCNT1) / thời gian thực hiện cho mỗi lần đếm

Trong đó, thời gian thực hiện cho mỗi lần đếm = prescaler / (Tốc độ xung nhịp Arduino (16MHz)

Do đó, tần số f = 1 / T = (Tốc độ xung nhịp Arduino (16MHz) / (Prescaler * giá trị TCNT!)

Do đó, tốc độ bộ hẹn giờ (Hz) được cung cấp bởi = (tốc độ đồng hồ Arduino (16MHz)) / bộ định mức

và tần số của tín hiệu được cho bởi = (tốc độ đồng hồ Arduino

Tương ứng, chúng ta có thể tính tần số f từ quan hệ f = 1 / T.

Tính toán điện áp:

ADC tích hợp của Arduino có độ phân giải 10 bit (giá trị có thể = 2 ^ 10 = 1024), trả về giá trị trong khoảng 0-1023. Để tính toán điện áp tương tự V tương ứng, chúng ta phải sử dụng quan hệ sau

V = (ADC Reading) * 5/1023

Để tính toán điện áp cung cấp Vs (rms), chúng ta phải tính đến Tỷ lệ biến áp, Bộ chia điện trở R6R7 và mạch dò đỉnh. Chúng ta có thể chỉ cần tổng hợp các yếu tố / tỷ lệ khác nhau như:

Tỷ lệ biến áp = 12/230 = 0,052

Bộ chia điện trở = R7 / (R6 + R7) = 0,23

Tại mạch dò đỉnh = 1.414

Vs (rms) = V / (1.414 * 0.052 * 0.23) = (ADC Reading) * 0.289

Cần lưu ý rằng giá trị này khác xa giá trị thực, chủ yếu là do sai số trong tỷ lệ biến áp thực tế và sự sụt giảm điện áp chuyển tiếp của diode. Một cách để phá vỡ điều này là xác định yếu tố sau khi lắp ráp mạch. Đó là bằng cách đo điện áp nguồn và điện áp trên tụ C2 riêng biệt bằng đồng hồ vạn năng, sau đó tính Vs (rms) như sau:

Vs (rms) = ((Điện áp cung cấp * 5) / (Điện áp trên C2 * 1023)) * (Đọc ADC)

trong trường hợp của tôi, Vs (rms) = 0,33 * (ADC Reading)

Bước 5: Mã Arduino

#define volt_in A0 // chân đọc điện áp tương tự

uint16_t t_period dễ bay hơi; uint16_t ADC_value = 0; float volt, freq; void isr () {t_period = TCNT1; // lưu trữ giá trị TCNT1 trong t_period TCNT1 = 0; // đặt lại Timer1 ADC_value = analogRead (volt_in); // đọc điện áp tương tự} float get_freq () {uint16_t timer = t_period; if (timer == 0) return 0; // để tránh chia cho 0 else return 16000000.0 / (8UL * timer); // tần số được cho bởi f = clk_freq / (prescaler * timeperiod)} void setup () {TCCR1A = 0; TCCR1B = bit (CS11); // đặt prescaler thành 8 TCNT1 = 0; // đặt lại giá trị Timer1 TIMSK1 = bit (TOIE1); // cho phép ngắt tràn Timer1 EIFR | = bit (INTF0); // xóa cờ ngắt INT0 Serial.begin (9600); } void loop () {attachmentInterrupt (0, isr, RISING); // cho phép ngắt ngoài (INT0) delay (1000); detachInterrupt (0); freq = get_freq (); vôn = ADC_value * 0,33; Chuỗi buf; buf + = String (freq, 3); buf + = F ("Hz / t"); buf + = String (vôn); buf + = F ("Vôn"); Serial.println (buf); }

Bước 6: Kết luận

Phần kết luận
Phần kết luận
Phần kết luận
Phần kết luận

Bạn có thể lắp ráp mạch trong breadboard và chỉnh sửa mã và thêm thẻ SD để lưu trữ dữ liệu, sau này có thể phân tích dữ liệu này. Một ví dụ như vậy là, bạn có thể phân tích điện áp và tần số vào giờ cao điểm.

Mạch mà tôi lắp ráp trong breadboard được sử dụng LM324 (quad opamp) thay vì LM358 (dual opamp) vì tôi không có IC đó tại thời điểm đó và việc khóa toàn quốc do đại dịch COVID-19 khiến tôi gặp khó khăn trong việc lấy IC mới.. Tuy nhiên, nó sẽ không ảnh hưởng đến hoạt động của mạch.

Vui lòng bình luận bên dưới nếu có bất kỳ đề xuất và thắc mắc nào.

Đề xuất: