• 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
Jak zmusić uC do oczekiwania na argument (przycisk)
#11
Czyli arduino miało by wytwarzać impulsy markujące obroty?
 
Odpowiedź
#12
Zgadza się. Gdzieś widziałem schematy Ne555 z wejściem ttl. Muszę poszukać i doczytać czy to to o co mi chodzi. Tylko tu też będzie potrzebna i optoizolacja.
 
Odpowiedź
#13
Na podstawie tego co mi dałeś naskrobałem coś takiego:



#include <LiquidCrystal.h> //Dołączenie bilbioteki

LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Informacja o podłączeniu nowego wyświetlacza




// przykładowe przypisanie pinów 
#define PWM1 3 //nie analizowałem czy na tych pinach działa PWM
#define PWM2 5 //nie analizowałem czy na tych pinach działa PWM
#define PWM3 6 //nie analizowałem czy na tych pinach działa PWM
#define PWM4 9 //nie analizowałem czy na tych pinach działa PWM
#define PWM5 10 //nie analizowałem czy na tych pinach działa PWM
#define PWM6 11



byte programowanie = 0;
int pwm1 = 0;
int pwm2 = 0;
int pwm3 = 0;
int pwm4 = 0;
int pwm5 = 0;
int pwm6 = 0;


void setup()
{
  pinMode(4, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP); //pelni funkcje OK
}

void loop()
{
  lcd.clear();
  // tu leci sobie program
  analogWrite(PWM1, pwm1);
  analogWrite(PWM2, pwm2);
  analogWrite(PWM3, pwm3);
  analogWrite(PWM4, pwm4);
  analogWrite(PWM5, pwm5);
  analogWrite(PWM6, pwm6);

  if (digitalRead(4) == LOW) // naciskasz przycisk programowanie
  {
    programowanie = 1; // zmieniasz stan flagi programowanie na 1
  }
  if (programowanie == 1) // tu program sprawdza czy chcesz programować
  {
    // tu cała procedura programowania pewuemów

  lcd.begin(16, 2); //Deklaracja typu
  lcd.setCursor(0, 0); //Ustawienie kursora
  lcd.print("Ustawiamy"); //Wyświetlenie tekstu
  lcd.setCursor(0, 1); //Ustawienie kursora
  lcd.print("Czujniki");

delay(2000);


  lcd.clear();
 
  lcd.setCursor(0, 0); //Ustawienie kursora
  lcd.print("Czujnik 1"); //Wyświetlenie tekstu
  lcd.setCursor(0, 1); //Ustawienie kursora
  lcd.print(analogRead(A3)); //Wyświetlenie tekstu


    if (digitalRead(7) == LOW)
    {
    pwm1 = analogRead(A3);
   
    lcd.setCursor(0, 0); //Ustawienie kursora
    lcd.print("Czujnik 2"); //Wyświetlenie tekstu
    lcd.setCursor(0, 1); //Ustawienie kursora
   lcd.print(analogRead(A3)); //Wyświetlenie tekstu


      if (digitalRead(7) == LOW)
      {
      pwm2 = analogRead(A3);

      lcd.setCursor(0, 0); //Ustawienie kursora
      lcd.print("Czujnik 3"); //Wyświetlenie tekstu
      lcd.setCursor(0, 1); //Ustawienie kursora
      lcd.print(analogRead(A3)); //Wyświetlenie tekstu
   

        if (digitalRead(7) == LOW)
        {
        pwm3 = analogRead(A3);

        lcd.setCursor(0, 0); //Ustawienie kursora
        lcd.print("Czujnik 4"); //Wyświetlenie tekstu
        lcd.setCursor(0, 1); //Ustawienie kursora
        lcd.print(analogRead(A3)); //Wyświetlenie tekstu
   

          if (digitalRead(7) == LOW)
          {
          pwm4 = analogRead(A3);


          lcd.setCursor(0, 0); //Ustawienie kursora
          lcd.print("Czujnik 5"); //Wyświetlenie tekstu
          lcd.setCursor(0, 1); //Ustawienie kursora
         lcd.print(analogRead(A3)); //Wyświetlenie tekstu
   

            if (digitalRead(7) == LOW)
            {
            pwm5 = analogRead(A3);


            lcd.setCursor(0, 0); //Ustawienie kursora
            lcd.print("Czujnik Obr Sil"); //Wyświetlenie tekstu
            lcd.setCursor(0, 1); //Ustawienie kursora
           lcd.print(analogRead(A3)); //Wyświetlenie tekstu
   

              if (digitalRead(7) == LOW)
              {
              pwm6 = analogRead(A3);


              lcd.setCursor(0, 0); //Ustawienie kursora
              lcd.print("koniec"); //Wyświetlenie tekstu
              lcd.setCursor(0, 1); //Ustawienie kursora
              lcd.print("Programowania"); //Wyświetlenie tekstu
   
delay(2000);

              }
            }
          }
        }
      }
    }
if (digitalRead(4) == LOW)
    {
      programowanie = 0; // program wychodzi z programowania
    }
  }
}

Pytanie czy poprawnie.
Do poprawki mam deklaracje pinów LCD.
Zrezygnowałem z przesadnej ilości przycisków i chce zrealizować temat 1 potencjometrem.

Nie miałem czasu jeszcze sam tego przetestować.
Będę miał szansę dopiero w niedzielę po południu.
 
