6. Tởng quan tình hình nghiín cứu của đề tăi
3.4.5. Giải thuật đo lường đại lượng điện
Từ cơ sở của việc đo lường câc đại lượng điện của mạch điện đê được trình băy như ở mục trín, mục năy sẽ đề xuất giải thuật đo lường câc đại lượng đĩ để thiết lập chương trình trín phần mềm Arduino IDE vă sau đĩ nạp văo bo mạch Arduino Wemos để thực hiện câc chức năng đo đếm vă giâm sât điện năng của mạch điện.
Bắt đầu Gân câc biến ban đầu:
usquare = 0 isquare = 0 pinst = 0 k = 1 Đọc u(k) Đọc i(k)
usquare = usquare + u(k)×i(k) isquare = usquare + u(k)×i(k)
pinst = pinst + u(k)×i(k)
k = N? Yes square square rms rms inst rms rms u i U I N N p S U I P N P A P t cos S Kết thúc k = k + 1 No
Hình 3.9 thể hiện giải thuật đo lường câc đại lượng điện bao gồm: điện âp trị hiệu dụng Urms, dịng điện trị hiệu dụng Irms, cơng suất tâc dụng P, cơng suất biểu kiến S, hệ số cơng suất cosφ vă điện năng tiíu thụ của mạch điện. Câc bước của giải thuật như sau:
Bước 1: Bắt đầu
Bước 2: Gân câc giâ trị điện âp bình phương, dịng điện bình phương vă cơng
suất tức thời đều bằng 0:
square square inst
u 0; i 0; p 0 (3.16)
Bước 3: Gân k = 1
Bước 4: Đọc câc giâ trị điện âp lấy mẫu u(k) vă dịng điện lấy mẫu i(k) từ cảm biến điện âp ZMPT101B vă cảm biến dịng điện ACS712 đưa văo chđn đầu văo tương tự của Arduino Wemos.
Bước 5: Cập nhật giâ trị điện âp bình phương, dịng điện bình phương vă cơng suất tức thời từ mẫu mới đọc được:
square square square square inst inst u u u(k) u(k) i i i(k) i(k) p p u(k) i(k) (3.17)
Bước 6: Kiểm tra điều kiện mẫu thứ k cĩ bằng số mẫu N hay khơng (k = N?).
Bước 7: Nếu k < N thì quay lại Bước 5, cịn nếu k=N thì chuyển sang Bước 8.
Bước 8: Tính tôn giâ trị điện âp hiệu dụng Urms, dịng điện hiệu dụng Irms, cơng suất tâc dụng P, cơng suất biểu kiến S, cơng suất phản khâng Q, hệ số cơng suất cosφ vă điện năng tiíu thụ A.
square square inst
rms rms 2 2 rms rms u i p U ; I ; P ; N N N S U I ; Q S P ; A P t (3.18) Bước 9: Kết thúc
Đoạn chương trình con trong phần mềm Arduino IDE để tính tôn câc đại lượng điện: U, I, P, S, Q, A được thể hiện như sau:
void Measurement() {
unsigned long voltageAcc = 0; unsigned long currentAcc = 0; unsigned long powerAcc = 0; unsigned int count = 0;
unsigned long prevMicros = micros() - sampleInterval; while (count < numSamples)
{
if (micros() - prevMicros >= sampleInterval) {
int voltage_adc_raw = (analogRead(sensor_voltage) - voltage_adc_zero); int current_adc_raw = (analogRead(sensor_current) - current_adc_zero); voltageAcc += (unsigned long)(voltage_adc_raw * voltage_adc_raw); currentAcc += (unsigned long)(current_adc_raw * current_adc_raw); powerAcc += (unsigned long)(voltage_adc_raw * current_adc_raw); ++count;
prevMicros += sampleInterval; }
}
float Vrms = sqrt((float)voltageAcc/(float)numSamples) * (voltage_factor); float Irms = sqrt((float)currentAcc/(float)numSamples) * (current_factor);
float P = ((float)powerAcc1/(float)numSamples) * (voltage_factor * current_factor); voltage = Vrms;
current = Irms; power = P;
apparent = Vrms*Irms;
repower = sqrt(sq(apparent) - sq(power)); energy += power*1/3600;