Bascom

Miernik odległości dwóch metalowych przedmiotów


Jak to działa

Urządzenie mierzy odległość między jakimiś małymi przedmiotami. Odległość może wynosić max. 10cm. Odległość pokazywana jest diodami Led D5 - D13 w dziesięciu skokach.
Generator 100KHz jest miernikiem pojemności, jego frekwencja zmienia się wraz z pojemnością mierzoną. Częstotliwość generatora jest odczytywana przez procesor. Odczytywanie odbywa się z szybkością 1/6sek. Lcd pokazuje więc 1/6 właściowej częstotliwości. Droga pomiędzy mierzonymi przedmiotami została podzielona na 10 części. Na każdym odcinku jest inna pojemność, inna częstotliwość generatora. Adekwatnie do tych częstotliwości, na 10 portach pojawia się sukcesywnie poziom wysoki. Poziom ten, przez odpowiednie wartości rezystancji steruje generatorem 1 - 10KHz. Ten generator steruje przetwornikiem f/U, którego napięcie wyjściowe jest informacją.

'RO9.bas

'Urządzenie reagujące na odległość pomiędzy dwoma płytkami.

'Mierzy odległość dwóch płytek od siebie.

'Częstotliwość jest odczytywana miernikiem częstotliwości na Atmega8.

'Przetwornik f/U (LM331) odczytuje frekwencję generatora sterowanego przez procesor.

'Przy odległościach poniżej 4mm i powyżej 4cm na przetworniku f/U pojawi się 0.

'Zliczanie frekwencji co 1/6sek.

'Fusebit ustawiony na kwarc zewnętrzny 1111.

'Opracował Henryk Wydmuch.

'Pamięć zajęta w 32%.

'Lcd potrzebny jest do kalibracji urządzenia, potem można go odłączyć.

 

$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.0 = Output                                     'Blokowanie wyjścia U.

 Config Pind.1 = Output                                     '

 Config Pind.2 = Output                                     '

 Config Pind.3 = Output                                     '

 Config Pind.4 = Output                                     '

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

 Config Pind.6 = Output                                     '

 Config Pind.7 = Output                                     '

 Config Pinb.0 = Output                                     '

 Config Pinb.1 = Output                                     '

 Config Pinb.2 = Output                                     '

 Set Portd.0                                                '

 Reset Portd.1                                              '

 Reset Portd.2                                              '

 Reset Portd.3                                              '

 Reset Portd.4                                              '

 Reset Portd.6                                              '

 Reset Portd.7                                              '

 Reset Portb.0                                              '

 Reset Portb.1                                              '

 Reset Portb.2                                              '

 

 On Timer0 Odmierz_1s                                       'Podprogramdla Timera0 o nazwie Odmierz_1s.

 

 Dim Liczba_przerwan_tim0 As Long                           'Liczba_przerwan_tim0. Tu załadujemy liczbę przerwań Timera0.

 Dim Lczba_przep_tim1 As Word                               'Tu załadujemy liczbę przerwań Timera1.

 Dim Wynik_pomiaru As Single                                'Tu znajdzie się wynik pomiaru.

 Dim Z As String * 7                                        'Z jako zmienna słowna z siedmioma miejscami.

 Dim Gener As Word                                          'Przepełnienia Timer0.

 Declare Sub Hz                                             'Deklaracja procedury.

 

 Enable Interrupts                                          'Zezwalaj na wszystkie przerwania.

 Enable Timer0                                              'Odblokowujemy przerwanie Timera0.

 Enable Timer1                                              'Odblokowujemy przerwanie Timera1.

 

 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.

 Cls

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

Do                                                          'Start pętli głównej.

'Wynik_pomiaru zawiera liczbę, którą trzeba pomnożyć X 6 w odczycie (bo czas pomiaru skrócono 6X).

     If Wynik_pomiaru < 15880 Then                          'Poniżej 4mm płutek między sobą...

     Reset Portd.0                                          'Blokuj Uwy.

 Reset Portd.1                                              '

 Reset Portd.2                                              '

 Reset Portd.3                                              '

 Reset Portd.4                                              '

 Reset Portd.6                                              '

 Reset Portd.7                                              '

 Reset Portb.0                                              '

 Reset Portb.1                                              '

 Reset Portb.2                                              '

     Call Hz                                                'Wywołaj procedurę Lcd.

  Else                                                      'W przeciwnym razie...                                                   '

