• 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
Milisekundomierz do badania czasu trwania impulsów i przerw.
#1
Witam, od jakiegoś czasu walczę z programem dla arduino uno. Postanowiłem zaryzykować i zamiast zdawać egzaminu na studiach zrobić milisekundomierz do badania spz na laboratorium. Jako iż wcześniej programowałem tylko plc, arduino było dla mnie dość nowe (ld czy fb a c to jednak różnica). Zadanie zaczęło mnie trochę przerastać gdyż doświadczenia z arduino miałem mało. 
Ogólne założenia programu:
- jeden impuls wejściowy (stan wysoki gdy spz wykrywa zwarcie), co prawda ma ona wewnętrznie przełączalne styki ale jest to "zabudowane" w logice i raczej nie mam do tego dostępu więc zostaje tylko ten jeden.
- program ma mierzyć czas trwania każdego z impulsów (maksymalnie 3) i czas trwania przerw między impulsami (dwie), zprzypisywać każdy czas do osobnej zmiennej, jeśli spz był np jednokrotny i po jednym impulsie w stanie wysokim, czas przerwy jest dłuższy niż 7 sekund, ma wyświetlać komunikat "spz jednokrotny"
- wszystko zrobione jest na czterosegmentowym wyświetlaczu, program ma wyświetlać czasy trwania impulsów, a po wciśnięciu przycisku czasy trwania przerw.

Program zrobiłem, korzystając funkcji millis(), tylko mam z nim kilka problemów z którymi nie mogę sobie poradzić. Udało mi się ustawić to tak że mierzy czas od zera dla każdego z impulsów, jednak gdy np zmierzy czas pierwszego impulsu i zostanie on utrwalony (na wyświetlaczu) to podczas trwania drugiego, ten pierwszy przyjmuje jego wartość itd. Gdy zmienia się czas jakiegokolwiek czasu, cała reszta zmienia wartości, przy czym warunek to żeby każdy czas został zapamiętany.

Kod:
int sygnal_pin = 13;
float tz1;
float tz2;
float tz3;
float tw1;
float tw2;
int impuls;
float zegar;
float zegar1;
float zegar2;
float zegar3;
float zegar4;
int cykl_spz;
boolean spz_jednokrotny;
boolean spz_dwukrotny;
boolean spz_trzykrotny;





void setup()
{
 pinMode(sygnal_pin, INPUT);
 pinMode (2, INPUT);
 lcd.begin(16,2);
}

void loop()
{
 if(digitalRead(sygnal_pin) == LOW)
 {
   zegar=millis();
 }
 if(digitalRead(sygnal_pin) == HIGH) // pierwsze zadziałanie spz
 {
   tz1=(millis() - zegar)/100;
   zegar1=millis();
 }
 if (digitalRead(sygnal_pin) == LOW && tz1>0 && spz_jednokrotny == false) // pierwsza przerwa
 {
   tw1 = (millis()-zegar1)/100;
   cykl_spz = 1;
   zegar2 = millis();
 }
 if (cykl_spz == 1 && tw1>=7.0) //informacja że spz był jednokrotny jeżeli przerwa trwa dłużej niż 7 sekund
 {
   spz_jednokrotny = true;
   lcd.setCursor(0,2);
   lcd.print("spz jednokrotny");
 }
 if (digitalRead(sygnal_pin) == HIGH && cykl_spz == 1 && spz_jednokrotny == false)
 {
  tz2 = (millis() - zegar2)/100;
  zegar3 = millis();
 }    
 if (digitalRead(sygnal_pin) == LOW && tz2>0)
 {
   tw2=(millis()-zegar3)/100;
   zegar4 = millis();
   cykl_spz = 2;
 }
  if (cykl_spz == 2 && tw2>=7.0) //informacja że spz był dwukrotny jeżeli przerwa trwa dłużej niż 7 sekund
 {
   spz_dwukrotny = true;
   lcd.setCursor(0,2);
   lcd.print("spz dwukrotny");
  }
 if(digitalRead(sygnal_pin) == HIGH && cykl_spz == 2 && spz_dwukrotny == false)
 {
  tz3=(millis() - zegar4)/100;
  cykl_spz = 3;
  spz_trzykrotny = true;
 }
 if (digitalRead(sygnal_pin) == LOW && spz_trzykrotny == true) // koniec pomiaru - spz trzykrotny.
 {
   lcd.setCursor(0,4);
   lcd.print("spz trzykrotny");
 }
 if (digitalRead(2) == HIGH)
 {
   lcd.setCursor(0, 0);
     lcd.print("tz1");
   lcd.setCursor(7, 0);
     lcd.print(tz1);
    lcd.setCursor(0, 1);
     lcd.print("tz2");
   lcd.setCursor(7, 1);
     lcd.print(tz2);
   lcd.setCursor(0, 2);
     lcd.print("tz3");
   lcd.setCursor(7, 2);
     lcd.print(tz3);
 }
 else
 {
   lcd.setCursor(0, 0);
     lcd.print("tw1");
   lcd.setCursor(7, 0);
     lcd.print(tw1);
   lcd.setCursor(0, 1);
     lcd.print("tw2");
   lcd.setCursor(7, 1);
     lcd.print(tw2);
}
}
 
Wiem że kod programu jest przepełniony błędami i pewnie zawiera dużo błędów, ale czy jest ktoś kto będzie w stanie mnie naprowadzić co robię źle ? np czas tz1, gdy tylko zaczyna bić licznik tz2 zmienia wartość na tz1=tz2. Będę wdzięczny za jakieś wskazówki.

Ewentualnie może znajdzie się ktoś chętny aby pomóc przy tym kodzie, poprawić go, rozumiem że nikt nie chce tracić czasu więc mogę zaoferować jakąś opłatę za pomoc. Oczywiście układ fizycznie już mam.


Dzięki.
 
Odpowiedź
  


Wiadomości w tym wątku
Milisekundomierz do badania czasu trwania impulsów i przerw. - przez Dzimi21 - 12-06-2017, 12:01

Skocz do:


Przeglądający: 1 gości