Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[Atmega8][Bascom] Mini komputer do Fiata Cinquecento 700

cinek_14 18 Feb 2010 22:01 4734 12
IGE-XAO
  • #1
    cinek_14
    Level 12  
    Witam na wstępie chciałem powiedzieć, że nie jestem dobry w programowaniu, bo dopiero zaczynam i mnie to powoli wciąga. Mam parę pytań i postanowiłem napisać. Chce zrobić sobie taki mini komputer pokładowy do Fiata Cinquecento 700. Ten mały układ ma wskazywać temperaturę w środku samochodu i na zewnątrz a tak, że będzie pokazywać napięcie, jakim jest ładowany akumulator i ostatnia sprawa, do której nie mam pojęcia jak się zabrać to pokazywanie ile paliwa zostało w baku. Układ mam już częściowo zrobiony tylko mam jeden problem, co do mierzenia ile paliwa zostało w baku. Nie mam pojęcia jak się do tego zabrać jak w ogóle go można podłączyć do µC i jak napisać funkcje w programie. W książce znalazłem dane tego czujnika, który znajduje się w baku:
    -rezystancja styków ślizgowych to ≤500mΩ
    -zbiornik pełny 0...7Ω to jest 35 litrów
    -zbiornik pusty 290...320Ω to jest 0 litrów
    I jeszcze chciałbym, aby ktoś sprawdził mi to, co zrobiłem do tej pory.
    Dołączam program, który po częściowo udało mi się znaleźć w sieci i złożyć w całość a także schemat, który sam zrobiłem i fragment schematu z książki.


    Skan schematu z książki
    Schemat do programu


    Code:

    $regfile = "m8def.DAT"                                      'deklaracja procesora, w tym wypadku Atmega8
    $crystal = 1200000                                          'deklaracja cześtotlwiości pracy (wew oscylator 1MHz w zupełności wystarcza)
    'Deklaracja portów od wyświetlacza LCD
    Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5 , E = Portd.1 , Rs = Portd.0

    Config Lcd = 16 * 2                                         'ustawiamy typ wyświetlacza (soft jest dostosowany do pracy z wyświetlaczem 2x20, przy pracy z innym wyświetlaczem trzeba będzie skorygować wyświetlanie znaków)

    '*************************************WAŻNE**********************************************
    'Pamiętać o podłączeniu rezystora podciągającego o wartości 4.7kohm między linią DQ a VCC
    Config 1wire = Portc.2                                      'deklaracja portu na którym będą podpięte DS18b20
    Config Adc = Single , Prescaler = Auto , Reference = Avcc   'konfiguracja wewnętrznego
          'przetwornika A/C
    Config Pind.0 = Input
    Dim I1 As Integer , Ss As String * 6
    Dim I2 As Integer



    Dim Dsid1(8) As Byte
    Dim Dsid2(8) As Byte
    Dim B As Byte                                               'deklaracja zmiennej do odczytu kodów ID
    Dim W As Byte                                               'deklaracja zmiennej do odczytu ilośc czujników
    Dim Wart_ac As Word                                         'zmienna na wartość odczytaną
          'z przetwornika
    Dim V As Single                                             'zmienna przechowująca obliczoną
          'wartość zmierzonego napięcia
    Dim Wart_nap As String * 4                                  'zmienna, do której wpisywana
          'zostaje przetworzona wartość
          'zmiennej V na tekst
    Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32             'znak stopnia Celsjusza
    Deflcdchar 1 , 32 , 32 , 12 , 31 , 27 , 17 , 27 , 31        'akumulator +
    Deflcdchar 2 , 32 , 32 , 6 , 31 , 31 , 17 , 31 , 31         'alumulator -
    Cursor Off                                                  'Wyłącza kursor
    Cls
    Waitms 250
    W = 1wirecount()
    Cls                                                         'Znajdź pierwszy czujnik podpięty do portu
    Dsid1(1) = 1wsearchfirst()                                  'Znajdź kolejny czujnik podpięty do portu
    Dsid2(1) = 1wsearchnext()                                   'Znajdź kolejny czujnik podpięty do portu

    '*******************Odczyt numerów ID czujników temperatury*********************

    If Dsid1(8) = Crc8(dsid1(1) , 7) Then                       'ta opcja pojawia się tylko przy włączaniu urządzenia
      For B = 1 To 8
     Next
    End If


    If Dsid2(8) = Crc8(dsid2(1) , 7) Then
      For B = 1 To 8
     Next
    End If
    Waitms 250
    Waitms 250


    Cls

    '*******************koniec odczytu ID czujników temperatury*********************

    Do
       1wreset
       1wwrite &H55 2
       1wverify Dsid1(1)                                        'wysyłamy adres pierwszego czujnika
       1wwrite &HBE
       I1 = 1wread(2)
    '---------------------------------
       1wreset
       1wwrite &H55
       1wverify Dsid2(1)                                        'wysylam adres drugiego czujnika
       1wwrite &HBE
       I2 = 1wread(2)
     '---------------------------------
    '--------konwersja temp dla wszystkich dsow
       1wreset
       1wwrite &HCC
       1wwrite &H44
    Waitms 100

    '****Jeśli pracujesz z wyświetlaczem innym niż 2x20 to tutaj trzeba wprowadzić zmiany w LOCATE********

       I1 = I1 * 10
       I1 = I1 / 16
       If I1 > 0 Then                                           'korekta przesuniecia znaku st C przy przejściu z temp ujemnej na dodatnią
       Ss = Str(i1)
       Ss = Format(ss , " 0.0")
       Locate 1 , 1                                             'Pozycja wyświetlania nazwy i temperatury (1.1 -> 1 linia 1 kolumna, 2.10 -> 2 linia 10 kolumna itd)
       Lcd "IN" ; Ss ; Chr(0) ;
       Else
       Ss = Str(i1)
       Ss = Format(ss , " 0.0")
       Locate 1 , 1                                             'Pozycja wyświetlania nazwy i temperatury (1.1 -> 1 linia 1 kolumna, 2.10 -> 2 linia 10 kolumna itd)
       Lcd "IN" ; Ss ; Chr(0) ;
       End If

       I2 = I2 * 10
       I2 = I2 / 16
       If I2 > 0 Then
       Ss = Str(i2)
       Ss = Format(ss , " 0.0")
       Locate 1 , 9
       Lcd "OUT" ; Ss ; Chr(0) ;
       Else
       Ss = Str(i2)
       Ss = Format(ss , " 0.0")
       Locate 1 , 9
       Lcd "OUT" ; Ss ; Chr(0)
       End If


    Start Adc                                                   'uruchamia wbudowany przetwornik

                                                             'początek pętli programu
     Wart_ac = Getadc(1)                                        'odczytanie wartości z wejścia
          'ADC1 mikrokontrolera
                                                           'czyszczenie LCD

     Lowerline                                                  'kursor do drugiej linii LCD
     V = Wart_ac * 0.0049                                       'zamiana odczytanej wartości
          'z A/C na napięcie                                                'Wart_ac * ok. 4,8 mV
     V = V * 4
     Wart_nap = Fusing(v , "#.&&")                              'formatowanie wartości zmiennej
          'V do do formatu x.xx i zamiana
          'tej wartości na postać tekstową

     Lcd Chr(1) ; Chr(2) ; "  " ; Wart_nap ; "V  "              'wyświetlenie obliczonej
          'wartości Wart_nap w drugiej
          'linii LCD
     Wait 4

     Loop
     End
  • IGE-XAO
  • #2
    polprzewodnikowy
    Level 26  
    Mierz poprzez ADC spadek napięcia na czujniku poziomu paliwa.
  • #3
    cinek_14
    Level 12  
    ale jak zrobić dwa pomiary napięć żeby jeden odczytywał napięcie z akumulatora a drugi odczytywał napięcie z czujnika?
  • IGE-XAO
  • #4
    Freddy
    Level 43  
    W ATMega8 jest przecież więcej niż jeden ADC, więc możesz spokojnie mierzyć napięcie na akumulatorze. Oczywiście musisz dać dzielnik np. 1:3.
    Co do pomiaru paliwa, mierz napięcie na wskaźniku.
  • #5
    ATPAW
    Level 20  
    cinek_14 wrote:
    ale jak zrobić dwa pomiary napięć żeby jeden odczytywał napięcie z akumulatora a drugi odczytywał napięcie z czujnika?


    To akurat prosta sprawa.
    W jednym z projektów, jedno ADC obsługiwało pięć wejść pomiarowych.

    Zrobiłem to na mikroprzekaźnikach, za pośrednictwem innych portów załączałem odpowiedni obwód(różne dzielniki) do ADC. A program wiedział że jak jest włączone np. PC2 to następuje odczyt takiej i takiej danej.
    Fakt, że odczyt tych informacji następował w sposób szeregowy z zamrożeniem danych do następnego odczytu. W wielu aplikacjach takie rozwiązanie wystarcza.

    Pozdrawiam,

    atpaw
  • #6
    tmf
    Moderator of Microcontroller designs
    ATPAW, ATMega8 ma multiplekser, dzieki czemu zadne patenty z przekaznikami nie sa potrzebne. Za pomoca multipleksera wybierasz jedno z wejsc ACD0-ADC7, ktore bedzie podlaczone do ADC. BTW, Freddy, ATMega ma tylko jeden ADC.
  • #7
    Freddy
    Level 43  
    tmf wrote:
    ATPAW, ATMega8 ma multiplekser, dzieki czemu zadne patenty z przekaznikami nie sa potrzebne. Za pomoca multipleksera wybierasz jedno z wejsc ACD0-ADC7, ktore bedzie podlaczone do ADC. BTW, Freddy, ATMega ma tylko jeden ADC.

    Oj dobrze wiesz o co mi chodziło 8-channel ADC.
  • #8
    cinek_14
    Level 12  
    Witam przepraszam, że wcześniej nie pisałem, ale nie miałem dostępu do Internetu.
    A wiec tak na razie zrobię tylko z jednym przetwornikiem napięcia tyle, co jest zrobione na schemacie i w programie a później będę się bawił z tą ilością paliwa w baku. Projekt płytki już zrobiłem tylko na razie nie mam dostępu do drukarki laserowej wiec w poniedziałek pójdę do punktu ksero albo do drukarni i zrobię płytkę. A czy mógłby mi ktoś sprawdzić to, co do tej pory zrobiłem, czyli program i schemat, bo lepiej jak ktoś fachowym okiem popatrzy, bo jak zrobię płytkę to już będzie ciężko wnieść jakieś zmiany. Jeszcze jedno ten przetwornik napięcia będzie mierzył napięcie od około 8V do 18V, bo nie wiadomo jak może być z nim jak mostek prostowniczy sie zepsuje to szkoda układu, aby się zepsuł.

    Dodano po 23 [minuty]:

    Chyba doszedłem do tego jak to zrobić i czyżby było to tak i sygnał będzie odczytywany z linii PC2 (ADC2)?
    Code:

    '####Zminne####
    Dim Bak As Word
    Dim Litry As Single
    Dim Ilosc As String * 4
    ...
    '####Odczyt drugi####
     Bak = Getadc(2)

     Locate 2 , 8
     Litry = Bak * 0.0049
     Litry = Litry * 4

     Ilosc = Fusing(litry , "#.&&")

     Lcd "Bak " ; Ilosc ; "L"
  • #9
    cinek_14
    Level 12  
    Witam
    Przepraszam, że temat odgrzebuje, ale mam jeden problem. Zrobiłem już wszystko tylko nie mogę zrobić pomiaru ilości paliwa w baku. Nie wiem jak to podpiąć do czujnika w baku i jak mierzyć spadek napięcia. Już tyle sposobów próbowałem i nie mam pojęcia jak to zrobić może ktoś mi wreszcie pomoże jak to zrobić.
  • Helpful post
    #10
    Logi
    Level 19  
    Witam

    W samochodzie podpinasz się dzielnikiem do zegarów do styku nr 6 wtyku B. Dobrze było by na początek spr miernikiem napięcie jakie tam występuje przy pełnym i pustym (może być rezerwa) zbiorniku. Potem trzeba dobrać dzielnik o odpowiedniej proporcji i o takiej łącznej oporności aby nie fałszował wskazań zegara. Środek dzielnika podpinasz do uC i to wszystko. Pozostaje oczywiście jeszcze tylko napisanie programu. Zrób najpierw część sprzętową.

    Pozdrawiam
  • #11
    cinek_14
    Level 12  
    Na rezerwie jest około 4,60V na wyłączonym silniku a na pełnym to nie mierzyłem. Musiał bym dorwać ten czujnik w ręce i dokonać pomiarów. Jak będę miał czas to pojadę na złom i może kupie go bo nie chce rozbierać tego co jest w baku. Może ma ktoś z was taki czujnik i napisałby mi jakie są wartości na pełnym i na pustym baku. Bardzo bym był wdzięczny.
  • #12
    Mimitron
    Level 20  
    Możesz zapoznać się z moim rozwiązaniem problemu odczytu stanu paliwa w baku:
    Link
  • #13
    landy13
    Level 30  
    cinek_14 wrote:
    ...a na pełnym to nie mierzyłem. Musiał bym dorwać ten czujnik w ręce i dokonać pomiarów.
    A nie prościej zatankować do pełna i zmierzyć na wskaźniku?