BASCOM


Miernik indukcyjności.



'MiernikL7a.bas

'Pomiar indukcyjności (oraz częstotliwości generatora).

'Pomiar cewek od ok. 0,1uH do mH.

'Miernik częstotliwości w układzie mierzy do 7MHz.

'Jeśli otrzymamy komunikat: "Przepelnienie" oznacza to, że generator oscyluje powyżej 7MHz (błąd).

'Wynik wyświetlany jest na Lcd.

'Mierzoną cewkę dołączamy do zacisków Lx.

'Celem dokładnego zmierzenia, równolegle do cewki możemy dołączać kondensator (wartość dowolna).

'Małe indukcyjności mierzymy w szereg ze znaną cewką.

'Pojemność C1 musi mieć dokładnie znaną pojemność (wpisujemy ją w podprogramie Oblicz1).

'Jeśli pojawi się wynik ujemny, oznacza to błąd lub niestabilna praca generatora.

'Tutaj miernik na Atmega8 z kwarcem 16MHz.

'Fusebit ustawiony na kwarc zewnętrzny 1111.

'Patrz sch. PomiarL7a.png.

'Opracował Henryk Wydmuch.

'Pamięć zajęta w 39%.

 

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'Sposób pomiaru:

'1. dołącz cewkę do zacisku Lx,

'2. naciśnij Reset,

'3. po wyświetleniu f1 naciśnij P1 i trzymaj tak długo, aż zaświeci dioda Led (D2).

'4. odczytaj wynik.

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

$regfile = "m8def.dat"                                      'Info dla kompilatora.

$crystal = 16000000                                         'Informujemy kompilator o kwarcu 16MHz.

 

 Config Lcd = 16 * 2                                        'Konfiguracja Lcd.

 Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5

 

 Config Timer0 = Timer , Prescale = 1                       'Timer0 jako Timer z podziałem przez 1.

 Config Timer1 = Counter , Edge = Falling                   'Timer1 jako licznik działający od zbocza opadającego.

 

 Config Pind.1 = Input                                      'Sterowany przyciskiem startu P1.

 Config Pind.3 = Output                                     'Led startu D2.

 Config Pind.5 = Input                                      'Konfiguruj Portd.5 jako wejście.

 Config Pinb.1 = Output                                     'Konfigurujemy Portb.1 dla tranzystora BC548.

 Set Portd.1                                                'Dołącz rezystor podciągający.

 Set Portd.3                                                'Dołącz rezystor podciągający.

 Reset Portb.1                                              '

 

 On Timer0 Odmierz_1s                                       'Podprogram dla Timera0 o nazwie Odmierz_1s.

 On Timer1 Zlicz_przep_tim1                                 'Podprogram dla Timera1.

 

 Dim Liczba_przerwan_tim0 As Word                           'Rezerwujemy dwa bajty w pamięci dla zmiennej Liczba_przerwan_tim0.

                                                             'Tu załadujemy liczbę przerwań Timera1.

 Dim Lczba_przep_tim1 As Byte                               'Rezewujemy jeden bajt dla zmiennej Liczba_przep_tim1.

                                                             'Tu załadujemy liczbę przerwań Timera0.

 Dim Flaga_aktual_lcd As Bit                                'Rezerwujemy jeden bit na aktualizację wyświetlacza Lcd.

 Dim Wynik_pomiaru As Single                                'Rezerwujemy cztery bajty dla zmiennej Wynik_pomiaru.

                                                             'Tu znajdzie się wynik pomiaru.

 Dim Z As String * 8                                        'Tu będzie słowny, pierwszy wynik pomiaru.

 Dim S As String * 8                                        'Tu będzie słowny, drugi wynik pomiaru.

 Dim Uh As String * 8                                       'Tu będzie słowny wynik obliczeń.

 Dim Wynik1 As Word                                         'Zapisany pierwszy wynik pomiaru.

 Dim Wynik2 As Word                                         'Zapisany drugi wynik pomiaru.

 Dim F1 As Single                                           'Częstotliwość po dołączeniu mierzonej cewki.

 Dim F2 As Single                                           'Częstotliwość po przyciśnięciu P1.

 Dim Cw As Single                                           'Kondensatory w układzie, (i ew. dołączony równolegle do cewki).

 Dim Lx As Single                                           'Wartość mierzonej cewki.

 Dim Cx As Word                                             'Kondensator dołączany.

 Dim Aw As Single                                           'Zmienna do obliczeń.

 Dim Bw As Single                                           'Zmienna do obliczeń.

 Dim Dw As Single                                           'Zmienna do obliczeń.

 Dim Ex As Single                                           'Zmienna do obliczeń.

 Dim Gx As Single                                           'Zmienna do obliczeń.

 

 Enable Interrupts                                          'Zezwalaj na wszystkie przerwania.

 Enable Timer0                                              'Odblokowujemy przerwanie Timera0.

 Enable Timer1                                              'Odblokowujemy przerwanie Timera1.

 

 Stop Timer0                                                'Zatrzymujemy Timer0.

 Stop Timer1                                                'Zatrzymujemy Timer1.

 

 Timer1 = 0                                                 'Zerujemy Timer1.

 Wynik_pomiaru = 0                                          'Zerujemy zmienną Wynik_pomiaru.

 Liczba_przerwan_tim0 = 0                                   'Zerujemy zmienną zawierającą liczbę przerwań Timera0.

 Lczba_przep_tim1 = 0                                       'Zerujemy zmienną zawierającą liczbę przerwań Timera1.

 Locate 2 , 1                                               '

 Lcd "Pomiar Indukcyjn."                                    'Napis po włączeniu.

 Wait 1                                                     'Trzymaj ten napis 1 sek.

 Cls                                                        '

 Start Timer1                                               '

 Start Timer0                                               '

 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

 Do                                                         'Start pętli głównej.

  If Flaga_aktual_lcd = 1 Then                              'Jeśli flaga aktualizacji Lcd włączona (po każdej sekundzie), to...

  Flaga_aktual_lcd = 0                                      'Zeruj flagę.

  'Jeśli generator nie oscyluje.

     If Wynik_pomiaru = 0 Then                              'Jeśli nie doprowadzono sygnału do wejścia...

     Cls                                                    'Czyść

     Lcd Wynik_pomiaru ;                                    'Pokaż wynik w LCD.

     Locate 2 , 1                                           'Druga linia Lcd, na początku...

     Cls                                                    'Czyść.

     Lcd " Brak sygnalu"                                    'Pokaż komunikat.

   End If                                                   'Koniec warunku pustej zmiennej Wynik_pomiaru.

  End If                                                    'Koniec warunku Flagi.

  Wait 1

