اطلاعیه

Collapse
No announcement yet.

ساخت کنترل کننده pid با آردوینو

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

    ساخت کنترل کننده pid با آردوینو

    سلام دوستان ...
    من یه کنترل کننده pid فازی برای کنترل دمای یک لامپ با آردوینو مگا ساختم.
    سیگنال کنترلی خروجی رو روی پایه شماره 7 با تابع analogWrite نوشتم. یعنی یک موج pwm.
    حالا برای اینکه بتونم با این سیگنال کنترلی توان اعمال شده به لامپ رو کنترل کنم نیاز به یه دیمر دارم که با ولتاژ کنترل بشه . اول از آی سی tca785 استفاده کردم برای کنترل زاویه آتش که خب راستش خیلی مشکل داشتم . میخواستم بدونم دوستان راه حل دیگه ای سراغ ندارن ... دیمرهای power fet که بدون zero detector هستند چه طور کار می کنند ؟ اگه کمک کنید ممنون میشم.

    #2
    مشکل در برنامه نویسی آردوینو

    سلام خدمت دوستان عزیز ...
    من توی برنامه نویسی با یه مشکل رو به رو هستم ... که شرحش یکم طولانیه . اگه می تونید کمکم کنید خیلی ضروریه
    من در حال ساخت یه کنترل کننده pid هستم . و میخوام دمای یک لامپ رو باهاش کنترل کنم . و روی یک lcd کارکتری نشون بدم. دما رو از طریق سنسور lm35 می خونم که به ازای هر درجه سانتی گراد یک میلی ولت خروجی داره . از طریق یک پتانسیومتر هم ست پوینت رو به آردوینو می دم .
    پس من با آردوینو دوتا ولتاژ می خونم یکی خروجی lm35 و یکی هم خروجی پتانسیومتر.خب حالا این دو عدد خونده شده با توجه به دقت adc آردوینو ، مقداری بین 0 تا 1023 دارن . من میخوام این مقدار رو به دما تبدیل کنم ... از رابطه های زیر استفاده می کنم :
    (5/1023)*100*عدد خوانده شده توسط آردوینو از lm35
    (5/1023)*20*عدد خوانده شده توسط آردوینو از پتانسیومتر
    حالا این دو عدد دمای خوانده شده و دمای مطلوب(ست پوینت) من هستن.
    من حالا این دو عدد رو از هم کم می کنم تا خطا به دست بیاد و بعد هم یکسری اعمال ریاضی برای به دست آوردن مشتق و انتگرال و در نهایت ساخته شدن فرمان کنترلی pid . حالا باید این فرمان رو به سیستمی که می خوام کنترلش کنم بفرستم ...

    مشکل اساسی این جاست :
    چون می خوام از دستور analogWrite استفاده کنم مقدار سیگنال pid من باید بین 0 تا 255 باشه . اما اولا مقدار pid معلوم نیست که چه قدر هستش و ثانیا اصلا مقدار صحیحی نیست و مقداری اعشاری داره . چون سیگنال pid ما حاصل کلی ضرب و تقسیم و انتگرال و مشتق هستش که روی خطا انجام شده. به نظر شما برای اینکه از دستور analogWrite استفاده کنم باید چی کار کنم که موج pwm من درست ایجاد بشه ؟
    جدیدترین ویرایش توسط sadegh.put; ۲۰:۳۴ ۱۳۹۵/۱۱/۱۹.

    دیدگاه


      #3
      پاسخ : ساخت کنترل کننده pid با آردوینو

      سلام
      چند تا نکته در جواب شما:
      1. اعشاری بودن خروجی کنترل کننده به ضرایب PID ات مربوط میشه(اگه اونا اعشاری باشن حاصل اعشاری میشه) و چیز خاصی نیست قبل اینکه به دستور analogWrite بدی از نوع صحیحش میکنی
      Cast
      2.برای PID در آردینو کتابخونه نوشتن میتونی از همون استفاده کنی
      PID
      3.اگه خودت مینویسی برای مشتق کافیه تفاوت دو نمونه پشت سرهم و برای انتگرال حاصل جمع خطا ها را بگیری
      در ضمن حواست باید به اشباع انتگرال گیر، منفی شدن خروجی کنترل کننده و ... باشه

      4.این که خروجیت تو چه بازه ای، بستگی به ضرایب PID داره و اگه درست تنظیم بشه بین همون 0 تا 255 میفته
      ولی شما میتونی فعلا وصل نکنی به لامپ خروجیو تو سریال چاپ کنی و ببینی و بعد ضرایب دستی تنظیم کنی
      در ضمن با چندتا شرط گذاشتن کاری کنی از این بازه خارج نشه

      5.اگه میخوای PID فازی بسازی ضرایب را احتیاج نداری فقط یک بازه برای هر کدوم نیازه که با آزمون و خطا میتونی پیدا کنی

      6.اگه نوشتی و تموم شد لطف کن نتیجشو به اشتراک بزار

      دیدگاه


        #4
        پاسخ : ساخت کنترل کننده pid با آردوینو

        سلام ممنون از جوابتون
        من با نوشتن مشتق و انتگرال و محاسبات فازی مشکلی ندارم ... نوشتم این کدها رو و ضرایب هم به صورت فازی تعیین میشن ...
        مشکل من در خروجی pid هستش ...
        من برای تعیین خطا به طور مستقیم از اعداد خونده شده توسط آردوینو استفاده نمی کنم بلکه از اعداد تبدیل شده به دما استفاده می کنم . خب این اعداد دیگه بین 0 تا 1023 نیستن پس دیگه خطا، انتگرال و مشتق من بین 0 تا 1023 نیستن و در نتیجه سیگنال pid من هم همین طور هست ... پس من محدوده این سیگنال رو نمی دونم ... اگه می دونستم با دستور map به راحتی اون مقدار رو به بازه 0 تا 255 و بعد به صورت pwm روی خروجی می فرستادم ...
        مشکل بعدی هم اینه که خروجی خیلی بزرگ میشه مثلا 10000000یا -10000000 ... من بخش انتگرال گیر و حتی خود سیگنال pid رو محدود کردم ... اما نمی دونم کران پایین این محدوده باید صفر باشه یا یه عدد منفی ... و در ضمن نمی دونم این کران باید چه عددی باشه . میترسم مثلا اگه 255 انتخاب کنم بخشی از فرمان کنترلی از بین بره .

        دیدگاه


          #5
          پاسخ : ساخت کنترل کننده pid با آردوینو

          من نمی دونم کدتو چطوری نوشتی ولی حداکثر اختلاف دما که مشخصه (مثلا 20 درجه) و حداکثر خروجی میکرو که همون 255 است پس ضرایب مثلا باید حدودا 10 باشه نمیدونم چطوری به این اعداد رسیدی!
          ولی خوب من اگه بودم مثلا 10000 رو مپ میکردم به 255 و خروجیو میدیدم دست میمد که چطوریه
          شما بدون فازی با یک سری ضرایب کم شروع کنی تقریبا میشه بازه را فهمید
          خروجی کنترل کننده منفی بشه باید سیستم خنک کننده کار کنه مثلا یک فن ولی اگه نداری احتمالا باید صفرش کنی و صبر کنی تا دما بیاد پایین

          دیدگاه


            #6
            پاسخ : ساخت کنترل کننده pid با آردوینو

            اون مشکل برنامه نویسی حل شد ... برای بخش انتگرال گیر محدوده مثبت و منفی قرار دادم و برای خود سیگنال pid محدوده 0 تا 255 قرار دادم ...
            الان مشکل اصلی دیمر هست ... اگه کمک کنید ممنون میشم

            دیدگاه


              #7
              پاسخ : ساخت کنترل کننده pid با آردوینو

              سلام دوستان.بنده با ی سنسور دما و رطوبت sht11 وبورد پرو مینی و دو عدد رله اقدام به ساخت کنترلر دما دستگاه جوجه کشی کردم و دمای پایین(37.5)و دمای بالا (37.7) قرار دادم.طی دو سری دوره 21 روزه جوجه کشی فقط یک بار آردیونو هنگ کرده بود( هی رله رو خاموش روشن میشد).تو اینترنت با مبحث PID آشنا شدم و علاقه مندم رو بوردم برنامه ای با این قابلیت رو آپلود کنم.کتابخانه های pid رو گرفتم اما از مثالهاش چیزی سر در نیاوردم.نمونه های آماده هم با سنسور های lm35 هست ک به درد نمیخورن.ممنون میشم با توجه به کد زیر راهنماییم کنه.


              کد:
              #include <Wire.h> 
              #include <LiquidCrystal_I2C.h>
              LiquidCrystal_I2C lcd(0x27,20,4);
              #include <SHT1x.h>
              #define dataPin  A0
              #define clockPin A1
              SHT1x sht1x(dataPin, clockPin);
              int hitter=4;
              int humm=3;
              
              
              void setup() {
              lcd.begin();  
              lcd.backlight();
              lcd.print("abbas javanmardi");                   
              Serial.begin(9600);
              pinMode(4,OUTPUT); //hiter relay
              pinMode(3,OUTPUT); // humm fan relay
              
              
              }
              void loop()
              {
                lcd.setCursor(0,1);
                float temp_c;
                float humidity;
                temp_c = sht1x.readTemperatureC();
                humidity = sht1x.readHumidity();
                lcd.clear();
                lcd.setCursor(,0);
                lcd.print("Tmp : ");
                lcd.print(temp_c);
                lcd.setCursor(2,1);
                lcd.print("Hum : ");
                lcd.print(humidity);
                lcd.print("%");
                
                Serial.print("Temp: ");
                Serial.print(temp_c);
                Serial.print("Humidity: ");
                Serial.print(humidity);
                Serial.println("%");
              
              
               
               if(temp_c<37.5){ //lighting up the led
                  digitalWrite(4,HIGH);
                }
                  
              if(temp_c>37.7){ //lighting up the led
                  digitalWrite(4,LOW);
                }
               
              
              
               if(humidity<57){
               digitalWrite(3,HIGH);
               }
              
              
              if(humidity>61){
                digitalWrite(3,LOW); 
              }
                delay(1000);
              }

              دیدگاه


                #8
                پاسخ : ساخت کنترل کننده pid با آردوینو

                با سلام و درود
                در این مطلب پیرامون مبحث PID مواردی بیان شده است که می تواند کمک کننده باشد:
                پست یازدهم اضافه شد ... خب فهرست زیر قراره که به مرور تکمیل بشه...هر کدوم که مطالبش قرار داده شد متنشو لینک میکنم به همون پست مورد نظر که دسترسی به مطالب راحت باشه...اگه موضوع دیگه ای هم از قلم افتاده بود لطفا تذکر بدید... و باز هم از اساتید محترم تقاضامندیم که هرجا بیراهه رفتیم تذکر بدن... در فازهای بعدی ایشالا وارد کنترل

                دیدگاه


                  #9
                  پاسخ : ساخت کنترل کننده pid با آردوینو

                  نوشته اصلی توسط sadegh.put نمایش پست ها
                  اون مشکل برنامه نویسی حل شد ... برای بخش انتگرال گیر محدوده مثبت و منفی قرار دادم و برای خود سیگنال pid محدوده 0 تا 255 قرار دادم ...
                  الان مشکل اصلی دیمر هست ... اگه کمک کنید ممنون میشم
                  سلام.
                  از رله SSR استفاده کنید. انشاالله خوب باشه.

                  دیدگاه


                    #10
                    پاسخ : ساخت کنترل کننده pid با آردوینو

                    نوشته اصلی توسط sadegh.put نمایش پست ها
                    اون مشکل برنامه نویسی حل شد ... برای بخش انتگرال گیر محدوده مثبت و منفی قرار دادم و برای خود سیگنال pid محدوده 0 تا 255 قرار دادم ...
                    الان مشکل اصلی دیمر هست ... اگه کمک کنید ممنون میشم
                    سلام ببخشید منم دقیقا مشکل شما رو دارم...میخوام با آردوینو و PID کنترلر معمولی که نوشته شده سرعت یک موتور رو کنترل میکنم ولی خروجی PID یه بازه خیلی بزرگ میشه که با 0 تا 255 مربوط به PWM هم خوانی نداره...ممنون میشم اگه یکم بیشتر توضیح بدین که چجوری مشکل رو حل کردین و اگه یک نمونه کد هم بذارید که ممنونتون میشم.
                    جدیدترین ویرایش توسط sajad1210; ۱۷:۱۶ ۱۳۹۷/۰۹/۰۸.

                    دیدگاه

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