Skocz do zawartości

Matiautomati

Użytkownicy
  • Zawartość

    7
  • Rejestracja

  • Ostatnio

Reputacja

0 Neutralna

O Matiautomati

  • Ranga
    2/10

Informacje

  • Płeć
    Mężczyzna
  1. Witam, proszę gorąco doświadczonych forumowiczów o wytłumaczenie (technicznym i takim chłopskim językiem) działanie pewnych linijek kodu np. PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT); myPID.SetMode(AUTOMATIC); myPID.SetSampleTime(sampleRate); myPID.Compute(); myPID.SetTunings(Kp, Ki, Kd); Wiem, że są opisane na stronach anglojęzycznych ale większość osób raczej nie zna takiego angielskiego (ja również ). Z góry dziękuję.
  2. Witam, zrobiłem jak poleciłeś #include <PID_v1.h> #define Relay 12 #define Krec 7 #define PWM 6 ////Define Variables we'll be connecting to double Setpoint, Input, Output; //Define the aggressive and conservative Tuning Parameters double aggKp = 7, aggKi = 1.2, aggKd = 2; double consKp = 3, consKi = 0.4, consKd = 0.65; //Specify the links and initial tuning parameters PID myPID(&Input, &Output, &Setpoint, 2, 5, 1, DIRECT); int WindowSize = 15000; unsigned long windowStartTime; void setup() { Serial.begin(9600); pinMode(Relay, OUTPUT); pinMode(Krec, OUTPUT); digitalWrite(Krec, HIGH); pinMode(8, OUTPUT); digitalWrite(8, LOW); analogWrite(PWM, 240); // stala predkosc wiatraczka windowStartTime = millis(); //initialize the variables we're linked to Input = analogRead(0); Setpoint = 180; //tell the PID to range between 0 and the full window size myPID.SetOutputLimits(0, WindowSize); //turn the PID on myPID.SetMode(AUTOMATIC); } void loop() { float resistance; Input = analogRead(0); Serial.println(analogRead(0)); delay(200); resistance = map(analogRead(0), 0, 342, 0, 130); double gap = abs(Setpoint - resistance); // distance away from setpoint if (gap < 10) { // we're close to setpoint, use conservative tuning parameters myPID. SetTunings(consKp, consKi, consKd); } else { //we're far from setpoint, use aggresive tuning parameters myPID.SetTunings(aggKp, aggKi, aggKd); } myPID.Compute(); unsigned long now = millis(); if (now - windowStartTime > WindowSize) { // time to shift the Relay Window windowStartTime += WindowSize; } if (Output > now - windowStartTime) { digitalWrite(Relay, HIGH); } else { digitalWrite(Relay, LOW); } // analogWrite(PWM, Output); // if (Setpoint == 80) { // digitalWrite(Relay, LOW); // } // else { // digitalWrite(Relay, HIGH); } Przy Setpoint = 140 lub 180 ostatecznietermistor osiągał tą samą wartość. Setpoint = 140 Setpoint = 180 Na początku przebiegu wykres ma taką postać
  3. Witam, zrobiłem tak jak chciałeś. Ustawiłem stałą prędkość na pinie 6 PWM. #include <PID_v1.h> #define Relay 12 #define Krec 7 #define PWM 6 ////Define Variables we'll be connecting to double Setpoint, Input, Output; //Define the aggressive and conservative Tuning Parameters double aggKp = 3, aggKi = 0.2, aggKd = 0.3; double consKp = 1, consKi = 0.05, consKd = 0.25; //Specify the links and initial tuning parameters PID myPID(&Input, &Output, &Setpoint, 2, 5, 1, DIRECT); int WindowSize = 5000; unsigned long windowStartTime; void setup() { Serial.begin(9600); pinMode(Relay, OUTPUT); pinMode(Krec, OUTPUT); digitalWrite(Krec, HIGH); pinMode(8, OUTPUT); digitalWrite(8, LOW); analogWrite(PWM, 240); // stala predkosc wiatraczka windowStartTime = millis(); //initialize the variables we're linked to Input = analogRead(0); Setpoint = 120; //tell the PID to range between 0 and the full window size myPID.SetOutputLimits(0, WindowSize); //turn the PID on myPID.SetMode(AUTOMATIC); } void loop() { float resistance; Input = analogRead(0); Serial.println(analogRead(0)); delay(200); resistance = map(analogRead(0), 0, 342, 0, 130); double gap = abs(Setpoint - resistance); // distance away from setpoint if (gap < 10) { // we're close to setpoint, use conservative tuning parameters myPID. SetTunings(consKp, consKi, consKd); } else { //we're far from setpoint, use aggresive tuning parameters myPID.SetTunings(aggKp, aggKi, aggKd); } myPID.Compute(); unsigned long now = millis(); if (now - windowStartTime > WindowSize) { // time to shift the Relay Window windowStartTime += WindowSize; } if (Output > now - windowStartTime) { digitalWrite(Relay, HIGH); } else { digitalWrite(Relay, LOW); } // analogWrite(PWM, Output); // if (Setpoint == 80) { // digitalWrite(Relay, LOW); // } // else { // digitalWrite(Relay, HIGH); } Wrzuciłem przebieg z Kreślarki Nie jestem w stanie wrzucić całego przebiegu, więc wrzuciłem początek oraz koniec przebiegu. Zauważyłem, że praca przekaźnika ulegała zmianie, mianowicie wraz z dłuższą pracą układu wydłużał się czas załączenia przekaźnika a skracał czas jego wyłączenia, w wyniku czego przez cały czas rosła temperatura na termistorze. Przy końcu przebiegu przekaźnik "nie miał czasu na odpoczynek", gdy się wyłączał natychmiast się załączał do momentu aż przekaźnik był załączony cały czas. Dziwne ... Zmieniłem Windowsize na 3000 zostawiając PWM na 240, sprawdzałem również na kreślarce przebieg przy setpoint = 80 oraz 180. Przebiegi są krótkie, ponieważ tutaj interesował mnie spadek wartości. Wyszło mi tak: dla Setpoint = 80, dla Setpoint = 180, Zauważyłem, że w przypadku np. Setpoint =50, 80 lub 180, termistor osiągnię ostatecznie tą samą temperaturę (oczywiście w przypadku niższych będzie to przebiegać wolniej), a to chyba nie oto chodzi. Kiedy ustawię PWM pinu 6 jak wcześniej, przekaźnik zachowuje się tak jak wcześniej wspomniałem. Pozdrawiam
  4. Silniczek dmucha powietrzem na grzałkę, które dalej leci w kierunku termistora. Umieściłem schemat układu regulacji wykonany w programie Fritzing. Przepraszam, że tego od razu nie zrobiłem... [ Dodano: 30-12-2017, 08:57 ] Powiem szczerze nigdy wcześniej nie tworzyłem regulatora PID. Na stronie oficjalnej Arduino https://playground.arduino.cc/Code/PIDLibraryAdaptiveTuningsExample sugerują ustawianie parametrów "łagodnych" oraz "agresywnych", dlatego tak zrobiłem. Z pinu 6 PWM idzie przewód na wejście do mostka H odpowiedzialnego za sterowanie prędkością obrotów silniczka. Przepraszam, że wcześniej nie dodałem schematu układu regulacji. Teraz wszystko powinno być jaśniejsze. Ja za bardzo nie rozumiem do czego jest funkcja WindowSize, windowStartTime. Nigdy wcześniej nie miałem z tym styczności. Muszę się poradzić doświadczonych Silniczek ze śmigiełkiem oraz grzałką mają ogrzewać termistor. Jak najbardziej elementy te są włączone do układu regulacji. Grzałką nie chcę sterować za pomocą PWM.
  5. Witam, proszę o pomoc. Posiadam małą makietę układu regulacji temperatury. Chciałbym opracować układ regulacji temperatury powietrza zbudowany z grzałki (od małej suszarki 230V), silniczka MT78 ze śmigiełkiem i termistora NTC 110 5 kOhm 5% jako czujnika temperatury. Temperatura w zadanym punkcji będzie podlegała regulacji poprzez zmianę prędkości obrotowej wentylatora. Chciałbym aby kod poniżej utrzymywał zadaną wartość. Korzystałem głównie ze strony https://playground.arduino.cc/Code/PIDLibrary. Mój układ po osiągnięciu wartości ok. 40 (odczytanej z kreślarki)przestaje ogrzewać, wartość spada do ok. 55 a potem znów ogrzewa i tak w kółko. Czy można zrobić tak aby temperatura na termistorze nie rosła do takiej wartości tylko trzymała się bliżej zadanej wartości? Proszę o pomoc. Nie wiem za bardzo jak to zrobić. Dołączam schemat. Nie mogę znaleźć przekaźnika, którego używam więc zostawiłem tam trzy przewody (od pinu 12 jako sygnał sterujący, zasilanie i uziemienie). Do przekaźnika dołączona grzałka, również niewidoczna na schemacie ale w rzeczywistości znajdująca się między silniczkiem a termistorem. Przy termistorze znajduje się rezystor 10K. Załóżmy, że chciałbym aby utrzymywał temperaturę 40 st. C. Przy termistorze znajduje się rezystor 10k. Do pinu 12 mam podłączony przekaźnik z grzałką, do 7 podłączony silniczek z wiatraczkiem. Natomiast pin 6 PWM służy do regulacji prędkości obrotów silniczka. #include <PID_v1.h> #define Relay 12 #define Krec 7 #define PWM 6 ////Define Variables we'll be connecting to double Setpoint, Input, Output; //Define the aggressive and conservative Tuning Parameters double aggKp = 4, aggKi = 0.2, aggKd = 1; double consKp = 1, consKi = 0.05, consKd = 0.25; //Specify the links and initial tuning parameters PID myPID(&Input, &Output, &Setpoint, 2, 5, 1, DIRECT); int WindowSize = 5000; unsigned long windowStartTime; void setup() { Serial.begin(9600); pinMode(Relay, OUTPUT); pinMode(Krec, OUTPUT); digitalWrite(Krec, HIGH); pinMode(8, OUTPUT); digitalWrite(8, LOW); windowStartTime = millis(); //initialize the variables we're linked to Input = analogRead(0); Setpoint = 120; //tell the PID to range between 0 and the full window size myPID.SetOutputLimits(0, WindowSize); //turn the PID on myPID.SetMode(AUTOMATIC); } void loop() { float resistance; Input = analogRead(0); Serial.println(analogRead(0)); delay(200); resistance = map(analogRead(0), 0, 1023, 0, 100); double gap = abs(Setpoint - resistance); // distance away from setpoint if (gap < 10) { // we're close to setpoint, use conservative tuning parameters myPID. SetTunings(consKp, consKi, consKd); } else { //we're far from setpoint, use aggresive tuning parameters myPID.SetTunings(aggKp, aggKi, aggKd); } unsigned long now = millis(); if (now - windowStartTime > WindowSize) { // time to shift the Relay Window windowStartTime += WindowSize; } if (Output > now - windowStartTime) { digitalWrite(Relay, HIGH); } else { digitalWrite(Relay, LOW); } myPID.Compute(); analogWrite(PWM, Output); }
  6. Zad. 7.1 Uce = ok. 180mV Ube = 0,71V Ic = 5,71mA Ib = 0,85mA W przypadku tranzystora PNP napięcie Uce jest znacznie większe od napięcia Uce dla tranzystora NPN. Pozostałe pomiary są do siebie podobne. A jak u was? Może się mylę? Czekam na wasze komentarze
  7. Co do zadania 6.3, czy może ktoś wyjaśnić skąd taka różnica w prądzie? Z góry dziękuję
×
×
  • Utwórz nowe...