পিআইডি নিয়ন্ত্রণ লুপগুলি বড় এবং অপ্রত্যাশিত ব্যতিক্রমী সাথে


10

সংক্ষিপ্ত প্রশ্ন
অন্যথায় অভিন্ন নিয়ন্ত্রণ অঞ্চলে খুব বড় অসঙ্গতিগুলি (মাত্রার ক্রম) পরিচালনা করার জন্য কি সাধারণ উপায় আছে?

পটভূমি
আমি একটি নিয়ন্ত্রণ অ্যালগরিদম নিয়ে কাজ করছি যা একটি সাধারণ ইউনিফর্ম নিয়ন্ত্রণ অঞ্চল জুড়ে মোটর চালায়। কোনও / ন্যূনতম লোডিংয়ের সাথে পিআইডি নিয়ন্ত্রণ দুর্দান্ত কাজ করে (দ্রুত প্রতিক্রিয়া, কোনও ওভারশুট কম নয়)। আমি যে সমস্যাটি নিয়ে চলেছি তা হ'ল সাধারণত কমপক্ষে একটি উচ্চ লোডের অবস্থান থাকবে। ইনস্টলেশনের সময় অবস্থানটি ব্যবহারকারী দ্বারা নির্ধারিত হয়, সুতরাং কখন / কোথায় এটি আশা করা যায় তা জানার জন্য আমার পক্ষে যুক্তিসঙ্গত কোনও উপায় নেই।

আমি যখন উচ্চ লোডের অবস্থানটি পরিচালনা করতে পিআইডি টিউন করি তখন এটি লোডহীন অঞ্চলগুলিতে (যা আমি পুরোপুরি প্রত্যাশা করি) উপর বড় অঙ্কুর ঘটায়। এটি ঠিক আছে যখন মাঝের ভ্রমণকে তদারকি আছে, ঘেরটিতে কোনও যান্ত্রিক হার্ড স্টপ নেই। হার্ডস্টপের অভাবের অর্থ হ'ল যে কোনও গুরুত্বপূর্ণ ওভারশুট কন্ট্রোল আর্মটিকে মোটর থেকে সংযোগ বিচ্ছিন্ন করতে পারে (একটি ডেড ইউনিট দেয়)।

যে বিষয়গুলি আমি প্রোটোটাইপ করছি

  • নেস্টেড পিআইডি (খুব আক্রমণাত্মক যখন লক্ষ্য থেকে অনেক দূরে, রক্ষণশীল যখন কাছে তখন)
  • দূরে যখন স্থির লাভ, কাছাকাছি যখন পিআইডি
  • কনজারভেটিভ পিআইডি (কোনও লোড ছাড়াই কাজ করে) + একটি বাহ্যিক নিয়ন্ত্রণ যা পিআইডি স্টল করে এবং অতিরিক্ত শক্তি প্রয়োগ করতে পারে তা না হওয়া পর্যন্ত লক্ষ্য: লক্ষ্য অর্জন করা হয় বা দ্রুত পরিবর্তনের হার সনাক্ত করা হয় (অর্থাত্ উচ্চ লোড অঞ্চল ছেড়ে)

সীমাবদ্ধতা

  • সম্পূর্ণ ভ্রমণ সংজ্ঞায়িত
  • হার্ডস্টপগুলি যোগ করা যাবে না (সময়ে এই সময়ে)
  • ত্রুটি সম্ভবত শূন্য হয় না
  • উচ্চ লোডটি 10% এরও কম ভ্রমণ থেকে প্রাপ্ত করা যেতে পারে (যার অর্থ "চলমান শুরু নয়")

উত্তর:


2

আপনার ত্রুটি গণনাটি ডেরিভেটিভ টার্মের সাথে কাজ করার সময় ত্রুটি জমে উঠছে বলে মনে হয় না এবং আপনি এটি সংশোধন করতে পারেন যেহেতু কেবলমাত্র ডেরাইভেটিভ শব্দটি প্রক্রিয়াটিতে দ্রুত পরিবর্তনের ক্ষেত্রে প্রতিক্রিয়া জানাতে সক্ষম।

যদি আমি এটি আপনার কোড ডান

// Determine the error delta
dE = abs(last_error - new_error);
last_error = new_error;

বর্তমান ত্রুটির উপর ভিত্তি করে নিয়ন্ত্রণের শব্দটি সর্বদা গণনা করবে, এটি পিআইডি কীভাবে কার্যকর হয়েছিল তা theতিহ্যগত উপায়। আই টার্মটি যে কোনওভাবেই জমা হওয়া ত্রুটির যত্ন নেওয়ার কথা বলে এটি ঠিক আছে।

