Skocz do zawartości

Milisekundomierz do badania czasu trwania impulsów i przerw.


Dzimi21

Pomocna odpowiedź

itam, 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.

nt 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.

Link do komentarza
Share on other sites

Fakt, przepraszam, już wyjaśniam:

Tz od 1 do 3 to czas poszczególnych impulsów załączajacych (czas na jaki załącza) a tw 1 i 2 to przerwy pomiędzy impulsem 1 a 2 i 2 i 3. Spz to samoczynne ponowne załączenie, takie coś co w przypadku zwarcia po ustalonym czasie robi załączenia z określonych odstępach czasu i określoną ilość razy stad spz jedno, dwu i trzykrotny. Program miałby liczyć czas trwania każdego impulsu załączajacego (czas trwania i porównanie z nastawami np 0,2 sekundy) i czas przerwy między nimi przy czym jako że mam dostęp tylko do jednego wyjścia to jak czas przerwy po impulsie przekroczy 7 sekund ma kończyć pomiar i wyświetlać stosowną informacje. Poniżej dorzucam graficznie jak wyglądają te ramki. Program ma mierzyć impuls załączajacy i przerwy między nimi. Dzięki za zainteresowanie tematem.

Spz sygnał

Temat mnie trochę przerósł a wydawał się prosty także jestem skłonny nawet coś zapłacić za pomoc przy poprawie kodu/zrobienie go poprawnie.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.