اطلاعیه

Collapse
No announcement yet.

PID خودتنظیم ؟ autotune PID

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    PID خودتنظیم ؟ autotune PID

    سلام می خواستم ببینم PID خود تنظیم چه طور کار می کنه یعنی الگوریتمش چه طوری هست
    و از طرفی سورس کدی با زبان سی می شناسید که واقعا به خوبی کار کنه و بشه باهاش تست گرفت ؟؟؟
    اللهم صل علی محمد و ال محمد و عجل فرجهم
    پیامبر اکرم(ص):زکات علم نشر آن است.
    در کشور هاي غربي انتقال تجربيات و دانش به افراد مبتدي يک پيشرفت محسوب شده و به آن مديريت دانش مي گويند. ولي متاسفانه اين فرهنگ هنوز در کشور ايران رايج نشده است !!!

    #2
    پاسخ : PID خودتنظیم ؟ autotune PID

    نوشته اصلی توسط seyed saeed نمایش پست ها
    سلام می خواستم ببینم PID خود تنظیم چه طور کار می کنه یعنی الگوریتمش چه طوری هست
    و از طرفی سورس کدی با زبان سی می شناسید که واقعا به خوبی کار کنه و بشه باهاش تست گرفت ؟؟؟
    سلام اطلاعاتم کامل نیست ولی شاید کمک کنه.
    احتمالا با تنظیم یک مقدار دیفالت و شمردن تعداد اسیلیشن ها و کم و زیاد کردن مقدار p و d به ترتیب بهترین حالت (یعنی کمترین اسیلیشن ) رو پیدا میکنه به صورت تجربی.
    معمولا اسیلیشن های p فرکانسش کمتر از d هست و از این طریق تمیز میده این دو رو/ در مورد چگونگی تیون کردن i اطلاعاتی ندارم.

    Contribute to br3ttb/Arduino-PID-AutoTune-Library development by creating an account on GitHub.






    امیرحسین ضیا

    دیدگاه


      #3
      پاسخ : PID خودتنظیم ؟ autotune PID

      نوشته اصلی توسط Amir Zia نمایش پست ها
      سلام اطلاعاتم کامل نیست ولی شاید کمک کنه.
      احتمالا با تنظیم یک مقدار دیفالت و شمردن تعداد اسیلیشن ها و کم و زیاد کردن مقدار p و d به ترتیب بهترین حالت (یعنی کمترین اسیلیشن ) رو پیدا میکنه به صورت تجربی.
      معمولا اسیلیشن های p فرکانسش کمتر از d هست و از این طریق تمیز میده این دو رو/ در مورد چگونگی تیون کردن i اطلاعاتی ندارم.

      https://github.com/br3ttb/Arduino-PID-AutoTune-Library
      به نظرتون چه جاهایی کاربرد داره
      چیزی که من دیدم این روش فقط تو بحث کنترل دما کاربرد داره
      اللهم صل علی محمد و ال محمد و عجل فرجهم
      پیامبر اکرم(ص):زکات علم نشر آن است.
      در کشور هاي غربي انتقال تجربيات و دانش به افراد مبتدي يک پيشرفت محسوب شده و به آن مديريت دانش مي گويند. ولي متاسفانه اين فرهنگ هنوز در کشور ايران رايج نشده است !!!

      دیدگاه


        #4
        پاسخ : PID خودتنظیم ؟ autotune PID

        نوشته اصلی توسط seyed saeed نمایش پست ها
        به نظرتون چه جاهایی کاربرد داره
        چیزی که من دیدم این روش فقط تو بحث کنترل دما کاربرد داره
        کلا یکی از روش های پر کاربرد در کنترل هست/ در درون ها(برای ثابت نگه داشتن) در آتو پایلت ها/در اینورتر ها (کنترل اینرسی شبکه) / در خودرو های AWD یا 4WD برای جلوگیری از لغزش و تنظیم توان رسانی به چرخ ها/ در ربات ها برای حرکات نرم تر/ در دمپر های الکترونیکی/ و هزاران سیستم کنترلی دیگر






        امیرحسین ضیا

        دیدگاه


          #5
          پاسخ : PID خودتنظیم ؟ autotune PID

          نوشته اصلی توسط Amir Zia نمایش پست ها
          کلا یکی از روش های پر کاربرد در کنترل هست/ در درون ها(برای ثابت نگه داشتن) در آتو پایلت ها/در اینورتر ها (کنترل اینرسی شبکه) / در خودرو های AWD یا 4WD برای جلوگیری از لغزش و تنظیم توان رسانی به چرخ ها/ در ربات ها برای حرکات نرم تر/ در دمپر های الکترونیکی/ و هزاران سیستم کنترلی دیگر
          منظورم روش خودتنظیمش بود
          من جایی دیدم که روش خودتنظیم فقط در کنترل دما کاربرد داره
          و برای موارد دیگه باید به صورت های مختلف از قبیل تجربه و آزمایش و ... ضرایب PID رو به دست آورد
          حالا نمی دونم این حرف چه قدر درسته
          اللهم صل علی محمد و ال محمد و عجل فرجهم
          پیامبر اکرم(ص):زکات علم نشر آن است.
          در کشور هاي غربي انتقال تجربيات و دانش به افراد مبتدي يک پيشرفت محسوب شده و به آن مديريت دانش مي گويند. ولي متاسفانه اين فرهنگ هنوز در کشور ايران رايج نشده است !!!

          دیدگاه


            #6
            پاسخ : PID خودتنظیم ؟ autotune PID

            نوشته اصلی توسط seyed saeed نمایش پست ها
            منظورم روش خودتنظیمش بود
            من جایی دیدم که روش خودتنظیم فقط در کنترل دما کاربرد داره
            و برای موارد دیگه باید به صورت های مختلف از قبیل تجربه و آزمایش و ... ضرایب PID رو به دست آورد
            حالا نمی دونم این حرف چه قدر درسته
            آهاا من فکر کردم خود PID رو میفرمایین. روش خود تنظیمش رو من روی فلایت کنترلر هایی چون ArduPilot دیدم






            امیرحسین ضیا

            دیدگاه


              #7
              پاسخ : PID خودتنظیم ؟ autotune PID

              سلام دوستان من تحصصی در خصوص نحوه محاسبه ضرایب pid ندارم ولی بر حسب تجربه و سرو کله زدن با این موضوع تونستم یه انکوباتور بسازم که با آردوینو، المنت سیلیکونی 12 ولت(طول المنت دومتر که تقریبا 40 وات میشه)و یه ماسفت irfz44n (ورودی ماسفت pwm( دما رو کنترل میکنم و تقریبا بعد از رسیدن به ست پوینت 0.1 درجه حول نقطه ست پوینت در نوسان هست.فارق از مباحث گسترده محاسبه علمی ضرایب تو سایتا دوستان نوشتن به صورت تجربی هم میشه تنظیم رو انجام داد.میخوام اگه ممکنه ترتیب تغییرات و نحوه تنظیم تجربی رو یکی از دوستان آموزش یا راهنماییش رو قرار بده؟
              کد:
              
              #include <SHT1x.h>
              #include <SPI.h>
              #include <Wire.h>
              #include <Adafruit_GFX.h>
              #include <Adafruit_SSD1306.h>
              #include <PIDController.h>
              // Define Rotary Encoder Pins
              #define dataPin  7
              #define clo 6
              SHT1x sht1x(dataPin, clo);
              #define CLK_PIN 3
              #define DATA_PIN 4
              #define SW_PIN 2
              // Mosfet Pin
              #define mosfet_pin 11
              // Serial Enable
              #define __DEBUG__
              #define SCREEN_WIDTH 128 // OLED display width, in pixels
              #define SCREEN_HEIGHT 64 // OLED display height, in pixels
              #define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
              /*In this section we have defined the gain values for the 
               * proportional, integral, and derivative controller I have set
               * the gain values with the help of trial and error methods.
              */ 
              #define __Kp 2 // Proportional constant
              #define __Ki 5 // Integral Constant
              #define __Kd 10 // Derivative Constant
              int clockPin; // Placeholder por pin status used by the rotary encoder
              int clockPinState; // Placeholder por pin status used by the rotary encoder
              int set_temperature = 1; // This set_temperature value will increas or decreas if when the rotarty encoder is turned
              float temperature_value_c = 0.0; // stores temperature value
              long debounce = 0; // Debounce delay
              int encoder_btn_count = 0; // used to check encoder button press
              
              
              Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);// Create an instance for the SSD1306 128X64 OLED "display"
              PIDController pid; // Create an instance of the PID controller class, called "pid"
              void setup() {
              #ifdef __DEBUG__
                Serial.begin(9600);
              #endif
                pinMode(mosfet_pin, OUTPUT); // MOSFET output PIN
                pinMode(CLK_PIN, INPUT); // Encoer Clock Pin
                pinMode(DATA_PIN, INPUT); //Encoder Data Pin
                pinMode(SW_PIN, INPUT_PULLUP);// Encoder SW Pin
                pid.begin();          // initialize the PID instance
                pid.setpoint(50);    // The "goal" the PID controller tries to "reach"
                pid.tune(__Kp, __Ki,__Kd);    // Tune the PID, arguments: kP, kI, kD
                pid.limit(0, 255);    // Limit the PID output between 0 and 255, this is important to get rid of integral windup!
                if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
              #ifdef __DEBUG__
                  Serial.println(F("SSD1306 allocation failed"));
              #endif
                  for (;;); // Don't proceed, loop forever
                }
                //
                display.setRotation(2); //Rotate the Display
                display.display(); //Show initial display buffer contents on the screen -- the library initializes this with an Adafruit splash screen.
                display.clearDisplay(); // Cleear the Display
                display.setTextSize(2); // Set text Size
                display.setTextColor(WHITE); // set LCD Colour
                display.setCursor(48, 0); // Set Cursor Position
                display.println("PID"); // Print the this Text
                display.setCursor(0, 20);  // Set Cursor Position
                display.println("Temperatur"); // Print the this Text
                display.setCursor(22, 40); // Set Cursor Position
                display.println("Control"); // Print the this Text
                display.display(); // Update the Display
                delay(2000); // Delay of 200 ms
              }
              void set_temp()
              {
                if (encoder_btn_count == 2) // check if the button is pressed twice and its in temperature set mode.
                {
                  display.clearDisplay(); // clear the display
                  display.setTextSize(2); // Set text Size
                  display.setCursor(16, 0); // set the diplay cursor
                  display.print("Set Temp."); // Print Set Temp. on the display
                  display.setCursor(45, 25); // set the cursor
                  display.print(set_temperature);// print the set temperature value on the display
                  display.display(); // Update the Display
                }
              }
              void read_encoder() // In this function we read the encoder data and increment the counter if its rotaing clockwise and decrement the counter if its rotating counter clockwis
              {
                clockPin = digitalRead(CLK_PIN); // we read the clock pin of the rotary encoder
                if (clockPin != clockPinState  && clockPin == 1) { // if this condition is true then the encoder is rotaing counter clockwise and we decremetn the counter
                  if (digitalRead(DATA_PIN) != clockPin) set_temperature = set_temperature - 3;  // decrmetn the counter.
                  else  set_temperature = set_temperature + 3; // Encoder is rotating CW so increment
                  if (set_temperature < 1 )set_temperature = 1; // if the counter value is less than 1 the set it back to 1
                  if (set_temperature > 150 ) set_temperature = 150; //if the counter value is grater than 150 then set it back to 150 
              #ifdef __DEBUG__
                  Serial.println(set_temperature); // print the set temperature value on the serial monitor window
              #endif
                }
                clockPinState = clockPin; // Remember last CLK_PIN state
                
                if ( digitalRead(SW_PIN) == LOW)   //If we detect LOW signal, button is pressed
                {
                  if ( millis() - debounce > 80) { //debounce delay
                    encoder_btn_count++; // Increment the values 
                    if (encoder_btn_count > 2) encoder_btn_count = 1;
              #ifdef __DEBUG__
                    Serial.println(encoder_btn_count);
              #endif
                  }
                  debounce = millis(); // update the time variable
                }
              }
              void loop()
              {
                read_encoder(); //Call The Read Encoder Function
                set_temp(); // Call the Set Temperature Function
                if (encoder_btn_count == 1) // check if the button is pressed and its in Free Running Mode -- in this mode the arduino continiously updates the screen and adjusts the PWM output according to the temperature.
                {
                  temperature_value_c = sht1x.readTemperatureC(); // Read the Temperature using the readCelsius methode from MAX6675 Library.
                  int output = pid.compute(temperature_value_c);    // Let the PID compute the value, returns the optimal output
                  analogWrite(mosfet_pin, output);           // Write the output to the output pin
                  pid.setpoint(set_temperature); // Use the setpoint methode of the PID library to
                  display.clearDisplay(); // Clear the display
                  display.setTextSize(2); // Set text Size
                  display.setCursor(16, 0); // Set the Display Cursor
                  display.print("Cur Temp."); //Print to the Display
                  display.setCursor(45, 25);// Set the Display Cursor
                  display.print(temperature_value_c); // Print the Temperature value to the display in celcius
                  display.display(); // Update the Display
              #ifdef __DEBUG__
                  Serial.print(temperature_value_c); // Print the Temperature value in *C on serial monitor
                  Serial.print("   "); // Print an Empty Space
                  Serial.println(output); // Print the Calculate Output value in the serial monitor.
              #endif
                  delay(200); // Wait 200ms to update the OLED dispaly.
                }
              }
              جدیدترین ویرایش توسط abbasjavanmardi; ۱۰:۵۵ ۱۴۰۱/۰۱/۲۶.

              دیدگاه

              لطفا صبر کنید...
              X