তবে, আমার কাছে একজন গ্রাহক ছিলেন যিনি নিম্নলিখিত ধারণাটি নিয়ে এসেছিলেন যা আপনি চেষ্টা করতে পারেন। যেহেতু আপনার প্রক্রিয়া বক্ররেখার একটি অংশ রয়েছে যেখানে আরও আক্রমণাত্মক পরিবর্তন প্রয়োজন, আপনি এমনকি ডি অংশ ত্রুটিটিও জমা হতে দিতে পারেন:

if(TD)                                                 // Calculate D term
{  
   Last_C += (Error - Last_C) / TD;                    // D term simulates
   Dterm = (Error - Last_C) * KD;                      // capacitor discharging
}
else    
   Dterm = 0;                                          // D term is OFF (TD is 0)

এখানে দুটি আকর্ষণীয় বিষয় লক্ষণীয়:

  • টিডি মানটি ডেরিভেটিভ লাভ নয় (যা কেডি) তবে ডেরিভেটিভ সময়, এমন একটি ব্যবহারকারী ধ্রুবক যা ত্রুটি জমা হওয়ার সময়কে নিয়ন্ত্রণ করে। যদি এটি শূন্যতে সেট করা থাকে, পিডি ডি ডি অংশ কেডি লাভের মান সেটটিকে উপেক্ষা করে অক্ষম করে।

  • বর্তমান ত্রুটিটি ডি-পার্ট গণনাতে নেওয়ার আগে সর্বশেষ_সি মানটি 'চার্জ' করতে কীভাবে ব্যবহৃত হয়েছিল তা নোট করুন। লাস্ট_ সি ভেরিয়েবলটি ক্যাপাসিটারের মতো কাজ করছে, ত্রুটি বড় হওয়ার সাথে সাথে এটি তৈরি হবে, যাতে আপনার ডেরাইভেটিভ অংশটি ত্রুটির সাম্প্রতিক 'ইতিহাস' এর উপর ভিত্তি করেও কাজ করে এবং তার পরে (ত্রুটি যখন ছোট ছিল) এই 'ইতিহাস 'ক্যাপাসিটরের মতো স্রাব করবে।

অবশ্যই, আপনি সম্ভবত ইতিমধ্যে যেভাবে মোট আউটপুট সীমাবদ্ধ করবেন (এন্টি উইন্ডআপ রিসেট, ম্যানুয়াল ট্রান্সফারে বোমলেস অটো এবং অন্যান্য সাধারণ স্টাফ)।

আপনার পিআইডি অ্যালগরিদমের অন্যান্য শর্তাদি সম্পর্কে আমি আরও বিশদ পোস্ট করতে পারি যদি আপনি এটি দরকারী মনে করেন তবে আপনি এটি চেষ্টা করে দেখতে পারেন এবং কী ঘটে। এটি আমার গ্রাহককে বছরের পর বছর ভালভাবে সেবা করেছে।


ইনপুট জন্য ধন্যবাদ। আমি এই চেষ্টা করতে হবে। একটি তাত্ক্ষণিক নজরে এটি বোধ হয় বলে মনে হচ্ছে।
অ্যাডাম লুইস

আমি দেখতে পাচ্ছি, সুতরাং আপনার 'প্রধান' পিআইডি প্লাসের মধ্যে স্টল সনাক্তকরণ গণনায় আনার সাথে সাথে আপনার একটি ডি টার্ম অবদান রয়েছে।
ড্রাজেন সিকা

1
এটাই সঠিক. পিআইডির ডিটারম ব্যবহার করা হয়, টিউন করার সময় খুব আক্রমণাত্মক নয়। এই সমস্যাটিকে আরও জটিল করে তোলে যা হ'ল খুব অল্প সময়ের মধ্যেই লোডটি মুক্ত হয়ে যেতে পারে । IE একটি লিঙ্কেজ নিষ্ক্রিয় করা হচ্ছে। স্টল বাহিনীগুলিতে যখন কোনও স্মুথিং ফাংশন (সংক্ষেপণ) প্রয়োগ করা হয় তখন এই আকস্মিকভাবে বলটি অপসারণের ফলে বড় অভারশুট হয়।
অ্যাডাম লুইস