Odpowiedź
#14
Używasz UNO a chcesz 6 PWM. Na uno może być problem z uzyskaniem 6 PWM sprzętowych wynikających z tego, że timer 0 jest używany do odliczania czasu. Wybierz taki mikrokontroler, który ma 6 PWM ale na timerach 16-bit. W AVR na takim timerze, bez problemu zrobisz PWM 10-bit i nie musisz nic mapować z ADC a przy okazji masz większa rozdzielczość niz rozwiązania programowe i PWM nie zatrzymuje się gdy zawieszane są przerwania a to czesty problem w Arduino.
W kodzie brakuje uśredniania pomiarów z ADC, poważny błąd. Uśrednianie najlepiej zrobić w przerwaniach. Jaki algorytm uśredniania wybrać? Tu raczej wystarczy jakikolwiek.

Te delay w kodzie trzeba usunąć. Czyszczenie LED jest niepotrzebne. Przy częstym odświezaniu powoduje miganie. Trzeba zrobić bufor i najlepiej w przerwaniach wysyłać go do LCD. LCD alfanumeryczne lubią się buntować, najczęściej pomaga podłączenie ramki LCD z masa ale nie zawsze, dlatego warto, np przy zmianie ekranu, inicjalizować LCD. Funkcje z bibliotek działają wolno więc trzeba je napisać samemu, poprawnie.
 
Odpowiedź
#15
Kod jest niepoprawny.
Nie może być delay. Program ma "gonić" w kółko i tylko zaglądać do podprogramu "programowanie" jak ma ustawioną flagę programowanie na 1 w innym przypadku ma go omijać.
Trzeba dodać dodatkowe flagi a właściwie jedną wielowartościową np ustaw_pwm w podprogramie programowanie, która będzie kierowała do ustawiania poszczególnych pewuemów.
Przycisk OK ma tylko zmieniać flagę na kolejne wartości i tym samym kierować do ustawienia kolejnych pwm i po ostatnim można np wyjść ustawiając flagę Programowanie na 0.
Ponadto trzeba rozwiązać sprawę drgania styków przycisków. Można to rozwiązać programowo lub dodając kombinację oporników i kondensatorów do przycisków.
 
Odpowiedź
#16
Raczej nie flagi a zrobić maszynę stanów. Cały kod należałoby podzielić na zadania:
- Wyświetlanie informacji.
- Odczyt klawiatury.
- Ustawianie wyjść.

Odczyt ADC należałoby uzupełnic o wykrywanie uszkodzenia potencjometru lub przewodów. Na potencjometrach należy zamontowac rezystory ograniczające napięcie regulacyjne a w programie sprawdzać czy zakres nie jest przekroczony co oznacza zwarcie do GND lub VCC albo urwany przewód (można na chwile właczać podciąganie). Ale zamiast kombinowac lepiej zastosowac enkoder.
 
Odpowiedź
#17
No to tak, maszynę stanów można popychać przyciskiem programowanie sekwencyjnie.
zmienna programowanie może przyjmować wartości
0 wyjście z programowania
naciskamy przycisk programowania stan zmiennej programowanie zmienia się z 0 na 1
1 programujemy 1 pwm jak chcemy zmienić ustawienia kręcimy potencjometrem zapisujemy je przyciskiem OK
naciskamy przycisk programowania stan zmiennej programowanie zmienia się z 1 na 2
2 programujemy 2 pwm jak chcemy zmienić ustawienia kręcimy potencjometrem zapisujemy je przyciskiem OK
naciskamy przycisk programowania stan zmiennej programowanie zmienia się z 2 na 3
3 programujemy 3 pwm jak chcemy zmienić ustawienia kręcimy potencjometrem zapisujemy je przyciskiem OK
naciskamy przycisk programowania stan zmiennej programowanie zmienia się z 3 na 4
4 programujemy 4 pwm jak chcemy zmienić ustawienia kręcimy potencjometrem zapisujemy je przyciskiem OK
naciskamy przycisk programowania stan zmiennej programowanie zmienia się z 4 na 5
5 programujemy 5 pwm jak chcemy zmienić ustawienia kręcimy potencjometrem zapisujemy je przyciskiem OK
naciskamy przycisk programowania stan zmiennej programowanie zmienia się z 5 na 6
6 programujemy 6 pwm jak chcemy zmienić ustawienia kręcimy potencjometrem zapisujemy je przyciskiem OK
naciskamy przycisk programowania stan zmiennej programowanie zmienia się z 6 na 0
czyli wychodzimy z programowania
Naciskając przycisk programowanie możemy sekwencyjnie też sprawdzić jakie mamy ustawienia poszczególnych pwmów.
Jak będę miał czas to napiszę kod.

Teraz idę sadzić ogórki Smile Tak sadzić, bo już w skrzynce urosły. Kurde tylko jeszcze zimni ogrodnicy i zimna Zośka nas czeka.
 
Odpowiedź
#18
(07-05-2020, 11:17)Jacek468 napisał(a): zgadnąć ile impulsów przypada na obrót wału.
Zgadnąć? Takie rzeczy się mierzy.
 
Odpowiedź
#19
Niestety aby to policzyć musiałbym miec dostęp do sprzęgła na wale pompy bo na nim są wycięcia które liczy czujnik. Niestety jest ono zabudowane i jest tam tylko 20mm otwór na wsunięcie czujnika.

Na razie nie mam skąd wziąć żadnego miernika częstotliwości ani oscyloskopu.
 
Odpowiedź
#20
Panowie mój stan umysłu zmienia się z każdym postem, który czytam.  Ale chyba rozumuję ogólny zamysł. W zasadzie trzeba rozwinąć ten program który już mam usuwając kilka rzeczy ewidentnie błędnych.
SaS co do timerów co byś powiedział na zrezygnowanie z używania PWM1? 5 wyjść mi na razie wystarczy.
Agregacik drgania styków załatwię już na płytce bo nie chce dokładać kolejnych linijek kodu.

Na razie dysponuje tylko Uno więc na tym chce zrobić projekt. Chcę najpierw czegoś się nauczyć żeby iść w mocniejsze i droższe sprzęty.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości