Skocz do zawartości

Czujnik ciśnienia oleju VDO


wowek

Pomocna odpowiedź

Cześć wszystkim

Posiadam taki oto czujnik ciśnienia oleju (tzw. VDO), który planuję zamontować do samochodu:

Czujnik posiada dwa wyjścia - Ground i Gauge, czyli wyjście na licznik analogowy. Ja zamiast licznika, chcę wstawić wyświetlacz OLED, na którym będzie wyświetlane ciśnienie oleju w Barach.

Zakres czujnika to 0-10 BAR, gdzie przy zerze czujnik posiada rezystancję na wyjściach 240R, a przy 10 barach - 33R.

Czujnik działa bez zasilania(?), po prostu pod wpływem ciśnienia - zmienia się rezystancja na wyjściu

Pytanie brzmi - jak te dwa przewody od czujnika podłączyć pod arduino, czy muszę wstawiać tam jakiś dzielnik napięcia między dwoma klemami, którego koniec podłączę pod pin analogowy, jeśli tak, to jak zrobić dzielnik napięcia dla czegoś, co ma tak zmienną rezystancję.

Oprócz czujnika ciśnienia oleju, chcę też podłączyć czujnik temperatury oleju, ale z nim poszło łatwiej, okazało się, że jest to termistor, zmierzyłem rezystancję na nim - 1.5k, zrobiłem mu dzielnik napięcia i działa, a ot z czujnikiem ciśnienia nie potrafię sobie poradzić.

Byłoby miło, gdyby ktoś chciał też spojrzeć na mój kod, czy nie namieszałem, ale bardziej zastanawia mnie kwestia fizycznego połączenia wszystkiego w całość 🙂

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Wire.h>
#include <SPI.h>


//I2C:
//ustawiam pin do resetowania wyswietlacza
//Adafruit_SSD1306 display(-1); //moj oled I2C nie posiada takiego pinu, stad -1
//#if (SSD1306_LCDHEIGHT != 64)
//#error("Popraw wysokosc");
//#endif

//SPI:
#define OLED_MOSI   9 //SDA
#define OLED_CLK   10 //SCL
#define OLED_DC    11
#define OLED_CS    12
#define OLED_RESET 13
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

// Port czujnika cisnienia
#define CZUJKA_C A0
// Port czujnika temperatury
#define CZUJKA_T A1
int Vo;

// Kalibracja czujnika cisnienia
// 0-10 BAR, 0V-5V lub 240R-33R
#define MIN_CISNIENIE 0.0
#define MAX_CISNIENIE 10.0
//odjalem 240-33, bo przy wartosciach 240 i 33 wyswietlacz pokazywal dziwne dane, powyzej 11 bar.
#define MIN_NAPIECIE 207.0
#define MAX_NAPIECIE 0.0

//czujnik temperatury
float R1 = 10000;
float logR2, R2, T;
float c1 = 1.009249522e-03, c2 = 2.378405444e-04, c3 = 2.019202697e-07;

#if (SSD1306_LCDHEIGHT != 64)
#error("Popraw wysokosc");
#endif

void setup() {
 Serial.begin(9600);
 //display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
 display.begin(SSD1306_SWITCHCAPVCC);
 display.display();
 delay(3000);
 display.clearDisplay();
 delay(3000);
 display.display();
}

void loop() {
 /* wersja dla napiecia   float volt=(analogRead(CZUJKA_C)+1)/204.8; // 1024/5.0 = 204.8
  *  wersja dla rezystancji   float volt=(analogRead(CZUJKA_C)+1)/4.26; // 1024/240 = 4.266(6)
  */
 float volt=(analogRead(CZUJKA_C)+1)/4.94; // 1024/207 = 4.94
 float pressure=(volt-MIN_NAPIECIE)*(MAX_CISNIENIE-MIN_CISNIENIE)/(MAX_NAPIECIE-MIN_NAPIECIE);

// odczyt temperatury
 Vo = analogRead(CZUJKA_T);
 R2 = R1 * (1023.0 / (float)Vo - 1.0);
 logR2 = log(R2);
 T = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2));
 T = T - 273.15;

display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Cisnienie:");
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(5,25);
display.println(pressure);
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(20, 54);
display.println("BAR");
display.setCursor(70, 0);
display.println("Temperat.");
display.setTextSize(2);
display.setCursor(65, 25);
display.println(T);
display.setTextSize(1);
display.setCursor(90, 54);
display.println("*C");
display.display();
delay(200);

}

Dzięki za pomoc!

Link do komentarza
Share on other sites