দুষ্ট সমস্যা, এটি জেনে রাখা আকর্ষণীয় হবে যে কিছু ফাজি যুক্তিযুক্ত অ্যালগোরিদম এটি কীভাবে পরিচালনা করবে। কমপক্ষে আপনি স্ট্যান্ডার্ড সমাধানগুলির মধ্যে সীমাবদ্ধ থাকার পরিবর্তে আপনার সমস্যার সম্পর্কিত আরও অনেকগুলি অ্যালগোরিদমে তৈরি করতে পারেন। যাইহোক, এর সাথে শুভকামনা :-)
ড্র্যাজেন সিকা

1

প্রাথমিক সমাধান

স্টলড_পিউএম_আউটপুট = পিডব্লিউএম / | .E |

পিডব্লিউএম = সর্বাধিক পিডব্লিউএম মান
rorE = শেষ_আরর - নতুন_আরর

প্রাথমিক সম্পর্ক মোটর পরিবর্তনের অভাবের ভিত্তিতে সাফল্যের সাথে পিডব্লিউএম আউটপুটকে র‌্যাম্প করে । নমুনা আউটপুট জন্য নীচের গ্রাফ দেখুন।

এই পন্থাটি সেই পরিস্থিতিতে তৈরি করে যেখানে অ-আক্রমণাত্মক পিআইডি স্থগিত হয় st তবে, এটি দুর্ভাগ্যজনক (এবং স্পষ্ট) ইস্যুতে রয়েছে যে অ-আক্রমণাত্মক পিআইডি যখন সেট পয়েন্টটি অর্জন করতে সক্ষম হয় এবং ধীরগতির চেষ্টা করে, তখন অচল_পিডব্লিউএম_আউটপুট র‌্যাম্প আপ হয়। কোনও ভারী-ভারী অবস্থানের স্থানে ভ্রমণের সময় এই র‌্যাম্পটি একটি বড় ওভারশুট তৈরি করে।

1 / ΔE বনাম ΔE

বর্তমান সমাধান

তত্ত্ব

স্টলড_পিউএম_আউটপুট = (কেই * পিআইডিপডব্লুএম) / | .E |

কেই = স্কেলিং ধ্রুবক
পিআইডিপিডব্লুএম = অ-
আগ্রাসী পিআইডি থেকে বর্তমান পিডব্লিউএম অনুরোধ =E = সর্বশেষ_আরর - নতুন_আরর

আমার বর্তমান সম্পর্কটি এখনও 1 / ΔE ধারণাটি ব্যবহার করে তবে স্টল_পডব্ল্যাম_আউটপুট নির্ধারণের জন্য অ আক্রমণাত্মক পিআইডি পিডব্লিউএম আউটপুট ব্যবহার করে। এটি টার্গেট সেটপয়েন্টের কাছাকাছি আসতে শুরু করলে পিআইডি স্টল_পিডব্লিউএম_আউটপুটটিকে ফেরত ফেলার অনুমতি দেয়, তবুও থামলে 100% পিডব্লিউএম আউটপুট দেয়। পিডাব্লুএমটি স্যাচুরেশন পয়েন্টে (নিচে গ্রাফের মধ্যে 10,000 এর উপরে) প্রবেশ করে তা নিশ্চিত করার জন্য স্কেলিং ধ্রুবক কেই প্রয়োজন E

সুডোকোড

মনে রাখবেন যে, cal_stall_pwm থেকে ফলাফলের হয় যোগ আমার বর্তমান নিয়ন্ত্রণ যুক্তিবিজ্ঞান মধ্যে PID, PWM আউটপুট।

int calc_stall_pwm(int pid_pwm, int new_error)
{
    int ret = 0;
    int dE = 0;
    static int last_error = 0;
    const int kE = 1;

    // Allow the stall_control until the setpoint is achived
    if( FALSE == motor_has_reached_target())
    {
        // Determine the error delta
        dE = abs(last_error - new_error);
        last_error = new_error;

        // Protect from divide by zeros
        dE = (dE == 0) ? 1 : dE;

        // Determine the stall_pwm_output
        ret = (kE * pid_pwm) / dE;
    }

    return ret;
}

আউটপুট ডেটা

স্থগিত পিডব্লিউএম আউটপুট স্থগিত পিডব্লিউএম আউটপুট

দ্রষ্টব্য যে স্থগিত পিডব্লিউএম আউটপুট গ্রাফে হঠাৎ পিডব্লিউএম ড্রপ ~ 3400 এ একটি বিল্ট ইন সুরক্ষা বৈশিষ্ট্য সক্রিয় করা হয়েছে কারণ মোটর নির্দিষ্ট সময়ের মধ্যে অবস্থানে পৌঁছাতে অক্ষম ছিল।

