پاسخ : راه اندازی موتور براشلس (BLDC)
با سلام،
یه کمی بریم عقب تر و پرژکتورها رو روشن کنیم ببینیم چی دیده میشه
در main.c و حلقه اصلی برنامه، در صورتی که فرمان روشن شدن موتور صادر بشه، وقفه های مقایسه کننده و سرریز تایمر هم فعال میشن وهمونطور که شما اشاره کردید، بدلیل شرط زیر، روتین وقفه مقایسه کننده بدلیل اینکه rotor_run از 200 کمتره، هیچ کاری انجام نمیده...
و از طرفی، مقدار rotor_run در سر ریز تایمر بطور مداوم صفر میشه! پس حالا باید چیکار کرد؟! :surprised: ( این جمله رو باید با لهجه دهات اصفهان بخونی! :biggrin: )
و اما توجه شما رو به کد زیر که در روتین وقفه سر ریز تایمر هست جلب میکنم که در هر بار سر ریز تایمر، موجب اجرای روتین کوموتاسیون میشه ( بدون توجه به حالات و رفتار مقایسه کننده. رجوع شود به پست قبلی ) و همین هست که موجب تکان خوردن و گردش نسبتا ناقص موتور میشه ( البته فقط اولش اینطوریه! )...
حالا با چند بار سر ریز شدن تایمر و اجرای روتین کوموتاسیون و تکان خوردن موتور، در کمتر از یک ثانیه دور موتور به حداقل 230 دور بر دقیقه میرسه و قبل از سر ریز تایمر، وقفه مقایسه کننده برای بیش از 200 بار اتفاق می افته و شرط زیر برقرار شده و روال عادی اجرای برنامه شروع میشه و سر ریز تایمر هم قاعدتا دیگه اتفاق نمی افته و ادامه ماجرا ....
در اینجا باید این رو اضافه کنم که این عدد 200 با توجه به ساختارهای متفاوت موتورها، ممکنه برای موتور هر کسی نیاز به کم و زیاد شدن داشته باشه. ( قابل توجه دوستانی که موتورشون با مشکل راه می افته و یا اینکه اصلا راه نمی افته! )
اگه بازم سوالی باشه در خدمتیم
نوشته اصلی توسط alireza.r
یه کمی بریم عقب تر و پرژکتورها رو روشن کنیم ببینیم چی دیده میشه

در main.c و حلقه اصلی برنامه، در صورتی که فرمان روشن شدن موتور صادر بشه، وقفه های مقایسه کننده و سرریز تایمر هم فعال میشن وهمونطور که شما اشاره کردید، بدلیل شرط زیر، روتین وقفه مقایسه کننده بدلیل اینکه rotor_run از 200 کمتره، هیچ کاری انجام نمیده...
کد:
if(rotor_run == 200) next_commutate_state(0);
و از طرفی، مقدار rotor_run در سر ریز تایمر بطور مداوم صفر میشه! پس حالا باید چیکار کرد؟! :surprised: ( این جمله رو باید با لهجه دهات اصفهان بخونی! :biggrin: )
و اما توجه شما رو به کد زیر که در روتین وقفه سر ریز تایمر هست جلب میکنم که در هر بار سر ریز تایمر، موجب اجرای روتین کوموتاسیون میشه ( بدون توجه به حالات و رفتار مقایسه کننده. رجوع شود به پست قبلی ) و همین هست که موجب تکان خوردن و گردش نسبتا ناقص موتور میشه ( البته فقط اولش اینطوریه! )...
کد:
next_commutate_state(1);
حالا با چند بار سر ریز شدن تایمر و اجرای روتین کوموتاسیون و تکان خوردن موتور، در کمتر از یک ثانیه دور موتور به حداقل 230 دور بر دقیقه میرسه و قبل از سر ریز تایمر، وقفه مقایسه کننده برای بیش از 200 بار اتفاق می افته و شرط زیر برقرار شده و روال عادی اجرای برنامه شروع میشه و سر ریز تایمر هم قاعدتا دیگه اتفاق نمی افته و ادامه ماجرا ....
کد:
if(rotor_run == 200) next_commutate_state(0);
در اینجا باید این رو اضافه کنم که این عدد 200 با توجه به ساختارهای متفاوت موتورها، ممکنه برای موتور هر کسی نیاز به کم و زیاد شدن داشته باشه. ( قابل توجه دوستانی که موتورشون با مشکل راه می افته و یا اینکه اصلا راه نمی افته! )
اگه بازم سوالی باشه در خدمتیم

دیدگاه