• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Niedokładność pomiarowa - problem z odczytywaniem impulsow
#1
Witam, projekt, którym aktualnie się zajmuje to skonstruowanie komputera pokładowego do mojego leciwego juz samochodu Opla Astry F z 97 roku. Moją główną potrzeba jest opracowanie układu który pokazywałby średnie spalanie, ale skoro będę to już robił wyposażę go w dodatkowe funkcje, prędkość, średnia prędkość, dystans, zasięg itp.

Problem z którym aktualnie się borykam wiąże się z pomiarem prędkości, który tak czy siak muszę mieć jeśli chce mieć pomiar spalania średniego czy też chwilowego. Układ jest podłączony do przewodu przesyłającego impulsy przebytej drogi (wzorowałem się na tym projekcie) do układu TID montowanego w oplach. W moim samochodzie na jeden obrót koła przypada 30 impulsów, obwód koła wynosi 1,78 [m], stad na 1 metr przypada 16,85 impulsu. Metodą pomiarową którą obrałem jest zliczanie impulsów w ciągu 1/2 [s], następnie podzielenie ilości przez 16,85, wtedy otrzymuje wynik w [m/(1/2)s], który przeliczam na [km/h]. Sposób ten sprawdza się, całkiem dokładnie, jednak do prędkości rzędu 90 [km/h], potem mimo tego, że auto przyśpiesza pozostaje mniej więcej na tym samym poziomie. Po pomiarach za pomocą monitora portu szeregowego wychodzi na to, że powyżej tej prędkości mój program nie jest w stanie zliczyć więcej impulsów.

Oto kod:
Kod:
#include <LiquidCrystal.h>
#include <Timers.h>

LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
Timers <2> timer;

int speedImpulsPin = 9;

int impulsCounter = 0;
bool impuls = true;
double impulsesInOneMeter = 16.85; // obwod kola wynosi 1.78m, na pelny obrot kola przypada 30 impulsow


void setup() {
 Serial.begin(9600);
 pinMode(speedImpulsPin, INPUT);
 
 lcd.begin(16,2);
 lcd.setCursor(0,0);
 lcd.print("ASTRA F    X14XE");
 delay(3000);
 lcd.clear();

 timer.attach(0,1,checkImpuls);
 timer.attach(1,500,calculateSpeed);
}

void checkImpuls() {
 bool voltage = digitalRead(speedImpulsPin);
 
 if(voltage == LOW && impuls == false) {
   impuls = true;
   impulsCounter++;
 }
 else if(voltage == HIGH && impuls == true)
   impuls = false;
}

void calculateSpeed() {
 double meters = impulsCounter / impulsesInOneMeter;
 
 Serial.print(impulsCounter);
 Serial.print(" imp");
 Serial.print("\t");
 
 impulsCounter = 0;
 int speedOfVehicle = meters * 72 / 10; //km/h (2*3600/1000) -> (72/10)
 
 //int speedOfVehicle = meters * 144 / 10; //km/h (4*3600/1000) -> (144/10)

 Serial.print(meters);
 Serial.print(" m/(1/2)s");
 Serial.print("\t");
 Serial.print(speedOfVehicle);
 Serial.println(" km/h");

 displaySpeed(speedOfVehicle);
}

void displaySpeed(int speedOfVehicle) {
 clearLine(0);
 lcd.setCursor(0,0);
 lcd.print("SPEED:");

 if(speedOfVehicle < 10)
   lcd.setCursor(10,0);
 else if(speedOfVehicle >=10 && speedOfVehicle < 100)
   lcd.setCursor(9,0);
 else if(speedOfVehicle >=100 && speedOfVehicle < 1000)
   lcd.setCursor(8,0);  

 lcd.print(speedOfVehicle);
 lcd.print(" KM/H");
}

void clearLine(int line) {
 lcd.setCursor(0,line);
 lcd.print("                ");
}

void loop() {
 timer.process();

}
Użyłem biblioteki Timers.h która znalazłem pod tym linkiem. Jak można zauważyć w 1 milisekundowym interwale zliczam impulsy, w półsekundowym interwale obliczam prędkość. 

Wydaje mi się, że program musiałby częściej sprawdzać impulsy, tylko jak to osiągnąć? Może ktoś zna inną metodę zliczania impulsów lub zaleca zastosowanie innej biblioteki? Za wszystkie rady, a także za konstruktywna krytykę będe niezmiernie wdzieczny Smile
 
Odpowiedź
  


Wiadomości w tym wątku
Niedokładność pomiarowa - problem z odczytywaniem impulsow - przez qbic - 12-08-2018, 16:34

Skocz do:


Przeglądający: 1 gości