środa, 22 września 2010

Interfejsy diagnostyczne do samochodów

W poprzednim wpisie napisałem, że większość schematów interfejsów które można znaleźć w sieci jest niekompletna lub zła. Tym razem chciałbym napisać coś więcej na ten temat i wytłumaczyć niektóre niuanse związane z tworzeniem takiego interfejsu.

Mimo wszystko pewne standardy istnieją i obowiązują wszystkich producentów aut. W każdym standardzie pierwsze co jest zdefiniowane to właśnie właściwości elektryczne. Opis ten dotyczy warunków jakie maja panować podczas przesyłania danych oraz w jaki sposób ma się zachowywać podczas transmisji kontroler w samochodzie i urządzenie testujące. Skupie się tutaj przede wszystkim na protokołach zdefiniowanych przez ISO-9141 i ISO-14230, ponieważ oba te standardy są zgodne w warstwie elektrycznej.

Z tych standardów wynika kilka najważniejszych rzeczy:

- zakres temperatur w jakich pracujemy waha się pomiędzy -20C a +50C. Należy wiec pamiętać, że charakterystyki wielu elementów (np. rezystorów) zależą mocno od temperatury

- akumulator daje napięcie w granicach 12-14V, jednak tester powinien pracować poprawnie w granicach 8-16V

- komunikacja przebiega po "jednym drucie", tzw. linii K. Linia K jest oczywiście dwu-kierunkowa, czyli obsługuje nadawanie i odbieranie danych

- kodowanie danych na linii K jest identyczne jak podczas transmisji szeregowej UART (RS232) w formacie 8N1 (czyli 8 bitów danych, brak parzystości, jeden bit stopu, brak kontroli przepływem).

- linia K musi być podciągnięta do zasilania z akumulatora (tzw. pull-up) poprzez opornik 510 ohm 5%

- stan traktowany jako logiczne 1 na linii K to minimum 90% napięcia akumulatora

- stan traktowany jako logiczne 0 na linii K to maksymalnie 10% napięcia akumulatora. Prąd maksymalny 100mA

- tester nie powinien podawać na linie K napięcia wyższego od napięcia akumulatora, ani napięcia poniżej -1V

Jak widać nie ma tutaj żadnej magii. Wszystkie problemy z podłączeniem do danego sterownika wynikają tylko z tego jak bardzo dany interfejs nagina wyżej wymienione zasady i jak mocno trzyma się wyznaczonych parametrów elektrycznych. Od strony sterownika sytuacja zresztą wygląda podobnie.

Teraz przyszedł czas by się zastanowić jaką funkcjonalność powinien posiadać interfejs. Tak naprawdę mowa tutaj tylko o trzech rzeczach. Po pierwsze więc, musimy wziąć pod uwagę, że układy AVR czy inne chipy pracują przy napięciu 3.3V lub 5V. Interfejs powinien zatem konwertować poziom napięć pomiędzy 12-14V a napięciami TTL (czyli 5V lub 3.3V). Po drugie powinien poprawnie rozpoznawać stany logiczne 0 i 1, i po trzecie umożliwić nam nadawanie danych po linii K.

Oczywiście możemy tutaj użyć gotowych układów scalonych w stylu Si9243, L9637, MC33290 lub innych które zrobią to wszystko za nas. Trzeba jednak pamiętać, że są one drogie i trudno dostępne. Na dodatek w bardzo prosty sposób można poradzić sobie samemu, wykorzystując zaledwie 1-2 tranzystory, kilka oporników i komparator napięć LM393 lub LM339N. Dodatkowo ponieważ np. komparator LM339N jest poczwórny będziemy mogli bez problemu dołożyć obsługę linii L (linia ta służy tylko do inicjowania połączenia i występuje tylko przy starszych sterownikach w standardzie ISO-9141). Obsługę linii L realizujemy identycznie jak linii K.

Komparator napięć odwali za nas większą cześć brudnej roboty, czyli konwersje napięć oraz określenie stanu logicznego na linii K. Sam komparator jest zasilany napięciem ~12V z akumulatora (pracuje przy napięciach 2-36V). Konwersje napięć robimy w bardzo prosty sposób. Wystarczy jego wyjście podciągnąć pod 5V lub 3.3V.

Rozróżnianie stanów logicznych najlepiej jest zrobić podając napięcie odniesienia na nóżkę wejścia odwracającego układu poprzez dzielnik napięcia. Dzielnik napięcia można zrobić z dwóch rezystorów 10k ohm podciągniętych do +12V lub wykorzustując rezystory 10k ohm i 5k ohm podciągnięte do +5V. Jak widać dużo zależy tutaj od naszej fantazji :)

Całość układu może wyglądać tak jak na schemacie poniżej. Trzeba jednak pamiętać, że nawet tutaj można dokonać pewnych modyfikacji np. wyjście TXD można puścić poprzez pojedynczy tranzystor a nie dwa (tworzące bramkę NOT). Do złącza serial można doczepić układ MAX232 konwertujący poziomy napięć do standardu RS232, FT232 będący konwerterem USB-UART, czy też Atmega328p używany w Arduino.