Jak coś ma zmienną rezystancję to by to mierzyć można zastosować mostek Wheatstone’a. Podobnie jest przy PT100, są też gotowce za parę $ konwertujące np. na zakres 0-5V, z tym że dla zakresu -50-200oC to trochę przycięło by zakres pomiarowy (80-180om) - porównaj sobie charakterystykę PT100. Musiałby to być jakiś wzmacniacz od -150-500oC.

Kiedyś sobie takie coś podobnego zrobiłem dla PT100, wklej w przeglądarkę otworzy się strona z symulatorem obwodu.

Potencjometr po lewej to Twój czujnik, po prawej do dopasowania.

http://falstad.com/circuit/circuitjs.html?cct=$+1+0.000005+15.472767971186109+57+5+50%0Ag+-80+320+-80+368+0%0Aa+128+96+272+96+1+5+0+1000000+0.03569845255568226+0.035698539833924264%0AO+576+112+640+112+0%0AR+32+-16+32+-48+0+0+40+3.3+0+0+0.5%0Ar+32+-16+32+32+0+4700%0Ar+32+160+32+256+0+91%0Aw+32+160+32+112+0%0Aw+-80+320+-80+224+0%0Aw+0+256+32+256+0%0Aw+0+256+0+320+0%0Ar+128+160+272+160+0+220000%0Aw+272+160+272+96+0%0Ar+32+112+96+112+0+220000%0Ar+80+80+128+80+0+220000%0Aa+368+112+512+112+1+5+0+1000000+0.008726436882151673+0.008727824199947066%0Aw+272+96+368+96+0%0Aw+368+128+320+128+0%0Aw+320+128+320+224+0%0Ar+320+224+432+224+0+47000%0Aw+512+160+512+112+0%0Ar+320+224+240+224+0+4700%0Ag+240+224+240+272+0%0Ar+512+112+576+112+0+1000%0Aw+320+224+320+272+0%0Aw+320+272+576+272+0%0Ac+576+272+576+112+0+1e-8+-0.13000534265709288%0A174+432+224+480+224+0+50000+0.46040000000000003+Resistance%0Aw+464+208+464+160+0%0Aw+464+160+512+160+0%0A174+-80+224+-32+224+0+200+0.5198+Resistance%0Ar+-80+-16+-80+32+0+4700%0Aw+32+-16+-80+-16+0%0Aw+32+112+32+32+0%0Aw+80+80+-80+80+0%0Aw+-80+32+-80+80+0%0Aw+-48+208+-48+128+0%0Aw+-48+128+-80+128+0%0Aw+-80+128+-80+80+0%0Aw+-80+320+0+320+0%0Ar+128+80+128+-80+0+220000%0Aw+48+-80+128+-80+0%0Aw+-80+320+-176+320+0%0Aw+-176+320+-176+-80+0%0Aw+-176+-80+48+-80+0%0Aw+128+112+96+112+0%0Aw+128+160+128+112+0%0Ao+33+64+0+4099+0.3125+0.00009765625+0+2+33+3%0Ao+2+64+0+4098+1.25+0.1+1+1%0A

Takich schematów znajdziesz w sieci mnóstwo, mój jest na 3.3V z jakiegoś powodu, pewnie był dla ESP8266 zasilanego z baterii, a na mostku musi być jakieś stabilne napięcie niższe. Zwykle są na zasilanie 5-12V.

Link do komentarza
Share on other sites

A może wystarczy prościej? Skoro czujnik to zmienny rezystor, to zrób dzielnik, np. taki:

- od +5V dajesz opornik 100Ω,
- "dolny" koniec opornika łączysz z "górnym" wyprowadzeniem czujnika i ten punkt wprowadzasz do wejścia ADC Arduino,
- "dolny" koniec czujnika podłączasz do GND Arduino.

Masz teraz dzielnik czyli źródło napięcia, które możesz mierzyć przetwornikiem. Masz tu dwa skrajne przypadki:

a. Ciśnienie zero: 100Ω/240Ω co z 5V daje daje napięcie 3.53V

b. Ciśnienie 10bar: 100Ω/33Ω co daje 1.24V

W przetworniku A/D dostaniesz zatem wyniki rozpięte między ok. (3.53/5)*1024=723 (min) a ok. (1.24/5)*1024=254 (max ciśn.). Wydaje się, że teraz wystarczy już tylko prosta arytmetyka i masz wynik w barach? Niestety, najważniejsze pytanie wciąż nie zostało zadane: jak zmienia się rezystancja czujnika względem ciśnienia. Od tego zależy sposób przeliczania wyniku konwersji na wielkość fizyczną. Oprócz wartości skrajnych musisz zatem mieć krzywą kalibracji albo przynajmniej jakieś źródło wzorcowego ciśnienia by sprawdzić jak wygląda odpowiedź czujnika w kilku punktach, np. dla 1, 2, 3, 5, 7, 8 i 9 barów.