''---------------------------------------------------

'Pierwszy pomiar (f1).

  Wynik_pomiaru = Wynik_pomiaru * 0.001                     'Tu doprowadzamy do odczytu w KHz.

  Wynik1 = Wynik_pomiaru                                    'Zawartość z Wynik_pomiaru wpisz do Wynik1.

  Writeeeprom Wynik1 , 1                                    'Zawartość Wynik1 zapisz do Eprom, adres 1.

  Wynik1 = 0                                                'Zeruj.

  Z = Str(wynik_pomiaru)                                    'Wartość w Wynik_pomiaru zamień na słowną.

  Locate 2 , 1                                              'W drugiej linii.

  Lcd "f1= " ; Z ;                                          'Pokaż ją na Lcd.

  Locate 2 , 12                                             'Pierwsza linia Lcd, 12 miejsce.

  Lcd " KHz   "                                             'Napisz KHz na Lcd.

  Wynik_pomiaru = 0                                         'Zeruj.

  Z = "        "                                            'Zeruj zmienną słowną.

  Wait 1                                                    'Dajemy czas na zmierzenie i zapisanie w Eprom.

 

'Start.

  'Naciśnięto P1(D1)

    If Pind.1 = 0 Then                                      'Jeśli naciśnięto Start...

    Set Portb.1                                             'Włącz tranzystor BC548 dodający większą pojemność.

    Toggle Portd.3                                          'Zaświeć Led D2.

    Gosub Petla1                                            'Skocz do podprogramu.

 

  End If                                                    'Koniec warunku.

 Loop                                                       'Powtórz pętlę.

 End                                                        'Koniec pętli głównej.

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

 Odmierz_1s:                                                'Podprogram dla Timera0 (wyznaczanie czasu bramkowania).

  Timer0 = 6                                                'Do Timera0 dodaj sześć i zapamiętaj jako Timer0 (zliczy 250).

  Incr Liczba_przerwan_tim0                                 'Liczbę przerwań Timera0 powiększ o jeden.

  If Liczba_przerwan_tim0 = 51121 Then                      'Jeśli liczba przerwań Timera0 jest równa 51121, to...

  'Liczbą 51121 ustalamy dokładny pomiar frekwencji.

  Liczba_przerwan_tim0 = 0                                  'Wyzeruj zmienną.

  Wynik_pomiaru = 65536 * Lczba_przep_tim1                  'Zmienną Liczba_przep_tim1 pomnóż przez 65536,

                                                            'a wynik wstaw do zmiennej Wynik_pomiaru.

  Wynik_pomiaru = Wynik_pomiaru + Timer1                    'Wynik powyższego działania dodaj do aktualnej zawartości

                                                            'Timera1 i ten wynik wpisz do zmiennej Wynik_pomiaru.

  Flaga_aktual_lcd = 1                                      'Załącz flagę aktualizacji Lcd.

  Lczba_przep_tim1 = 0                                      'Zeruj zmienną Timer1.

  Timer1 = 0                                                'Zeruj Timer1.

 End If                                                     'Koniec uwarunkowania.

 Return                                                     'Wróć do programu.

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

 Zlicz_przep_tim1:

  Enable Interrupts                                         'Podprogram Timera1 (przekroczenie zakresu).

  Incr Lczba_przep_tim1                                     'Zawartość zmiennej Liczba_przep_tim1 powiększ o jeden.

  If Lczba_przep_tim1 = 108 Then                            'Po 108 przepełnieniach Timer-a 1 (czyli po 6,82MHz)...

  Cls                                                       'Czyść LCD.

  Lcd "Przepelnienie"                                       'Wpisz komunikat.

  Locate 2 , 1                                              'Druga linia Lcd, na początku.

  Lcd "   licznika!"                                        'W drugiej linii wyświetl:

  Waitms 800                                                'Czekaj 1 sek.

 End If                                                     'Koniec warunku gdy będzie 108 przepełnień.

 Return                                                     'Wróć do programu.

 

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Petla1:                                                     'Po przyciśnięciu P1(Start).

