Mündəricat:

Arduino istifadə edərək Güc Təchizatı Tezliyi və Gərginlik Ölçülməsi: 6 addım
Arduino istifadə edərək Güc Təchizatı Tezliyi və Gərginlik Ölçülməsi: 6 addım

Video: Arduino istifadə edərək Güc Təchizatı Tezliyi və Gərginlik Ölçülməsi: 6 addım

Video: Arduino istifadə edərək Güc Təchizatı Tezliyi və Gərginlik Ölçülməsi: 6 addım
Video: DHT11, DHT22 və L298N istifadə Temperaturu olan motor sürətini idarə edin 2024, Noyabr
Anonim
Arduino istifadə edərək Güc Təchizatı Tezliyi və Gərginlik Ölçülməsi
Arduino istifadə edərək Güc Təchizatı Tezliyi və Gərginlik Ölçülməsi

Giriş:

Bu layihənin məqsədi Hindistanda 220-240 Volt və 50Hz arasında olan təchizat tezliyini və gərginliyi ölçməkdir. Siqnal çəkmək, tezliyi və gərginliyi hesablamaq üçün bir Arduino istifadə etdim, sahib olduğunuz hər hansı digər mikrokontrolördən və ya lövhədən istifadə edə bilərsiniz. Dövrə bir ovuc komponent tələb edir və bütün praktik məqsədlər üçün olduqca dəqiqdir.

Addım 1: Tələb olunan komponentlər

  • Arduino Uno
  • IC LM358
  • Eniş transformatoru (220V -dan 12V -a qədər)
  • Kondansatörler:

    • 0.1uF
    • 2 x 1 uF
  • Rezistorlar:

    • 3 x 1kOhm
    • 2 x 100kOhm
    • 1.5kOhm
    • 3.3 kOhm
    • 6.8kOhm
  • 3 x 1N4148 diod
  • Çörək taxtası və tullanan tel (isteğe bağlı)

Addım 2: Şematik Diaqram

Şematik Diaqram
Şematik Diaqram
Şematik Diaqram
Şematik Diaqram

Yuxarıda göstərilən dövrədə, transformator birincisi təchizat şəbəkəsinə, birincisi isə ölçmə sxemimizə bağlıdır

Addım 3: Dövrəni anlayın

Dövrəni anlamaq
Dövrəni anlamaq
Dövrəni anlamaq
Dövrəni anlamaq
Dövrəni anlamaq
Dövrəni anlamaq

Fəaliyyətinə görə, bu dövrəni dörd hissəyə bölmək olar:

A: Sıfır Keçid Dedektörü dövrəsi

Sinir dalğası pozitivdən neqativə keçəndə bu dövrə 5V kvadrat nəbz yaradır. D1 və D2 ilə birlikdə R1 rezistoru, diod qovşağında giriş gərginliyinin salınmasını -0.6V -dən +5.6V -ə qədər məhdudlaşdırır (diodun irəli gərginliyinin 0.6V olacağı ehtimal edilir). Bundan əlavə, R1 dəyərini artıraraq dövrənin giriş gərginliyi aralığını artıra bilərsiniz.

R2 və R3 rezistoru, mənfi gərginliyin salınmasını -0.24Volt ilə məhdudlaşdırmaq üçün bir gərginlik bölücü təşkil edir, çünki LM358 -in giriş ümumi rejim gərginliyi -0.3Volts ilə məhdudlaşır.

R4, R5, kondansatör C1 və op-amp (burada müqayisəçi kimi istifadə olunur), R4 və R5 müqavimətinin yerdən +49.5mV girişində histerezisi təyin etdiyi Schmitt Trigger sxemini təşkil edir. Schmitt Trigger -in çıxışı sonrakı emal üçün Arduino PIN2 -ə verilir.

B: İzolyasiya və Gərginlik Aşağı

Adından da göründüyü kimi, bu hissə gərginliyi təxminən 12Vrms -ə qədər ayırır və aşağı salır. Azaldılmış gərginlik daha sonra cihazların dövrəsinə verilir.

C: Peak Detector dövrəsi

Bu dövrə giriş siqnalının maksimum pik gərginliyini təyin edir. Rezistor bölücü R6 və R7 giriş gərginliyini 0,23 dəfə azaldır (12Vrms 2,76Vrms -ə endirilir). Diod D3 siqnalın yalnız müsbət yarım dövrəsini keçirir. C2 üzərindəki gərginlik, gərginliyi daha da hesablamaq üçün Arduino analog pin A0 -a verilən düzəldilmiş siqnalın pik dəyərinə qədər artır.

Əlavə olaraq, bu dövrəni burada qeyd edildiyi kimi dəqiq bir pik detektor dövrə ilə əvəz edə bilərsiniz. Ancaq nümayiş məqsədlərim üçün yuxarıdakı sxem kifayət edər.

D: Arduino

Bu hissədə, Arduino, Schmitt Trigger dövrəsinin yaratdığı kvadrat impulsları tutur və pik detektor sxemindən analoq gərginliyi oxuyur. Məlumatlar, kvadrat nəbzinin (AC təchizatı vaxtına bərabər olan) vaxt dövrünü (dolayısı ilə tezliyi) və təchizatın gərginliyini təyin etmək üçün daha da işlənir.

Addım 4: Tezlik və Gərginliyin Hesablanması

Tezliyin hesablanması:

