اطلاعیه

Collapse
No announcement yet.

مشکل کار با PID

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

    مشکل کار با PID

    سلام من یه مدار طراحی کردم که ورودی 4 تا 20 میلی امپری داره و یه ورودی 0 تا 10 ولتی داره
    4 الی 20 میلی امپر رو میخونه و تبدیل به 0 تا 1023 میکنه
    0 تا 10 ولت رو میخونه و تبدیل به 0 تا 1023 میکنه
    در قسمت بعدی طراحی یه خروجی 0 تا 10 ولت با OCR1A درست کردم که با مقدار 0 به من صفر ولت میده و با مقدار 1023 به من 10 ولت میده
    تا اینجا همه چی اوکی و بدون مشکله
    ورودی 4 الی 20 میلی امپر وصله به سنسور فشار
    ورودی 0 تا 10 ولت وصله به یه ولوم

    رفرنس من ولوم هست که روی یه مقدار تنظیم میشه و من مقدار سنسور رو میخونم و میخام با محاسبه PID یه خروجی 0 الی 10 ولت بدم به یک الکتروموتور که فشار رو به حد مطلوبی که با ولوم تنظیم شده برسونه تا حالا PID کار نکردم برنامه یه چیزایی برای بخش PID نوشتم اما درست جواب نمیگیرم میشه راهنماییم کنین؟

    دلیل: ادغام دو پست برای جلوگیری از اسپم

    تکه کد مربوط به PID


    #define Tsample 100
    #define TP 1
    #define TI 1
    #define TD 1
    if( Sec >= Tsample)
    {
    Error = SP - Sens ;

    Pterm = TP * Error;
    Iterm = (TP/TI)* Last_Error;
    Dterm = TD * (Last_Process - Processvalue);

    Processvalue = ( Pterm + Iterm + Dterm );

    Last_Error = Last_Error + Error;
    Last_Process = Processvalue;

    if (Processvalue >= 1023)
    Processvalue= 1023;
    else
    if (Processvalue <=0)
    Processvalue= 0;

    Sec=0;

    }

    جدیدترین ویرایش توسط saeid.fzly; ۱۵:۲۶ ۱۳۹۶/۱۰/۰۱.

    #2
    پاسخ : مشکل کار با PID

    کسی نمیتونه راهنماییم کنه؟

    دیدگاه


      #3
      پاسخ : مشکل کار با PID

      با سلام
      چند نکته: اول اینکه بنظر میاد حاصل Dterm شما همیشه صفر میشه.
      بعد اینکه اینتروال زمانی لوپ کنترلی چقدره و پروسس قرار با چه سرعتی کنترل بشه؟ سرعت لوپ باید بیش از 10 برابر سرعت پروسس (ثابت زمانی پاسخ پله) باشه.
      بعد هم نوسانات adc در هنگام خوندن ورودیهاست که باید چک و به روشهای نرم افزاری و سخت افزاری حذف بشه.
      کمترین توقع از یک فرد تحصیلکرده، دانستن املای صحیح کلمات است.

      دیدگاه


        #4
        پاسخ : مشکل کار با PID

        نوشته اصلی توسط نو رسیده نمایش پست ها
        با سلام
        چند نکته: اول اینکه بنظر میاد حاصل Dterm شما همیشه صفر میشه.
        بعد اینکه اینتروال زمانی لوپ کنترلی چقدره و پروسس قرار با چه سرعتی کنترل بشه؟ سرعت لوپ باید بیش از 10 برابر سرعت پروسس (ثابت زمانی پاسخ پله) باشه.
        بعد هم نوسانات adc در هنگام خوندن ورودیهاست که باید چک و به روشهای نرم افزاری و سخت افزاری حذف بشه.
        در مورد نوسانات ADC هیچ مشکلی نیست نوسانی وجود نداره
        در مورد dterm نظر شما چیه باید برنامه به چه شکلی تغییر کنه؟
        سرعت کنترل برای من خیلی از اهمیت خاصی برخوردار نیست یه کانتر گذاشتم که بوسیله اینتراپت اضافه میشه ( وقفه من هر 2 میلی ثانیه اجرا میشه ) و وقتی به اندازه مقدار ثابت tsample برسه صفر میشه و دستورات انجام میشه طبق چیزی که گذاشتم.

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

        دیدگاه


          #5
          پاسخ : مشکل کار با PID

          نوسان حتما وجود داره. بهترین ADC ها هم به اندازه ی 1 LSB نوسان مجاز دارن. حتما مقدارش رو چک کنین و تا حد ممکن کمش کنین.
          بعد از حذف ریپلهای احتمالی تغذیه ها و سیگنال ورودی و ولتاژ رفرنس ADC، مقدار خونده شده و هم بوسیله ی یه فیلتر کالمن با سرعت مناسب فیلتر کنین تا مقدار و فرکانس تکرارش حداقل بشه.
          در مورد Dterm شما به مقدار خروجی که از SENS میخونید باید توجه کنید و تغییراتش در واحد زمان رو باید در نظر بگیرید. فرض کنید فشار به حد مطلوب رسیده و سیستم پایداره، ناگهان یه شیر باز میشه و فشار افت ناگهانی پیدا میکنه، در اینجا تغییر ناخواسته ی خروجی سنس میشه و Dterm با مقدار بیشتری به کمک لوپ کنترل میادو البته دقت کنین که علامتش نسبت به خروجی باید منفی باشه یعنی کاهش خروجی سبب زیاد شدن مقدارش بشه.
          در حلقه های کنترلی سرعت لوپ پارامتر مهمیه.
          اگه سرعت حلقه نسبت به سرعت تغییرات پروسس بالا باشه، تغییرات خروجی تقریبا دیده نمیشن و بالتبع خروجی مناسبی هم تولید نمیشه و اگه خیلی پائین باشه باز هم سبب ناپایداری سیستم میشه. در هر دوی این حالات تنظیم ضرایب کنترلی بسیار سخت و یا غیر ممکن میشه.
          در اصل قدم اول برای داشتن یه سیستم کارا، تنظیم سرعت مناسب برای حلقه و بعد تنظیم ضرائب کنترلی هست.
          بنظرم 2 میلی ثانیه برای کار شما سرعت خیلی زیادیه. بهتره با 2 دهم ثانیه امتحان کنین.
          همونطور که عرض کردم ملاک تعیین تایم حلقه، سرعت پاسخ پله ی سیستم هست.
          کمترین توقع از یک فرد تحصیلکرده، دانستن املای صحیح کلمات است.

          دیدگاه


            #6
            پاسخ : مشکل کار با PID

            وقت بخیر

            مهمترین نکته اینکه متغییرهای حلقه pid باید علامت دار باشند !!! والا درست عمل نمیکنن !! از مقایسه نهایی که مقدارتون حداکثر و صفر هست میشه حدس زد مه علامت دار نیستند !! بازه تغییرات مثلا باید بین 1024 و -1024 باشه یا 512 و -512 باشه !!

            دیدگاه


              #7
              پاسخ : مشکل کار با PID

              نوشته اصلی توسط نو رسیده نمایش پست ها
              نوسان حتما وجود داره. بهترین ADC ها هم به اندازه ی 1 LSB نوسان مجاز دارن. حتما مقدارش رو چک کنین و تا حد ممکن کمش کنین.
              بعد از حذف ریپلهای احتمالی تغذیه ها و سیگنال ورودی و ولتاژ رفرنس ADC، مقدار خونده شده و هم بوسیله ی یه فیلتر کالمن با سرعت مناسب فیلتر کنین تا مقدار و فرکانس تکرارش حداقل بشه.
              در مورد Dterm شما به مقدار خروجی که از SENS میخونید باید توجه کنید و تغییراتش در واحد زمان رو باید در نظر بگیرید. فرض کنید فشار به حد مطلوب رسیده و سیستم پایداره، ناگهان یه شیر باز میشه و فشار افت ناگهانی پیدا میکنه، در اینجا تغییر ناخواسته ی خروجی سنس میشه و Dterm با مقدار بیشتری به کمک لوپ کنترل میادو البته دقت کنین که علامتش نسبت به خروجی باید منفی باشه یعنی کاهش خروجی سبب زیاد شدن مقدارش بشه.
              در حلقه های کنترلی سرعت لوپ پارامتر مهمیه.
              اگه سرعت حلقه نسبت به سرعت تغییرات پروسس بالا باشه، تغییرات خروجی تقریبا دیده نمیشن و بالتبع خروجی مناسبی هم تولید نمیشه و اگه خیلی پائین باشه باز هم سبب ناپایداری سیستم میشه. در هر دوی این حالات تنظیم ضرایب کنترلی بسیار سخت و یا غیر ممکن میشه.
              در اصل قدم اول برای داشتن یه سیستم کارا، تنظیم سرعت مناسب برای حلقه و بعد تنظیم ضرائب کنترلی هست.
              بنظرم 2 میلی ثانیه برای کار شما سرعت خیلی زیادیه. بهتره با 2 دهم ثانیه امتحان کنین.
              همونطور که عرض کردم ملاک تعیین تایم حلقه، سرعت پاسخ پله ی سیستم هست.
              همونطور که گفتم از لحاظ نوسانات اوکیه موردی نیست هم فیلتر های سخت افزاری هم فرکانس پایین ADC هم فیلترای نذم افزاری همگی باعث شده من نوسانات زیادی نداشته باشم که بخواد سیستمو دچار نوسانات کلی زیاد بکنه با اینکه نمایشگر و چیزی به برد الان متصل نیست اما چون این کد و برنامه نویسی و همینطور سخت افزارش رو از یکی از بردهای دقیق که طراحی کردم برای استافاده صنعتی برداشتم مطمینم درسته
              مشکل من اینه PID رو از لحاظ توضیخحی و تئوری بلدم اما تا حالا باهاش کار نکردم و واقعا هیچی ازش نمیدونم توی وبسایت ها هم هیچ مرجع و مطلب قابل فهم خوب برای کدنویسی و تنظیماتش پیدا نکردم
              حالا داخل یه پروژه گیرش افتادم و واقعا نمیدونم چی کاز کنم.

              در حال حاظر در مورد زمان اجرای لوپ
              2 میکو ثانیه وقفه من اجرا میشه که متغیر SEC هی اضافه میشه تا بشه 100 یعنی زمان اجرا لوپ 200 میلی ثانیه هست اگه دقت کنین داخل برنامه نوشتم ( شرط اول ) که اگه برابر 100 شد لوپ اجرا بشه
              درمورد dterm حتی وقتی حذفش میکنم با اسکوپ خروجی 0 تا 10 ولتو چک میکنم تغییرات درست نیست
              اون قسمت که مربوط به اینکه اگه 4 میلی امپر بود خروجی زیاد و 20 میلی امپر شد خروجی کم هم اوکی هست.

              هم خودم توی لوپم هم برنامه
              ایا نمونه کد مناسبی وجود نداره از روی اون بشه الگو مناسب برداشت؟

              دلیل: ادغام دو پست برای جلوگیری از اسپم

              نوشته اصلی توسط taktrashe نمایش پست ها
              وقت بخیر

              مهمترین نکته اینکه متغییرهای حلقه pid باید علامت دار باشند !!! والا درست عمل نمیکنن !! از مقایسه نهایی که مقدارتون حداکثر و صفر هست میشه حدس زد مه علامت دار نیستند !! بازه تغییرات مثلا باید بین 1024 و -1024 باشه یا 512 و -512 باشه !!
              مقدار نهایی برنامه من داخل متغیری قرار میگیره از نوع اینتیجر و بدون علامت
              بحث اینه اصلا درست جواب نمیده که بخوام تنظیم کنم ضرایب رو
              الان برای تست ازمایشگاهی خودم ضرایب مثلا روی چند باید قرار بگیره به نظر شما؟ چی پیشنهاد میکنین؟

              دیدگاه


                #8
                پاسخ : مشکل کار با PID

                پیشنهاد میکنم کار رو قدم به قدم پیش ببرید.
                اول از P شروع کنین و بعد I و D رو هم بهش اضافه کنین.
                اینکه شما همه رو 1 گذاشتید درست نیست. معمولا ضریب تناسبی زیاد و ضریب انتگرالی کمتر از 0.1 در میاد.
                ترم P باید بتونه فشار رو تا نزدیکی ست پوینت ببره. اگه نشد ضریبش رو افزایش بدین تا به نزدیکی ست پوینت برسین.
                ضریب I رو بعد از اون اضافه کنین و طوری تنظیمش کنین که مقدار خروجی به ست پوینت برسه. دقت کنین که بالا بودن ضریب I سبب نوسانی شدن سیستم میشه.
                و بعدشم D رو اضافه کنین که تغییرات ناگهانی خروجی رو مدیریت میکنه.
                ضمن اینکه متغیرهای مورد استفاده داخلی باید علامت دار باشند.
                در کل اگه فقط از P هم استفاده کنین باید بتونین تا نزدیکی ست پوینت برید بالا. اگه نمیشه مشکل جای دیگه ای هست.
                کمترین توقع از یک فرد تحصیلکرده، دانستن املای صحیح کلمات است.

                دیدگاه


                  #9
                  پاسخ : مشکل کار با PID

                  نوشته اصلی توسط نو رسیده نمایش پست ها
                  پیشنهاد میکنم کار رو قدم به قدم پیش ببرید.
                  اول از P شروع کنین و بعد I و D رو هم بهش اضافه کنین.
                  اینکه شما همه رو 1 گذاشتید درست نیست. معمولا ضریب تناسبی زیاد و ضریب انتگرالی کمتر از 0.1 در میاد.
                  ترم P باید بتونه فشار رو تا نزدیکی ست پوینت ببره. اگه نشد ضریبش رو افزایش بدین تا به نزدیکی ست پوینت برسین.
                  ضریب I رو بعد از اون اضافه کنین و طوری تنظیمش کنین که مقدار خروجی به ست پوینت برسه. دقت کنین که بالا بودن ضریب I سبب نوسانی شدن سیستم میشه.
                  و بعدشم D رو اضافه کنین که تغییرات ناگهانی خروجی رو مدیریت میکنه.
                  ضمن اینکه متغیرهای مورد استفاده داخلی باید علامت دار باشند.
                  در کل اگه فقط از P هم استفاده کنین باید بتونین تا نزدیکی ست پوینت برید بالا. اگه نمیشه مشکل جای دیگه ای هست.
                  متوجه شدم تست میکنم پله به پله و میبرمش جلو
                  قبلا با ضریب تناسبی تست کردم و تا نزدیکی مقدار ست پوینت بالا بردش اما دیگه همه رو به هم اضافه کردم و پله به پله اضافه نکردم
                  در مورد اینکه متغیر های داخلی علامت دار باشه من اینطور تعریف کردم
                  volatile signed int
                  Error,
                  Last_Error,
                  Pterm,
                  Dterm;
                  volatile signed long int
                  Last_Process,
                  Iterm;


                  دلیل: ادغام دو پست برای جلوگیری از اسپم

                  فقط به نظر شما ضریب ها رو به طور پیش فرض روی چه مقداری بزارم به جز مقدار p چون میدونم روی 3 باید باشه
                  در ضمن از لطفی که در حق بنده میکنین و منو راهنمایی میکنین خیلی ممنون هستم

                  یه سوال دیگه کد نویسی PID که در پست شماره 1 هست به نظر شما ایراد خاصی که نداره؟

                  دلیل: ادغام دو پست برای جلوگیری از اسپم

                  عکس برد طراحی شده

                  جدیدترین ویرایش توسط saeid.fzly; ۱۹:۱۷ ۱۳۹۶/۱۰/۰۳.

                  دیدگاه


                    #10
                    پاسخ : مشکل کار با PID

                    خواهش میکنم. کاری نیست.
                    عرض کنم خدمتتون که توی حلقه ی PID ، برای کنترل مناسب ضرائب باید علاوه بر علامتدار بودن، از نوع اعشاری هم تعریف بشن تا بتونن مقادیر دقیق بگیرن و سیستم نوسانی نشه.
                    گرچه خروجیتون اینتجر هست، اما اجازه بدین محاسبات حلقه درست و با مقادیر حقیقی انجام بشه و تقریبی که برای اینتجر شدن بهش میخوره فقط در همون مرحله ی خروجی باشه.
                    تقریب زدن در محاسبات سبب ضرب چند خطا در هم و ایجاد خطاهای بزرگتر میشه و در نهایت سیستم رو واگرا میکنه.
                    ضرایب I و D معمولا زیر 1 و حتی در حد چند صدم ممکنه در بیان و اعمال اونها با متغیرهای صحیح امکان پذیر نیست.
                    در کد شما غیر از اون داستان صفر بودن ترم دیفرنشیتور ظاهرا ایرادی دیده نمیشه که البته اونهم خیلی مهم نیست. در بسیاری از سیستمهایی که با موتور سر و کار دارن فقط از PI استفاده میشه.
                    اما در نهایت باید بتونه از پس کار بر بیاد.
                    کمترین توقع از یک فرد تحصیلکرده، دانستن املای صحیح کلمات است.

                    دیدگاه


                      #11
                      پاسخ : مشکل کار با PID

                      نوشته اصلی توسط نو رسیده نمایش پست ها
                      خواهش میکنم. کاری نیست.
                      عرض کنم خدمتتون که توی حلقه ی PID ، برای کنترل مناسب ضرائب باید علاوه بر علامتدار بودن، از نوع اعشاری هم تعریف بشن تا بتونن مقادیر دقیق بگیرن و سیستم نوسانی نشه.
                      گرچه خروجیتون اینتجر هست، اما اجازه بدین محاسبات حلقه درست و با مقادیر حقیقی انجام بشه و تقریبی که برای اینتجر شدن بهش میخوره فقط در همون مرحله ی خروجی باشه.
                      تقریب زدن در محاسبات سبب ضرب چند خطا در هم و ایجاد خطاهای بزرگتر میشه و در نهایت سیستم رو واگرا میکنه.
                      ضرایب I و D معمولا زیر 1 و حتی در حد چند صدم ممکنه در بیان و اعمال اونها با متغیرهای صحیح امکان پذیر نیست.
                      در کد شما غیر از اون داستان صفر بودن ترم دیفرنشیتور ظاهرا ایرادی دیده نمیشه که البته اونهم خیلی مهم نیست. در بسیاری از سیستمهایی که با موتور سر و کار دارن فقط از PI استفاده میشه.
                      اما در نهایت باید بتونه از پس کار بر بیاد.
                      پس من به جای اینتیجر از فلوت استفاده کنم؟

                      دیدگاه


                        #12
                        پاسخ : مشکل کار با PID

                        نوشته اصلی توسط saeid.fzly نمایش پست ها
                        پس من به جای اینتیجر از فلوت استفاده کنم؟
                        بله. حتما.
                        کمترین توقع از یک فرد تحصیلکرده، دانستن املای صحیح کلمات است.

                        دیدگاه


                          #13
                          پاسخ : مشکل کار با PID

                          نوشته اصلی توسط نو رسیده نمایش پست ها
                          بله. حتما.
                          سلام خیلی ممنون مشکل حل شد و به درستی سیستم کار میکنه

                          ممنون از زحماتتون

                          دیدگاه


                            #14
                            پاسخ : مشکل کار با PID

                            نوشته اصلی توسط saeid.fzly نمایش پست ها
                            سلام خیلی ممنون مشکل حل شد و به درستی سیستم کار میکنه
                            خواهش میکنم.
                            از حل مشکل خوشحال شدم.
                            کمترین توقع از یک فرد تحصیلکرده، دانستن املای صحیح کلمات است.

                            دیدگاه


                              #15
                              پاسخ : مشکل کار با PID

                              نوشته اصلی توسط نو رسیده نمایش پست ها
                              خواهش میکنم.
                              از حل مشکل خوشحال شدم.
                              وقتی متغیر روی فلوت گذاشته شد مشکلات حل شد البته توی برنامه خود PID هم تغییراتی دارم که کد نهایی بخش PID به این شکل شد.

                                      Error = Analog1 - Analog2 ;

                              Pterm = TP * Error;
                              Iterm = (TI * Error ) + Last_Error;
                              Dterm = TD * (Last_Process - Processvalue);

                              Processvalue = ( Pterm + Iterm + Dterm );

                              Last_Error = Error;
                              Last_Process = Processvalue;

                              دیدگاه

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