Dla wprawy narysuj wykres napięcia doprowadzonego do ADC w tym układzie w przypadku gdy rezystancja zmienia się liniowo. Niestety jak widzisz nawet tutaj napięcie (czyli odczyty ADC) nie będzie liniowo rosło ze wzrostem rezystancji. A do tego dochodzi ch-ka samego czujnika.

----------------------------------

EDIT: Widzę, że na wyświetlaczu planujesz pokazywać wynik z trzema cyframi. Od 0.00 do 9.99 barów masz zatem 1000 punktów. Cały Twój przetwornik A/C ma taką rozdzielczość więc żeby mierzyć ciśnienie co 0.01bara musiałbyś "rozpiąć" rezystancję czujnika (240-33Ω) na pełne napięcie wejściowe 0-5V przetwornika. To się da zrobić, ale:

- wymaga o wiele bardziej skomplikowanego układu,
- wynik po przecinku i tak nie będzie nic znaczył, bo nie kalibrując precyzyjnie czujnika będzie dobrze, jeśli w ogóle pierwsza cyfra (czyli jednostki barów) będzie prawdziwa. Jeśli go dobrze wzorcujesz na dokładnym manometrze to może uda się uzyskać prawdziwe 0.1bara. Jedna setna jest moim zdaniem poza zasięgiem więc wyświetlanie jej to tylko szum dla oczu.

W obecnym układzie powyższego dzielnika z opornikiem 100Ω dostajesz tylko 723-254=469 różnych wartości więc to już pierwsze ograniczenie. W zaokrągleniu to rozdzielczość trochę poniżej 0.02 bara, ale z przyczyn już wymienionych poza 0.10 dokładności nie podskoczysz, a i to będzie naprawdę wielkim sukcesem.

Link do komentarza
Share on other sites

Z tym dzielnikiem próbowałem na początku. Właśnie na tym polega problem, że dla PT100 (a tu podobnie) może Cię interesować zakres np. od 100 do 150om. I w tym zakresie przykładowo z dzielnikiem napięcie mierzone będzie się zmieniało od 0,2 do 0,25V. To teraz bierzesz przetwornik 10bit i masz odczyt na działkę np. 5oC i jeszcze Ci skacze +/-10, no trochę lipa. Układ jak na schemacie rozciąga to dowolnie do wybranego napięcia odniesienia, tak by można było używać do pomiaru z odniesieniem jako VCC Arduino od 0-5V lub jak powyżej dla wewnętrznego 1.1V rozciągasz sobie ten zakres od 0-1.1V. Rezystor w mostku obok potencjometru dopasowuje gdzie ma się zaczynać 0V, a ten w parze z potencjometrem za OPAMP na wyjściu jakie jest MAX wyjścia.

edit:

Jest oczywiście też gotowe rozwiązanie - MAX31865, Adafruit ma do tego gotową płytkę i bibliotekę, działa oczywiście niby z PT100, więc trzeba by sobie tam pogrzebać i pozmieniać lub po prostu przeskalować stopnie na bary. Wyjście jest cyfrowe SPI. W pl jest w Botland. Na ali jest za 2 dyszki, tylko cierpliwość wymagana.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

W przypadku gdy nic nie wiesz o czujniku a Twoje kalibracje będą pochodzić z manometru z jakiejś butli (o ile w ogóle) lub nawet z jakiegoś wykresu (szczyt szczęścia) z karty katalogowej, to dzielnik jest równie dobry co wszystko inne. Wzmacniacz rozciągnie Ci zakres napięć w tym konkretnym przypadku dwukrotnie, wprowadzi dodatkowe błędy zera i wzmocnienia a na dodatek dla laika jest megaskomplikowany i nieoczywisty. Nie warto.

Link do komentarza
Share on other sites

40% to dwie cyfry znaczące z kawałkiem. Wątpię, aby była potrzebna większa.dokładność.

40 mA w samochodzie to faktycznie potężne obciążenie... czujnik poziomu paliwa pewnie żre więcej.

Link do komentarza
Share on other sites

@ethanak jak nie wiesz jakim prądem możesz obciążyć czujnik to pewnie testy zaczynasz od max, który Ci przyjdzie do głowy, ja wolałbym zacząć od minimum. A na końcu wniosek typu: po wyrwaniu wszystkich odnóży mucha ogłuchła.

Link do komentarza
Share on other sites

Nie - zaczynam od sprawdzenia w jakiejś dokumentacji (bo ten czujnik ma jakieś tam napisy na sobie) co do niego można podłączyć. Jak już będę wiedział to wtedy będę projektował resztę.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.