'Generator oscyluje z dodatkową, większą pojemnością kondensatora.

Do

  Wynik_pomiaru = Wynik_pomiaru * 0.001                     'Tu doprowadzamy do odczytu w KHz.

  Wynik2 = Wynik_pomiaru                                    'Zawartość Wynik_pomiaru wpisz do Wynik2.

  Writeeeprom Wynik2 , 10                                   'Zawartość Wynik2 wpisz do Eprom, adres 10.

  Wynik2 = 0                                                'Zeruj.

  S = Str(wynik_pomiaru)                                    'Wartość w Wynik_pomiaru zamień na słowną.

  Wynik_pomiaru = 0                                         'Zeruj.

  Wait 1                                                    'Odczekaj 1sek.

  Gosub Oblicz1                                             'Skocz do podprogramu.

  Loop                                                      'Kręć pętlę.

End                                                         'Tu jest koniec tej pętli.

Return                                                      'Wróć do pierwszej pętli.

''--------------------

Oblicz1:                                                    'Podprogram Oblicz1.

  Readeeprom Wynik1 , 1                                     'Odczytaj z Eprom f1.

  Readeeprom Wynik2 , 10                                    'Odczytaj z Eprom f2.

  'Wykonaj działanie matematyczne.

    F1 = Wynik1 / 1000                                      '

    F2 = Wynik2 / 1000                                      '

    Cx = 5010                                               'Kondensator C1 w kolektorze BC548 o tolerancji 1%.

    Gx = F1 / F2                                            '

    Aw = Gx * Gx                                            '

    Bw = Aw - 1                                             '

    Cw = Cx / Bw                                            '

    Dw = F1 * F1                                            '

    Ex = Dw * Cw                                            '

    Lx = 25330 / Ex                                         '

    Uh = Str(lx)                                            'Wartość Lx zamieniona na słowną.

  Locate 2 , 1                                              'W drugiej linii.

  Lcd "f2= " ; S ;                                          'Pokaż ją na Lcd.

  Locate 2 , 12                                             'Pierwsza linia Lcd, 12 miejsce.

  Lcd " KHz "                                               'Napisz "KHz"

  Locate 1 , 1                                              'W pierwszej linii Lcd.

  Lcd "L= " ; Uh ;                                          'Pokaż wynik obliczeń.

  Locate 1 , 10                                             'Pierwsza linia Lcd, 10 miejsce.

  Lcd "   uH  "                                             'Napisz znak idukcyjności.

 Return                                                     'Wróć do Petla1.

 

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''