Skocz do zawartości

Przygasanie wyświetlacza LCD


Pomocna odpowiedź

Napisano (edytowany)

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

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ę ??

Na płytce nie ma żadnej przetwornicy tylko zwykły stabilizator. Teoretycznie mógłbyś zasilać wszystko z jednego źródła, ale ja bym tam dał jakąś niewielką przetworniczkę za 5 zeta.

  • Pomogłeś! 1
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

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

@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 😉

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ę

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