'---------

     If Wynik_pomiaru < 17700 Then                          '

     Set Portb.2                                            'Dodaj 77k

 Reset Portd.1                                              '

 Reset Portd.2                                              '

 Reset Portd.3                                              '

 Reset Portd.4                                              '

 Reset Portd.6                                              '

 Reset Portd.7                                              '

 Reset Portb.0                                              '

 Reset Portb.1                                              '

 'Reset Portb.2                                              '

     Call Hz                                                'Wywołaj procedurę Lcd.

  Else

     If Wynik_pomiaru < 18500 Then

     Set Portb.1                                            'Dodaj 37,6k.

 Reset Portd.1                                              '

 Reset Portd.2                                              '

 Reset Portd.3                                              '

 Reset Portd.4                                              '

 Reset Portd.6                                              '

 Reset Portd.7                                              '

 Reset Portb.0                                              '

 'Reset Portb.1                                              '

 Reset Portb.2                                              '

     Call Hz

  Else

     If Wynik_pomiaru < 18800 Then

     Set Portb.0                                            'Dodaj 25k.

 Reset Portd.1                                              '

 Reset Portd.2                                              '

 Reset Portd.3                                              '

 Reset Portd.4                                              '

 Reset Portd.6                                              '

 Reset Portd.7                                              '

 'Reset Portb.0                                              '

 Reset Portb.1                                              '

 Reset Portb.2                                              '

     Call Hz

  Else

     If Wynik_pomiaru < 19000 Then

     Set Portd.7                                            'Dodaj 18,3k.

 Reset Portd.1                                              '

 Reset Portd.2                                              '

 Reset Portd.3                                              '

 Reset Portd.4                                              '

 Reset Portd.6                                              '

 'Reset Portd.7                                              '

 Reset Portb.0                                              '

 Reset Portb.1                                              '

 Reset Portb.2                                              '

     Call Hz

  Else

     If Wynik_pomiaru < 19140 Then

     Set Portd.6                                            'Dodaj 14,6k.

 Reset Portd.1                                              '

 Reset Portd.2                                              '

 Reset Portd.3                                              '

 Reset Portd.4                                              '

 'Reset Portd.6                                              '

 Reset Portd.7                                              '

 Reset Portb.0                                              '

 Reset Portb.1                                              '

 Reset Portb.2                                              '

     Call Hz

  Else

     If Wynik_pomiaru < 19200 Then

     Set Portd.4                                            'Dodaj 12,2k.

 Reset Portd.1                                              '

 Reset Portd.2                                              '

 Reset Portd.3                                              '

 'Reset Portd.4                                              '

 Reset Portd.6                                              '

 Reset Portd.7                                              '

 Reset Portb.0                                              '

 Reset Portb.1                                              '

 Reset Portb.2                                              '

     Call Hz

  Else

     If Wynik_pomiaru < 19300 Then

     Set Portd.3                                            'Dodaj 10,4k.

 Reset Portd.1                                              '

 Reset Portd.2                                              '

 'Reset Portd.3                                              '

 Reset Portd.4                                              '

 Reset Portd.6                                              '

 Reset Portd.7                                              '

 Reset Portb.0                                              '

 Reset Portb.1                                              '

 Reset Portb.2                                              '

     Call Hz

  Else

     If Wynik_pomiaru < 19340 Then

     Set Portd.2                                            'Dodaj 9k.

 Reset Portd.1                                              '

 'Reset Portd.2                                              '

 Reset Portd.3                                              '

 Reset Portd.4                                              '

 Reset Portd.6                                              '

 Reset Portd.7                                              '

 Reset Portb.0                                              '

 Reset Portb.1                                              '

 Reset Portb.2                                              '

     Call Hz

  Else

     If Wynik_pomiaru < 19365 Then

     Set Portd.1                                            'Dodaj 7,7k.

 'Reset Portd.1                                          '

 Reset Portd.2                                              '

 Reset Portd.3                                              '

 Reset Portd.4                                              '

 Reset Portd.6                                              '

 Reset Portd.7                                              '

 Reset Portb.0                                              '

 Reset Portb.1                                              '

 Reset Portb.2                                              '

     Call Hz

  Else

    If Wynik_pomiaru > 19365 Then                           'Powyżej 4cm płytek między sobą...

    Reset Portd.0                                           'Blokuj Uwy.

 Reset Portd.1                                              '

 Reset Portd.2                                              '

 Reset Portd.3                                              '

 Reset Portd.4                                              '

 Reset Portd.6                                              '

 Reset Portd.7                                              '

 Reset Portb.0                                              '

 Reset Portb.1                                              '

 Reset Portb.2                                              '

     Call Hz                                                'Wywołaj procedurę Lcd.

 

  End If                                                    '

  End If                                                    '

  End If                                                    '

  End If

  End If                                                    '

  End If                                                    '

  End If                                                    '

  End If                                                    '

  End If                                                    '

  End If                                                    '

  End If                                                    '

 

 Loop                                                       'Powtórz pętlę.

 End                                                        'Koniec pętli.

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

 Odmierz_1s:                                                'Podprogram dla Timera0 (wyznaczanie 1/6sek).

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

  If Liczba_przerwan_tim0 = 10400 Then                      'Jeśli liczba przerwań Timera0 jest równa 10400, (co 1/6sek)...

  'Liczbą 20800 ustalamy dokładny pomiar.

  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.

  Lczba_przep_tim1 = 0                                      'Zeruj zmienną przepełnień Timera1.

  Timer1 = 0                                                'Zeruj Timer1.

   End If                                                   'Koniec uwarunkowania.

 Return                                                     'Wróć do programu.

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

Sub Hz                                                      'Procedura.

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

  Home                                                      'Trzymaj wynik w jednym miejscu.

  Lcd Z ; " Hz      ";                                      'Pokaż ją na Lcd.

  End Sub                                                   'Koniec procedury.

  Return                                                    'Wróć do pętli.

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

'Koniec.