با سلام خدمت دوستان گرامی
می خواستم برنامه یک کنترل کننده pi برای کنترل سرعت یک موتور bldc با میکرو xmega بنویسم
موتور از نوع سنسوردار هست.باید سرعت رو با یکی از سنسورها اندازه بگیرم.مراحلی که برای اندازه گیری سرعت انجام میدم به این ترتیبه:
اول میام rtc میکرو راه اندازی میکنم و زمان overflow inter روی 500 میلی ثانیه گذاشتم که هر 500 میلی ثانیه یک اینتراپت rtc میده که توی این اینتراپت یک متغیرtime از نوع char رو تاگل میکنم
مرحله بعد اینتراپت یکی از پایه های میکرو که سنسور اثرهال بهش متصل هست رو فعال میکنم و در سرویس روتینش نوشتم که هر زمان که time برابر 0 بود بیاد لبه هارو بشماره(هر دو لبه)
بعد میام تعداد لبه های خونده شده رو توی 12 ضرب میکنم که سرعت بدست میاد. این سرعت رو از سرعت مرجع کم میکنم و بعد مراحل pi کنترلر. خروجی pi هم میدم برای کم و زیاد کردن pwm.
مشکلم اینجاست که وقتی راه اندازی میکنم سرعت خیلی نوسان داره و تا مقدار max میره و دوباره نزدیک صفر میشه . کدی که برای pi نوشتم به این صورته:
لطف میکنید راهنماییم کنید ممنون.;
می خواستم برنامه یک کنترل کننده pi برای کنترل سرعت یک موتور bldc با میکرو xmega بنویسم
موتور از نوع سنسوردار هست.باید سرعت رو با یکی از سنسورها اندازه بگیرم.مراحلی که برای اندازه گیری سرعت انجام میدم به این ترتیبه:
اول میام rtc میکرو راه اندازی میکنم و زمان overflow inter روی 500 میلی ثانیه گذاشتم که هر 500 میلی ثانیه یک اینتراپت rtc میده که توی این اینتراپت یک متغیرtime از نوع char رو تاگل میکنم
مرحله بعد اینتراپت یکی از پایه های میکرو که سنسور اثرهال بهش متصل هست رو فعال میکنم و در سرویس روتینش نوشتم که هر زمان که time برابر 0 بود بیاد لبه هارو بشماره(هر دو لبه)
بعد میام تعداد لبه های خونده شده رو توی 12 ضرب میکنم که سرعت بدست میاد. این سرعت رو از سرعت مرجع کم میکنم و بعد مراحل pi کنترلر. خروجی pi هم میدم برای کم و زیاد کردن pwm.
مشکلم اینجاست که وقتی راه اندازی میکنم سرعت خیلی نوسان داره و تا مقدار max میره و دوباره نزدیک صفر میشه . کدی که برای pi نوشتم به این صورته:
speed=12*count1;
error=ref-speed;
pterm=kp*error;
iterm=(ki*error)+last_iterm;
dterm=(error-last_error)*kd;
out=(pterm+iterm+dterm);
out1=out+out1;
if(out<1) out=100;
if(out>2120) out=2120;
last_iterm=iterm;
last_error=error;
count=0;
}
TCC0.CCD=out;
TCC1.CCA=out;
TCC1.CCB=out
توی این دستورات count1 مربوط به تعداد لبه های خوانده شده توی اینتراپت پین متصل به سنسور هست و ضریب kd صفر.error=ref-speed;
pterm=kp*error;
iterm=(ki*error)+last_iterm;
dterm=(error-last_error)*kd;
out=(pterm+iterm+dterm);
out1=out+out1;
if(out<1) out=100;
if(out>2120) out=2120;
last_iterm=iterm;
last_error=error;
count=0;
}
TCC0.CCD=out;
TCC1.CCA=out;
TCC1.CCB=out
لطف میکنید راهنماییم کنید ممنون.;
دیدگاه