Skocz do zawartości

Przygasanie wyświetlacza LCD


czaj

Pomocna odpowiedź

Witam

Mam pewien kawałek kodu do sterowania kilkoma silnikami krokowymi.

Jak steruje nimi przy użyciu delay() to wszystko działa, ale jak wiadomo jest to uciążliwe.

Zastosowałem więc micros() i niby jest ok, ale kod/procesor tak jakby się zapętlał i przygasa mi wyświetlacz LCD aż do całkowitego zgaśnięcia i zresetowania procesora.

Poniżej kawałek kodu. Z góry dzięki za wskazanie błędu.

int stan_4 = LOW;
int stan_5 = LOW;
int stan_6 = LOW;

void kalibracja_dociskow(){
  
  while( kal_45 == 0 ){
   
    if ( kal_44 == 0 ){
      unsigned long curMil_1 = micros();
      if ( digitalRead(krk_4) != LOW ){
        digitalWrite(s4_dir, LOW); 
        if(curMil_1 - prMil_1 >= step_speed ){
          prMil_1 = curMil_1;
          if (stan_4 == LOW) {
            stan_4 = HIGH;
          }else{
            stan_4 = LOW;
          }
          digitalWrite(s4_pul, stan_4);
          unsigned long curMil_1 = micros();
        }
      }else{
        kal_44 = 1;
      }
    }

    if ( kal_55 == 0 ){
      unsigned long curMil_2 = micros();
      if ( digitalRead(krk_5) != LOW ){
        digitalWrite(s5_dir, LOW);
        if(curMil_2 - prMil_2 >= step_speed ){
          prMil_2 = curMil_2;
          if (stan_5 == LOW) {
            stan_5 = HIGH;
          }else{
            stan_5 = LOW;
          }
          digitalWrite(s5_pul, stan_5);
          unsigned long curMil_2 = micros();
        }
      }else{
        kal_55 = 1;
      }
    }
    
    if ( kal_44 == 1 ){
      unsigned long curMil_3 = micros();
      if (i <= pkt_kal_4){
        digitalWrite(s4_dir, HIGH); 
        if(curMil_3 - prMil_3 >= step_speed ){
          prMil_3 = curMil_3; 
          if (stan_4 == LOW) {
            stan_4 = HIGH;
            i++;
          }else{
            stan_4 = LOW;
          }
          digitalWrite(s4_pul, stan_4);
          unsigned long curMil_3 = micros();
        }
      }else{
        kal_44 = 2;
      }
    }

    if ( kal_55 == 1 ){
      unsigned long curMil_4 = micros();
      if (i2 <= pkt_kal_5){
        digitalWrite(s5_dir, HIGH);
        if(curMil_4 - prMil_4 >= step_speed ){
          prMil_4 = curMil_4;
          if (stan_5 == LOW) {
            stan_5 = HIGH;
            i2++;
          }else{
            stan_5 = LOW;
          }
          digitalWrite(s5_pul, stan_5);
          unsigned long curMil_4 = micros();
        }
      }else{
        kal_55 = 2;
      }
    }

    if ( kal_55 >= 2 ){
      unsigned long curMil_5 = micros();
      if (i6 <= 500){
        digitalWrite(s6_dir, HIGH); 
        if(curMil_5 - prMil_5 >= step_speed ){
          prMil_5 = curMil_5; 
          if (stan_6 == LOW) {
            stan_6 = HIGH;
            i6++;
          }else{
            stan_6 = LOW;
          }
          digitalWrite(s6_pul, stan_6);
          unsigned long curMil_5 = micros();
        }
      }
      if (i6 > 500){
        if ( digitalRead(krk_6) != LOW and i66 == 0 ){
          digitalWrite(s6_dir, LOW);
          if(curMil_5 - prMil_5 >= step_speed ){
            prMil_5 = curMil_5; 
            if (stan_6 == LOW) {
            stan_6 = HIGH;
          }else{
            stan_6 = LOW;
          }
          digitalWrite(s6_pul, stan_6);
          unsigned long curMil_5 = micros();
          }
        }else{
          i66 = 1;
        }
        if ( i66 == 1 ){
          if ( i666 <= pkt_kal_6 ){
            digitalWrite(s6_dir, HIGH); 
            if(curMil_5 - prMil_5 >= step_speed ){
              prMil_5 = curMil_5;
              if (stan_6 == LOW) {
                stan_6 = HIGH;
                i666++;
              }else{
                stan_6 = LOW;
              }
              digitalWrite(s6_pul, stan_6);
              unsigned long curMil_5 = micros();
            }
          }else{
            kal_45 = 1;
          }
        }
      }
    }
    
    if (kal_45 == 1){
      delay(5); 
    };
    
  }
}

 

Edytowano przez czaj
Link do komentarza
Share on other sites

10 minut temu, czaj napisał:

przygasa mi wyświetlacz LCD aż do całkowitego zgaśnięcia i zresetowania procesora

Ciężko analizować taki kod bez żadnych komentarzy, ale niezależnie do programu takie coś nie powinno mieć miejsca. Jak odłączysz fizycznie silniki to też układ gaśnie i się resetuje? To wygląda bardziej na jakieś problemy z zasilaniem.

  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

No w sumie zapomniałem dodać że problem pojawia się tylko gdy płytka zasilana jest przez gniazdo 12V.

Jak podłączę ją pod komputer przez USB problem znika. Nie mam akurat drugiej płytki żeby sprawdzić czy to jest problem z przetwornicą na płytce, ale w układzie mam zewnętrzną przetwornicę 5V/3A do zasilania sterowników i przekaźników. Da się z niej zasilić bezpośrednio też płytkę ??

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

41 minut temu, czaj napisał:

No w sumie zapomniałem dodać że problem pojawia się tylko gdy płytka zasilana jest przez gniazdo 12V.

No to zasilanie Ci klęka najprawdopodobniej...dobra praktyką jest zasilanie Ardu i ewentualnie czujników/modułów zosobnego zasilania, w sensie przetwornica 5v może być podpięta pod 12v silników, no chyba że da się rozdzielić zasilania, to najlepsza opcja

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Faktycznie podłączenie zasilania płytki pod 5V z przetwornicy rozwiązało problem.

Trochę mnie to zdziwiło bo takie problemy miałem tylko jak z płytki było zasilane zbyt dużo modułów dodatkowych ( przekaźniki, czujniki itp. )

Natomiast w tym projekcje wszystkie peryferyjne moduły zasiliłem z przetwornicy.

Dzięki za pomoc. Pzdr

Link do komentarza
Share on other sites

@czaj wszystkie silniki pobierają stosunkowo duży prąd w porównaniu do reszty elektroniki w takich projektach. Każdy rozruch silnika to nagły pobór stosunkowo dużego prądu, często prowadzi to właśnie do takich problemów 😉

Link do komentarza
Share on other sites

4 godziny temu, czaj napisał:

takie problemy miałem tylko jak z płytki było zasilane zbyt dużo modułów dodatkowych ( przekaźniki

 

To akurat nie koniecznie spadki napięcia, przekaźniki często są problemem jeśli ich część wykonawcza (cewki tranzystory) są podłączone do tego samego zasilanie...dlatego te moduły często mają optoizolatora i rozdzielone zasilania na logikę i część załączającą cewkę

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.