Arduinonun köməyi ilə siqnalın T müddətini ölçə bilərik. Sıfır kəsişmə detektorundan alınan kvadrat dalğa pulsları pin 2-yə verilir, oradan hər nəbzin müddətini ölçə bilərik. Arduino -nun daxili taymerindən (xüsusi olaraq Timer1) istifadə edərək kəsilmələrin köməyi ilə kvadrat nəbzinin iki yüksələn kənarı arasındakı vaxt müddətini hesablaya bilərik. Taymer saat dövrü başına 1 artır (prescaler olmadan = 1) və dəyər TCNT1 reyestrində saxlanılır. Beləliklə, 16Mhz saatı sayğacı hər mikrosaniyədə 16 artırır. Eynilə prescaler = 8 üçün zamanlayıcı hər mikrosaniyədə 2 artırılır. Beləliklə, iki yüksələn kənar arasındakı müddət

T = (TCNT1 dəyəri) / hər sayım üçün alınan vaxt

Har bir sayım üçün alınan vaxt = prescaler / (Arduino saat sürəti (16MHz)

Beləliklə, f = 1 / T = (Arduino saat sürəti (16MHz) / (Prescaler * TCNT! Dəyəri) tezliyi

Beləliklə, taymer sürəti (Hz) = (Arduino saat sürəti (16MHz)) / prescaler ilə verilir

və siqnalın tezliyi = (Arduino saat sürəti) ilə verilir

Müvafiq olaraq, f tezliyini f = 1/T əlaqəsindən hesablaya bilərik.

Gərginliyin hesablanması:

Arduinonun ADC-nin 10 bitlik bir qətnaməsi var (mümkün dəyərlər = 2^10 = 1024), dəyərləri 0-1023 aralığına qaytarır. Müvafiq analog gərginliyi V hesablamaq üçün aşağıdakı əlaqəni istifadə etməliyik

V = (ADC Oxu) * 5/1023

Təchizat gərginliyini Vs (rms) hesablamaq üçün Transformator Oranı, Rezistor bölücü R6R7 və pik detektor dövrəsini nəzərə almalıyıq. Sadəcə olaraq müxtəlif faktorları/nisbəti bir araya gətirə bilərik:

Transformator nisbəti = 12/230 = 0.052

Rezistor bölücü = R7/(R6 + R7) = 0.23

Maksimum detektor dövrəsi = 1.414

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

Qeyd etmək lazımdır ki, bu dəyər faktiki dəyərdən çox uzaqdır, əsasən faktiki transformator nisbətindəki səhv və diodun irəli gerilim düşməsi səbəbindən. Bunun qarşısını almağın bir yolu, dövrə yığdıqdan sonra faktoru müəyyən etməkdir. Yəni, təchizat gərginliyini və C2 kondansatöründəki gərginliyi bir multimetr ilə ayrı -ayrılıqda ölçərək, Vs (rms) aşağıdakı kimi hesablayaraq:

Vs (rms) = ((Təchizat Gerilimi *5)/(C2 *1023 üzərindəki gərginlik)) *(ADC oxunması)

mənim vəziyyətimdə Vs (rms) = 0.33*(ADC Oxu)

Addım 5: Arduino Kodu

#A0 -da volt təyin edin // analoq gərginlik oxu

uçucu uint16_t t_period; uint16_t ADC_value = 0; üzən volt, tezlik; boş isr () {t_period = TCNT1; // TCNT1 dəyərini t_periodda saxla TCNT1 = 0; // sıfırlama Timer1 ADC_value = analogRead (volt_in); // analoq gərginliyi oxuyun} float get_freq () {uint16_t timer = t_period; if (timer == 0) 0 qaytar; // sıfıra bölünməmək üçün başqa 16000000.0/(8UL*timer) qaytarın; // tezlik f = clk_freq/(prescaler*timeperiod)} tərəfindən verilir void setup () {TCCR1A = 0; TCCR1B = bit (CS11); // prescaler -ı 8 TCNT1 = 0 olaraq təyin edin; // Timer1 dəyərini sıfırlayın TIMSK1 = bit (TOIE1); // Timer1 daşqınını dayandırmaq EIFR | = bit (INTF0); // aydın INT0 kəsmə bayrağı Serial.begin (9600); } void loop () {attachInterrupt (0, isr, RISING); // xarici kəsilmə (INT0) gecikməsini aktivləşdir (1000); detachInterrupt (0); freq = get_freq (); volt = ADC_ dəyəri*0.33; String buf; buf += String (tezlik, 3); buf += F ("Hz / t"); buf += String (volt); buf += F ("Volt"); Serial.println (buf); }

Addım 6: Nəticə

Nəticə
Nəticə
Nəticə
Nəticə

Dövrəni bir çörək taxtasına yığa və kodu düzəldə və məlumatları saxlamaq üçün bir SD Kart əlavə edə bilərsiniz ki, bu da sonradan təhlil edilə bilər. Buna misal olaraq, pik saatlarda gərginliyi və tezliyi təhlil edə bilərsiniz.

Çörək taxtasına yığdığım sxem, o anda IC olmadığından LM358 (ikili opamp) əvəzinə LM324 (dörd opamp) istifadə etdi və COVID-19 pandemiyası səbəbindən ümummilli kilidləmə yeni bir IC əldə etməyimi çətinləşdirdi.. Buna baxmayaraq, dövrənin işinə təsir etməyəcək.

Hər hansı bir təklif və sorğu üçün aşağıda şərh etməkdən çekinmeyin.

Tövsiyə: