پاسخ : کنترل کننده PID برای دمای کوره(نیاز به کم
سلام مهندس
خسته نباشی.امروز اون پست 0 تا 100 آموزش PID داشتم میخوندم ...واقعا دستت درد نکنه و ایشالا همیشه انرژی داشته باشی تا اطلاعات و برداشتهای کاربردیتو برای همه ما به اشتراک بزاری :job:
ضریب kp واسه این بزرگ گرفتم که سریعتر به مقدار ocr مورد نظرم برسم ولی kd رو از روی نمونه های دیگه و مطالب همینجوری دوبرابر گرفتم آخه همه جا نوشته بود باید بزرگ در از kp باشه البته با ضرب در dt بزرگتر میشه باز :mrgreen:
من فکر کنم باید کدم رو یه باز نگری کنم و فک کنم لازم باشه بهم بگی که برای سرریز متغییر هام درون فرمولم از چه بازدهایی استفاده کنم و اسکیل کنمشون
الان اسکیل کردنم مشکل داره؟لطفا این قسمتو بهم راهنمایی کن شاید باید کاره دیگه ای انجام بدم
مثلا :
برای انتگرال گیر چه بازدهی رو انتخاب کنم ؟ مقدار سایز int یا ماکسیمم مینیمم خروجیم (الان -1024 تا 1024 هست)
توی کد اتمل که واسه pid گذاشته بود یه همچین کاری کرده بود موقع init کردن pid
:
maxError = outMax / (P_Factor + 1);
maxSumError = outMax / (I_Factor + 1);
منم اینو بهش اضافه کردم :
P_Factor = Kp;
I_Factor = Ki * SampleTimeInSec;
D_Factor = Kd / SampleTimeInSec;
و ازش توی کد پایین استفاده کرده
لطفا کد منو یه نگاهی بنداز :
توی کد اتمل یه کار دیگه هم کرده بود...واسه init کردن pid موقعی که داره ضرایب رو set میکنه در یک SCALING_FACTOR ضرب کرده بود (مقدارش 128) و در قسمت محاسبه Pid باز بر همون تقسیم کرده :
ret = (p_term + i_term + d_term) / SCALING_FACTOR;
pdf اش رو خوندم نوشته بود برای افزایش حساسیت هست ...
حالا من اینجارو دیگه حذف کردم
نوشته اصلی توسط Mahdi.Faani
خسته نباشی.امروز اون پست 0 تا 100 آموزش PID داشتم میخوندم ...واقعا دستت درد نکنه و ایشالا همیشه انرژی داشته باشی تا اطلاعات و برداشتهای کاربردیتو برای همه ما به اشتراک بزاری :job:

ضریب kp واسه این بزرگ گرفتم که سریعتر به مقدار ocr مورد نظرم برسم ولی kd رو از روی نمونه های دیگه و مطالب همینجوری دوبرابر گرفتم آخه همه جا نوشته بود باید بزرگ در از kp باشه البته با ضرب در dt بزرگتر میشه باز :mrgreen:
من فکر کنم باید کدم رو یه باز نگری کنم و فک کنم لازم باشه بهم بگی که برای سرریز متغییر هام درون فرمولم از چه بازدهایی استفاده کنم و اسکیل کنمشون
الان اسکیل کردنم مشکل داره؟لطفا این قسمتو بهم راهنمایی کن شاید باید کاره دیگه ای انجام بدم
مثلا :
برای انتگرال گیر چه بازدهی رو انتخاب کنم ؟ مقدار سایز int یا ماکسیمم مینیمم خروجیم (الان -1024 تا 1024 هست)
توی کد اتمل که واسه pid گذاشته بود یه همچین کاری کرده بود موقع init کردن pid
:
maxError = outMax / (P_Factor + 1);
maxSumError = outMax / (I_Factor + 1);
منم اینو بهش اضافه کردم :
P_Factor = Kp;
I_Factor = Ki * SampleTimeInSec;
D_Factor = Kd / SampleTimeInSec;
و ازش توی کد پایین استفاده کرده
لطفا کد منو یه نگاهی بنداز :
کد:
int8_t Compute( )
{
if(!inAuto) return False;
/*Compute all the worI_Factorng error variables*/
float error = *Setpoint - *Input;
// Calculate Pterm and limit error overflow
if (error > maxError)
PTerm = maxError;
else if (error < -maxError)
PTerm = -maxError;
else
PTerm = P_Factor * error;
// Calculate Iterm and limit integral runaway
ITerm += (I_Factor * error);
if(ITerm > maxSumError) ITerm= maxSumError;
else if(ITerm < -maxSumError) ITerm= -maxSumError;
// Calculate Dterm
DTerm = (D_Factor *(error-Lasterror)) ;
/*Compute PID Output*/
float output = PTerm + ITerm + DTerm; ;
if(output > outMax)
{
output = outMax;
}
else if(output < pid_st->outMin)
{
output = pid_st->outMin;
}
*Output = output;
Lasterror=error;
return True;
}
ret = (p_term + i_term + d_term) / SCALING_FACTOR;
pdf اش رو خوندم نوشته بود برای افزایش حساسیت هست ...
حالا من اینجارو دیگه حذف کردم






دیدگاه