লোড না হওয়া পিডব্লিউএম আউটপুট নো-লোড পিডব্লিউএম আউটপুট


1

আপনি বলছেন না এটি কী আপনি নিয়ন্ত্রণ করছেন ... মোটর গতি? অবস্থান? ভাল যাই হোক না কেন, প্রথম পদক্ষেপটি গ্রহণযোগ্য ত্রুটিটি কী হবে তা নির্ধারণ করা হবে। উদাহরণস্বরূপ যদি নিয়ন্ত্রণটি গতির জন্য থাকে তবে লক্ষ্যমাত্রার 1% এর মধ্যে সর্বাধিক ত্রুটি সেট করা যেতে পারে। গ্রহণযোগ্য ত্রুটিটি সংজ্ঞায়িত না করে আপনি ADC বা PWM গণনার জন্য আপনার কতটা রেজোলিউশন প্রয়োজন তা নির্ধারণ করতে পারবেন না। তা ছাড়া, পিআইডি ক্ষতিপূরণ নিখুঁত হতে পারে তবে তারপরেও সীমাবদ্ধ চক্র দোলন থাকতে পারে।

তারপরে আপনাকে ওপেন লুপ সিস্টেমের গতিবিদ্যা জানতে হবে। এটি ছাড়া আপনি বুঝতে পারবেন না যে লুপের আনুপাতিক (পি), ইন্টিগ্রাল (আই) এবং ডেরিভেটিভ (ডি) অংশগুলির জন্য কী লাভগুলি প্রয়োজন। আপনি ইনপুট স্টেপ (ড্রাইভ স্তর বা পিডাব্লুএমএমে পদক্ষেপ পরিবর্তন), বা লোডের ধাপে পরিবর্তন (যা আপনার কাছে প্রাসঙ্গিক বলে মনে হয়) দিয়ে ডায়নামিক পরিমাপ করতে পারেন।

চক্র-থেকে-চক্র ত্রুটি পরিবর্তন ব্যবহার করে, আপনার নিয়ন্ত্রণের পূর্বে ডায়ুমিনেটরে, পিডাব্লুএমএম মানটি সংশোধন করে তা নিশ্চিত করে যে লুপটি কখনই স্থির হয় না। এটি নিয়ন্ত্রণে সীমাবদ্ধ চক্র দোলনের বিষয়টি নিশ্চিত করে। বেশিরভাগ গ্রাহকরা তা সহ্য করবেন না।

লুপের পি অংশটি তাত্ক্ষণিক ত্রুটির যত্ন নেয় (তত্ক্ষণাত একটি ত্রুটির প্রতিক্রিয়া জানায়)। তবে এতে সসীম লাভ হবে তাই কিছু ত্রুটি থাকবে। লুপটির আমি অংশটি সময়ের সাথে ধীরে ধীরে প্রতিক্রিয়া দেখায় যে পি অংশটি রেখে গিয়েছিল এমন ত্রুটিটি সংশোধন করতে অসীম লাভ (অসীম লাভের জন্য অসীম সময়) প্রয়োগ করে।

যেহেতু আমার অংশটি ধীরে ধীরে এটি ত্রুটি কমানোর জন্য প্রয়োজনীয় সংশোধন সহ ধাপের বাইরে যেতে পারে, এমনকি যদি আপনার এটির জন্য সঠিক লাভ সেট থাকে set সুতরাং, এটি পুনরুদ্ধার করতে দীর্ঘ সময় নিয়ে ক্ষত হয়ে যায়। বা, এটি পি অংশের বিরোধী হিসাবে ছেড়ে গেছে।

উইন্ড আপ পরিচালনা করার সর্বোত্তম উপায় হ'ল ইন্টিগ্রেটারের সর্বাধিক সঞ্চিত মানটিকে সবচেয়ে খারাপ ক্ষেত্রে আনুপাতিক ত্রুটির জন্য সংশোধন করার প্রয়োজনের চেয়ে আরও কিছুটা সীমাবদ্ধ করা। ইন্টিগ্রেটার যদি পর্যায়ের বাইরে চলে যায় এবং পি এর বিপরীতে থাকে, তবে সবচেয়ে ভাল কাজটি হল ইন্টিগ্রেটারের মান শূন্যে সেট করা। আলগোটি এটি অনুধাবন করার জন্য এবং প্রয়োজনে ইন্টিগ্রেটারকে পুনরায় সেট করার জন্য ডিজাইন করা যেতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.