اطلاعیه

Collapse
No announcement yet.

نیاز به یک تابع در مورد شمارش سیگنال

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

    #31
    پاسخ : نیاز به یک تابع در مورد شمارش سیگنال

    نوشته اصلی توسط ramezani.t
    PREACALE یک تغسیم کننده است , وقتی شما PREACALE رو روی 64 گزاشتید , یعنی فرکانس ورودی تایمرتون تغسیم بر 64 میشه , یعنی 16MHz تغسیم بر 64

    حالا دقت کنید , برای اینکه بهتر بتونید فاصله ها رو اندازه بگیرید بهتره عدد PREACALE رو روی 1 قرار بدین
    البته اگر سرعت چرخش دندانه ها اونقدر کمه که تایمر با PREACALE=1 ممکنه سر ریز بشه باید از اعداد دیگه ای برای این کار استفاده کرد

    به هر حال شما زمان بین دندانه ها رو با PREACALE=1 به من بگید

    موفق باشید
    اهان پس یعنی فرکانس تایمر از تقسیم مقدار کریستال میکرو بر PREACALE بدست میاد؟خب اگر فرکانس تایمر کمتر از فرکانس میکرو باشه چه مزیت و مضراتی داره و بلعکس؟

    خب PREACALE روی یک بزارم عددش چندین رقمی میشه و هنوز تست نکردم شاید کمتر از مقدار سرریزی تایمر باشه.این یعنی دقت تایمر به نهایت خودش میرسه درسته؟

    فقط یک مشکل پیدا شده . من ابتدا برنامه ای ک مینویسم روی سیستم با شبیه ساز چک میکنم در شبیه ساز پالس های تولیدی کاملا یک نواخت و یک دست هستن و در یک پالس خاص زمان دوبرابر میشه و به داده های پالس میشه اعتماد کرد اما به دو علت رو داده های موتور ماشین نمیشه اعتماد کرد
    من دیشب با PREACALE عدد 64 رفتم ازمایش کردم دوتا مشکل ایجاد شده
    اول اینکه چون موتور در حالت درجا نزدیک به 1000 دور در دقیقه میچرخه یعنی نقطه A هزار بار در دقیقه از جلو سنسور رد میشه و عدد روی ال سی دی با سرعت بالایی چاپ میشه ک اصلا قابل دیدن نیست و اگر به چاپ ال سی دی تاخییر اضافه کنم زمان پله بعدی با زمان تاخیر ال سی دی اضافه میشه و نمیشه عدد دقیق به دست اورد و نکته بعدی اینکه اصولا موتور های سوختی به هیچ عنوان با دورمتر های دیجیتال سرعت ثابت ندارن چون پارامتر هایی نظیر هوا . اکسیژن . لرزش موتور و ... سرعت ثابت موتور رو تغییر محسوسی میدن ک دیده میشه
    وقتی زمان دندانه ها میخواد چاپ بشه خیلی پرش های یک تا 5 واحدی داره (روی PREACALE عدد 64) که مراحل بالا تر به نظرم باید از همون میانگین ک گفته بودین هم استفاده کنیم. حالا یک فکری به ذهنم رسیده برای بدست اوردن زمان دقیق هر پله ، اگر به نظر شما درسته که ازمایشش کنم
    میخوام به ازای هر دندانه عدد زمانی رو در یک ارایه ذخیره کنه یعنی دندانه اول = عدد زمانی خودش و مرحله بعد دندانه دوم = عدد زمانی خودش و الا اخر

    تا مثلا 360000 دندانه در یک دقیقه رو ذخیره کنم بعد یک رشته طولانی از دندانه ها و زمان هاشون بدست میاد ک بعد از خاموش کردن موتور میشه بررسی شون کرد
    به نظرتون این راه خوبه؟

    اضافه شده در تاریخ :
    من با همون راه تعریف ارایه امروز ازمایش کردم تعجب کردم داده ها یه طوری هستن
    اول اینکه بخاطر پایین بودن حافظه رم میکرو کنترلر ها ، فقط 900 عدد میشه در اس رم میکرو ذخیره کرد منم تا 900 دندانه که حدود دو دور کامل و نیم دور ، چرخ فلایول یا همون چرخ دندانه دار میشه رو ذخیره کردم
    ابتدا استارت زدم و بعد از اینکه موتور روشن شد و در حالت تعادل خوبی قرار گرفت برای چند ثانیه سنسور رو به میکرو وصل کردم
    دندانه اول که تایمش صفر بود اما از دندانه اول به بعد حدودا 60 درصد داده ها در حدود 16200 تا 16700 و 30 درصد در حدود 16700 تا 17200 و 10 درصد هم اعداد منفی مثلا منفی 16200 یا منفی 16780 یا منفی 14000 و یا اعداد سه رقمی مثلا 409 یا 416
    و با بررسی یک به یک این 900 عدد زمانی انتظار داشتم مث شبیه ساز یک زمان هم ایجاد بشه ک دو برابر زمان سایر دندانه ها باشه اما از 17200 بالا تر نرفت
    و چند دفعه هم تکرار کردم هر بار در همین حدود به دست امد
    فرکانس 16 مگار هرتز و PREACALE هم روی یک گذاشتم
    فکر کنم باید یک ماژول ان ار اف به میکرو و یک ماژول هم به سریال کامپیوتر وصل کنم و با ویژال بیسیک داده ها رو لحظه به لحظه دریافت کنم و به نمودار بکشم تا بهتر بشه تحلیل شون کرد البته یه چند روزی زمان میبره حالا از این بگذریم بنظر شما چرا داده ها اینطورن؟چرا نقطه A دیده نمیشه؟درحالی که همون اسکوپم رو به ماشین وصل میکنم قشنگ پالس نقطه A رو نشون میده

    درضمن یک سوال از قبل برای من ایجاد شده بود روز اول میخواستم بپرسم
    من از اسکوپ ک برای نمایش پالس استفاده کردم فیلم گرفتم اما یک ایراد داره و منطقی نیس
    مگر وقتی موتور هزار دور بر دقیقه دوران میکنه خب نقطه A باید هزار بار در دقیقه یا 16 بار در ثانیه باید پالس بده
    اما در اسکوپ هر یک ثانیه یا 500 میلی ثانیه یک بار پالس میاد رو نمایشگر و تاخیر هر پالس نقطه A تا بعدی قابل دیده شدن هست
    میخواید فیلم رو اپلود کنم؟

    دیدگاه


      #32
      پاسخ : نیاز به یک تابع در مورد شمارش سیگنال

      اهان پس یعنی فرکانس تایمر از تقسیم مقدار کریستال میکرو بر PREACALE بدست میاد؟خب اگر فرکانس تایمر کمتر از فرکانس میکرو باشه چه مزیت و مضراتی داره و بلعکس؟

      خب PREACALE روی یک بزارم عددش چندین رقمی میشه و هنوز تست نکردم شاید کمتر از مقدار سرریزی تایمر باشه.این یعنی دقت تایمر به نهایت خودش میرسه درسته؟
      بله , از همین جهت گفتم PREACALE رو روی 1 قرار بدین , تا بتونیم بالاترین دقت رو داشته باشیم

      فقط یک مشکل پیدا شده . من ابتدا برنامه ای ک مینویسم روی سیستم با شبیه ساز چک میکنم در شبیه ساز پالس های تولیدی کاملا یک نواخت و یک دست هستن و در یک پالس خاص زمان دوبرابر میشه و به داده های پالس میشه اعتماد کرد اما به دو علت رو داده های موتور ماشین نمیشه اعتماد کرد
      من دیشب با PREACALE عدد 64 رفتم ازمایش کردم دوتا مشکل ایجاد شده
      اول اینکه چون موتور در حالت درجا نزدیک به 1000 دور در دقیقه میچرخه یعنی نقطه A هزار بار در دقیقه از جلو سنسور رد میشه و عدد روی ال سی دی با سرعت بالایی چاپ میشه ک اصلا قابل دیدن نیست و اگر به چاپ ال سی دی تاخییر اضافه کنم زمان پله بعدی با زمان تاخیر ال سی دی اضافه میشه و نمیشه عدد دقیق به دست اورد و نکته بعدی اینکه اصولا موتور های سوختی به هیچ عنوان با دورمتر های دیجیتال سرعت ثابت ندارن چون پارامتر هایی نظیر هوا . اکسیژن . لرزش موتور و ... سرعت ثابت موتور رو تغییر محسوسی میدن ک دیده میشه
      وقتی زمان دندانه ها میخواد چاپ بشه خیلی پرش های یک تا 5 واحدی داره (روی PREACALE عدد 64) که مراحل بالا تر به نظرم باید از همون میانگین ک گفته بودین هم استفاده کنیم.
      ببینید شما برای دیدن اعداد روی LCD باید از delayها استفاده کنید , این کار مشکلی برای محاسبات و پیدا کردن دندانه ها پیش نمیاره , چون شمارش دندانه ها در وقفه انجام میشه و کار هادی مربوط به LCD در جریان اصلی برنامه , پس هنکامی که میکرو درحال چاپ اطلاعات روی LCD هست , اگر دندانه ای دیده بشه , میکرو وقفه میخوره و به کار شمارش میپردازه و بعد دوباره برمیگرده و کار با LCD رو ادامه میده , این مفهوم ساده ی کار با وقفه است , پس شما برای دیدن اعداد باید از delay استفاده کنید , که مثلا هر نیم ثانیه عدد زمانی بین دندانه ها رو نمایش بده , فرض کنید یک متغیر 16 بیتی به نام Td تعریف کردید , در حلقه اصلی برنامه که در main قرار داره , کارهای مربوط به چاپ روی LCD رو انجام میدین و هر نیم ثانیه Td رو روی نمایش گر میریزید , فعلا همین مقدار به ما کمک میکنه تا سیستم رو دیباگ کنیم.

      حالا یک فکری به ذهنم رسیده برای بدست اوردن زمان دقیق هر پله ، اگر به نظر شما درسته که ازمایشش کنم
      میخوام به ازای هر دندانه عدد زمانی رو در یک ارایه ذخیره کنه یعنی دندانه اول = عدد زمانی خودش و مرحله بعد دندانه دوم = عدد زمانی خودش و الا اخر

      تا مثلا 360000 دندانه در یک دقیقه رو ذخیره کنم بعد یک رشته طولانی از دندانه ها و زمان هاشون بدست میاد ک بعد از خاموش کردن موتور میشه بررسی شون کرد
      به نظرتون این راه خوبه؟
      به نطر من کار درستی نیست , شما فقط به وسیله 4 یا 5 بایت میتونید کل کار رو انجام بدین و فعلا هم برای دیباگ کردن همون LCD کافیه و به بافر و پردازش های بیشتر احتیاج نیست.


      من با همون راه تعریف ارایه امروز ازمایش کردم تعجب کردم داده ها یه طوری هستن
      اول اینکه بخاطر پایین بودن حافظه رم میکرو کنترلر ها ، فقط 900 عدد میشه در اس رم میکرو ذخیره کرد منم تا 900 دندانه که حدود دو دور کامل و نیم دور ، چرخ فلایول یا همون چرخ دندانه دار میشه رو ذخیره کردم
      ابتدا استارت زدم و بعد از اینکه موتور روشن شد و در حالت تعادل خوبی قرار گرفت برای چند ثانیه سنسور رو به میکرو وصل کردم
      دندانه اول که تایمش صفر بود اما از دندانه اول به بعد حدودا 60 درصد داده ها در حدود 16200 تا 16700 و 30 درصد در حدود 16700 تا 17200 و 10 درصد هم اعداد منفی مثلا منفی 16200 یا منفی 16780 یا منفی 14000 و یا اعداد سه رقمی مثلا 409 یا 416
      و با بررسی یک به یک این 900 عدد زمانی انتظار داشتم مث شبیه ساز یک زمان هم ایجاد بشه ک دو برابر زمان سایر دندانه ها باشه اما از 17200 بالا تر نرفت
      و چند دفعه هم تکرار کردم هر بار در همین حدود به دست امد
      فرکانس 16 مگار هرتز و PREACALE هم روی یک گذاشتم
      فکر کنم باید یک ماژول ان ار اف به میکرو و یک ماژول هم به سریال کامپیوتر وصل کنم و با ویژال بیسیک داده ها رو لحظه به لحظه دریافت کنم و به نمودار بکشم تا بهتر بشه تحلیل شون کرد البته یه چند روزی زمان میبره حالا از این بگذریم بنظر شما چرا داده ها اینطورن؟چرا نقطه A دیده نمیشه؟درحالی که همون اسکوپم رو به ماشین وصل میکنم قشنگ پالس نقطه A رو نشون میده
      :eek:
      :biggrin:

      اینکه شما وقت میزارید و آزمایشات زیادی انجام میدین خوبه , اما من فکر میکنم برای شکار نقطه A نیازی به تحلیل های زیاد نیست , البته حتما به درک بهتر کمک میکنه , من زیاد به خودرو و مکانیک کار نکردم و به درصد خطا های موجود آشنا نیستم , اما میشه سیستمی طراحی کرد که مثل تریگر اسکپ , نقطه A رو شکار کنه و با هرچقدر لرزش و یا بالا پایین شدن چرخش , خطایی رخ نده
      در مورد عدد منفی شکل گرفته روی LCD حدس میزنم شما هنگام ریختن اطلاعات روی LCD از دستورات مناسب استفاده نکردین , ببینید اگر متغیری که زمان بین دندانه ها در اون شکل میگیره از نوع بدون علامت باشه ( unsigned ) و عنگام ریختن اطلاعات روی LCD از دستور مناسب این متغیر استفاده کنید , اعداد صحیح تر روی LCD نمایش داده میشن و عدد منفی نمیبینید

      به حر حال تا به اینجا به نظر من خوبه
      فقط اصلاحات بالا رو انجام بدین و همچنین حساب کنید که الآن عدد شکل گرفته تا چه اندازه صحیح است , یعنی با توجه به سرعت دور موتور , چه عددی باید در تایمر شکل میگرفت و الآن چه عددی شکل گرفته , با توجه به PREACALE و فرکانس میکرو و فرمول محاسبه ای که در PDF بود

      همچنین چند کد در ابتدای میکرو بنویسید تا هنگام روشن شدن میکرو , چند کاراکتر روی LCD چاپ کنه و پس از چند لحظه کوتاه LCD رو پاک کنه و بقیه کار رو شروع کنه , این کار به شما کمک میکنه تا در صورت ریست شدن میکرو متوجه بشید

      در پیام بعدی یع الگریتم ساده برای شکار نقطه A پیشنهاد میدم , فقط میبخشید که دیر به دیر پاسخ میدم , کمی سرم شلوغه

      درضمن یک سوال از قبل برای من ایجاد شده بود روز اول میخواستم بپرسم
      من از اسکوپ ک برای نمایش پالس استفاده کردم فیلم گرفتم اما یک ایراد داره و منطقی نیس
      مگر وقتی موتور هزار دور بر دقیقه دوران میکنه خب نقطه A باید هزار بار در دقیقه یا 16 بار در ثانیه باید پالس بده
      اما در اسکوپ هر یک ثانیه یا 500 میلی ثانیه یک بار پالس میاد رو نمایشگر و تاخیر هر پالس نقطه A تا بعدی قابل دیده شدن هست
      میخواید فیلم رو اپلود کنم؟
      بله ببینید کلا LCD توان نمایش اطلاعات رو با این سرعت نداره , و کلا هم نیازی نیست داشته باشه , چون چشم ما هم توان دیدن حرکات سریع رو نداره ! و این راه درسته که هر دستگاهی که نمایش گر داره , با یک تاخیر زمانی اطلاعات رو روی نمایش گر بریزه , البته سرعت اسکپ شما پایینه اما فعلا کارتون رو راه میندازه , اسکپ های خیلی پیشرفته هم همچین تاخیر زمانی رو دارند و نمیتوتن تمام سیگنال رو نمایش داد , به همین جهت اسکپ ها امکانی به نام تریگر دارند تا نقطه خاصی از سیگنال رو شکار کنند و فقط همان قسمت رو نمایش بدن , البته تحلیل اطلاعات به روشی که خودتون پیشنهاد دادین ( VB ) فکر میکنم بهتر از اسکپ جواب بده , که شاید اصلا نیازی نباشه

      پس با اصلاحات بالا , میزان نزدیک بودن عدد شکل گرفته در تایمر با عدد محاسبه شده ی خودتون رو به من بگید.

      موفق باشید
      نا امیدی یه دروغ بزرگه که آدما به خودشون میگن
      تلاش یه حقیقت بزرگه که با صبر به ثمر میرسه

      دیدگاه


        #33
        پاسخ : نیاز به یک تابع در مورد شمارش سیگنال

        اهان پس من برنامه جدید رو با تاخیر چاپ ال سی دی تست میکنم البته اون ماشین ک روش تست میکنم دوروز در میان در اختیارم هست حالا تا دوروز دیگه که تست کنم باز خبر میدم
        خب اگر از تاخیر نیم ثانیه ای استفاده کنیم دیگه نقطه A ممکنه دیده نشه و فقط سایر نقاط دیده بشن
        من عدد زمانی تایمر رو در یک متغیر از جنس ورد میریزم و بعد اون متغیر روی ال سی دی به صورت ساده و بدون استفاده از دستوری خاص نمایش میدم
        خب اگر اعداد منفی رو قراره نشان نده این به این معنی نیس که اون اعداد وجود دارن ؟ یا اون ها خطای میکرو در حین چاپ هستند؟
        نه مشکل ریست شدم میکرو رو حل کردم دیگه ریست نمیشه و البته همون دستور تاخیر اولیه و چاپ متن اولیه رو استفاده هم کردم
        باشه پس من اول از طریق تئوری فاصله زمانی دندانه ها رو حساب میکنم و بعد با فرمول تایمر عدد بدست امده را به زمان تبدیل میکنم و خبر میدم
        نه شما همین حد هم ک پاسخ میدین نهایت لطف شماست ممنونم از وقتی که میزارید
        اهان پس اون خطای دستگاه هاست که تاخیر در چاپ دارن
        چون همش فکر میکردم چطور ممکنه با اون سرعت دوران نقطه A با تاخیر قابل دیدن چاپ بشه

        تریگر در حقیقت یعنی چی؟

        ممنونم پس خبر باشما هروقت فرصت کردین
        منم محاسبه کنم پیام میزارم

        اضافه شده در تاریخ :
        بازم اعداد عجیب به دست اومد
        من با همون فرمول داخل پی دی اف که برای بدست اوردن زمان شمارش بود
        به جای کریستال عدد 16000000 رو گزاشتم
        بجای PREACALE عدد یک و به جای تایمر بیت عدد 65535 که حداکثر مقدار شمارش تایمر هست رو گذاشتم
        زمان هر بار سرریز شدن زمان برابر 0.004 ثانیه بدست امد و باز به جای همون تایمر بیت عدد 16900 (که همون عدد متوسط زمانی بین دو دندانه بود) رو قرار دادم تا عدد 0.00105 بدست امد که این با ثانیه هست
        تا اینجا محاسبات درسته؟
        بعد درنظر گرفتم در RPM 980 دور بر دقیقه زمان دندانه ها محاسبه شده خب پس در هر دور 0.061 ثانیه زمان میبره و چون هر دور از 360 پله به طور متوسط تشکیل شده پس هر پله یا هر دندانه در 0.00016 ثانیه از جلوی سنسور عبور کرده
        خب به نظر شما این محاسبه هم درسته؟
        پس چرا زمان ها متفاوتن؟

        اضافه شده در تاریخ :
        یادتونه گفتم تو اعداد زمانی که ثبت کردم بعضی اعداد منفی یا خیلی کوچیک بودن؟
        الان با یه ازمایش تو شبیه ساز متوجه شدم تو یه پله خاص زمان از حد تایمر بیشتر میشه و سر ریز میشه
        به نظرم برای همین اعداد کوچیک بودن
        حالا برای جلو گیری از این عمل چه دستوری باید بنویسم؟

        دیدگاه


          #34
          پاسخ : نیاز به یک تابع در مورد شمارش سیگنال

          سلام

          خب اگر از تاخیر نیم ثانیه ای استفاده کنیم دیگه نقطه A ممکنه دیده نشه و فقط سایر نقاط دیده بشن
          بله متوجه این موضوع هستم , ما فعلا باید فقط به یه عدد نسبتا ثابت دست پیدا کنیم و برنامه رو پله پله تکمیل کنیم , ابتدا به عددی که قاعدتا طبق محاسبات باید به دست بیاد برسیم و سپس برنامه رو پله پله تکمیل کرده و نقطه A رو پیدا میکنیم , لازم نیست حتما تمامی رخ داد ها رو روی LCD ببینیم , از LCD فقط برای درک بهتر و اشکال زدایی استفاده میکنیم

          من عدد زمانی تایمر رو در یک متغیر از جنس ورد میریزم و بعد اون متغیر روی ال سی دی به صورت ساده و بدون استفاده از دستوری خاص نمایش میدم
          خب اگر اعداد منفی رو قراره نشان نده این به این معنی نیس که اون اعداد وجود دارن ؟ یا اون ها خطای میکرو در حین چاپ هستند؟
          نه ببینید , تمامی اعدادی که در داخل میکرو هستن از جنس باینری هستن , یعنی همون صفر و یک , منتها هنگام چاپ بر روی LCD میشه اونارو به شکل اعدادصحیح یا هگزادسیمال یا همون باینری نشون داد و فقط نمایششون فرق میکنه , اگر یه متغیر 16 بیتی داشته باشید میتونید اون رو با علامت یا بدون علامت روی LCD نمایش بدین , من به کامپایلر شما آشنا نیستم و باید به اطلاعات کامپایلرتون مراجعه کنید و یا در فرم AVR سوال بپرسید
          به هر حال به هر نحوی که هست مطمئن شید که عددی که روی LCD چاپ میکنید بدون علامت هست


          تریگر در حقیقت یعنی چی؟
          تمامی اسکپ ها دارای تریگر هستن , از اونجایی که سیگنال ها خیلی سریع هستن و البته زیاد , نمیشه همه سیگنال رو با چشم دید , برای همین با استفاده از سخت افزار و نرم افزار کاری انجام میدن تا اسکپ هنگام دریافت سیگنالی خاص کار نمونه برداری رو شروع کنه , و فقط همان قسمت از سیگنال که نمونه برداری شده رو نشون بده , همین کار رو میشه در این سیستم به سادگی پیاده کرد

          بجای PREACALE عدد یک و به جای تایمر بیت عدد 65535 که حداکثر مقدار شمارش تایمر هست رو گذاشتم
          زمان هر بار سرریز شدن زمان برابر 0.004 ثانیه بدست امد و باز به جای همون تایمر بیت عدد 16900 (که همون عدد متوسط زمانی بین دو دندانه بود) رو قرار دادم تا عدد 0.00105 بدست امد که این با ثانیه هست
          تا اینجا محاسبات درسته؟
          راستش متوجه نشدم ! :-? فکر میکنم اشتباهه , من اعداد دیگه ای بدست آوردم

          بعد درنظر گرفتم در RPM 980 دور بر دقیقه زمان دندانه ها محاسبه شده خب پس در هر دور 0.061 ثانیه زمان میبره و چون هر دور از 360 پله به طور متوسط تشکیل شده پس هر پله یا هر دندانه در 0.00016 ثانیه از جلوی سنسور عبور کرده
          خب به نظر شما این محاسبه هم درسته؟
          پس چرا زمان ها متفاوتن؟
          خب این یکی ها درستن , پس اگر 980 دور در دقیقه داشته باشیم :

          تعداد دور در ثانیه = 16.333333 ( 980/60 )
          زمان هر دور = 0.061224491 ( 1/16.333333 )
          زمان بین هر دندانه = 0.000170068 ( 0.061224491/360 )
          پریود سیگنال ورودی تایمر = 62.5ns نانو ثانیه ( 1/16Mhz )
          پس :
          عددی که باید در تایمر برای زمان بین دندانه ها شکل بگیره = 2721 ( (62.5نانو ثانیه)0.000170068/0.0000000625 )

          با نظم پسر :arrow:

          خب حالا باید به هر نحوی که هست وقتی ماشین روشنه به حدود این عدد برسیم , و اگر نرسیم یعنی یه جای کار ایراد داره , حداقل LCD باید 90 درصد موارد یه عددی حدود 2721 رو نشون بده , حتی اگه شده برای مدت کوتاهی
          با توجه به پیام های قبلی , من فکر میکنم شما به این عدد تا الان نرسیدین , برای رفع مشکل به سوالات زیر پاسخ دهید :[list type=decimal]
          [li]
          آیا شما پس از خوندن تایمر اون رو ریست میکنید ؟ یا اصلا این کار به صورت سخت افزاری در میکرو انجام میشه ؟
          [/li]
          [li]
          آیا شما سیگنال خروجی سنسور رو مستقیما به میکرو میدین ؟ مدار نمونتون چطور ؟ از تراشه های پ امپ استفاده نکرده ؟ شاید کلا چند دندانه از دید میکرو خارج میشه , در کل به هر نحوی که هست یا باید سیگنال تمیزی به میکرو بدین و یا باید از مقایسه کننده های ولتاژ داخلی میکرو استفاده کنید
          [/li]
          [li]سنسوری که ازش استفاده میکنید چند سیم داره ؟ آیا تغذیه مجزا داره ؟ باید دید نویز های موجود در سیگنال خروجی ممکن است تاثیر بگزارن[/li][/list]

          همچنین یه کاری انجام بدین , یه شمارنده در برنامه قرار بدین و اون رو با هر بار سرریز شدن تایمر یک واحد افزایش بدین و هر 500 میلی ثانیه این عدد رو هم روی LCD نمایش بدین تا متوجه خطاها بشیم

          به هر حال باید پله پله پیش رفت و در هر صورت باید به عدد نسبتا ثابتی برسیم و بعد میتونیم با یه الگریتم ساده نقطه A رو شکار کنیم
          میتونم الگوریتمی که مد نظرم هست رو تبیین کنم , ولی باید اول مشکلات بالا حل بشه باید یه سیستم پایدار تر داشته باشیم
          نا امیدی یه دروغ بزرگه که آدما به خودشون میگن
          تلاش یه حقیقت بزرگه که با صبر به ثمر میرسه

          دیدگاه


            #35
            پاسخ : نیاز به یک تابع در مورد شمارش سیگنال

            با سلام و تشکر مجدد

            من برای محاسبه عدد زمانی شمارش شده طبق فرمول عمل کردم و عدد شمارش شده رو ضربدر PREACALE و حاصل رو تقسیم بر کریستال کردم

            خیلی ممنون از محاسبه مرتب و کامل تایم ها :applause: :smile:

            خب این عدد 2721 رو باید با همین کریستال 16 مگاهرتز و PREACALE مساوی 1 نشون بده؟

            بله منم پس از چند ازمایش متوجه شدم یک ایراد در دریافت سیگنال از سنسور وجود داره
            این سنسور سه سیم داره دو سیم تغذیه و یک سیم سیگنال که ولتاژش 5 ولت مستقیم هست اما چند چیز برام مبهمه اول اینکه در زمان خاموش بودن ماشین نمیدونم چرا ECU ماشین تمام سیم های تغذیه و پالس سنسور رو منفی میکنه
            و دوم در هنگام کار کرد موتور تمام سه سیم ولتاژ 2.71 ولت را نشان میدن نه 5 ولت
            در خود ECU از یک مدار تقسیم مقاومتی استفاده شده برای پایه پالس سنسور
            نه مستقیما بایک تقسیم مقاومتی پالس رو به میکرو میدم البته به دو علت خطا زیاده
            اول اینکه وقتی کریستال ECU ماشین با کریستال میکرو من متفاوت باشه درست کار نمیکنه و وقتی ماسین روشنه ما داریم سنسور رو به میکرو وصل میکنیم ک در همون لحظه خود ECU داره با سنسور کار میکنه
            اگر بخوایم روی داده های سنسور کار کنیم باید در همون لحظه استارت کار کنیم چون قراره میکرو ما ماشین رو روشن کنه پس قبل روشن شدن باید تمام تنظیمات انجام بشه

            به نظرم اگر خود سنسور رو از ماشین جدا کنم و به میکرو راه اندازیش کنم راحتتر بشه به داده های بهتری دست یافت

            در مدار اسکوپ ک خطا وجود نداشت چون پایه پالس مستقیما به مبدل انالوگ به دیجیتال میکرو وصل میشد و این پایه کاری به فرکانس و نویز و ... نداره و معیارش فقط تغیر ولتاژه
            اما در مدار ما چون نویز و کریستال و ... تغییرات ایجاد میکنه فکر میکنم به همین علت اعداد ما درست از اب در نمیان

            بله منم در نظر دارم یک مدار ایده ال برای این کار بسازیم بعد رفع ایراد و ادامه برنامه

            اضافه شده در تاریخ :
            سلام
            الان برای اینکه روی قسمت استارت خوردن تمرکز کنم
            احتیاج به یه خط برنامه دارم تا بتونه سرعت دور موتور رو گزارش کنه تا با سرعت دقیق بهتر بشه زمان هارو محاسبه کرد
            ولی هر چی به ذهنم میرسید نوشتم نتونست RPM رو بخونه
            چیکار کنم ب نظر شما

            دیدگاه


              #36
              پاسخ : نیاز به یک تابع در مورد شمارش سیگنال

              با سلام و وقت بخیر
              من بلاخره مشکلات پیشبینی نشده رو حل کردم
              اول اینکه 360 دندانه اشتباه بوده و 60 دندانه روی چرخ فلایویل وجود داره که دو دندانه ان حذف شده است.
              تونستم برنامه دور سنج دقیق هم بنویسم ک در حالت درجا 960 دور بر دقیقه رو نشان میداد و منطبق بر دور شمار خود ماشین بود(البته دورشمار ماشین 20 درصد خطا داره چون عقربه ای هست)
              تونستم ب عددی ک مد نظرمون بود دست پیدا کنم
              با پرسکاله 1 و کریستال 16 مگاهرتز برای هر دندانه عدد 17000تا 18000 را در دور 900 دور نشان میداد و به محض رسیدن به نقطه a عدد به 40000 میرسید و بلافاصله در دندانه بعد بر میگشت ب همون 18000 و دقیقا وقتی دندانه ب دندانه عداد رو ب شیوه خودم ب صورت ارایه ذخیره کردم متوجه شدم خطا اصلا نداره یعنی وقتی ب نقطه 40000 میرسید بعد شروع ب شمارش دستی دندانه ها و اعداد ثبت شده کردم و دقیقا وقتی به دندانه 57 تم رسید دوباره عدد رشد کرد و در دندانه 58 به 40000 رسید و باز بعد از دندانه 58 رو دندانه یک درنظر گرفتم و دوباره عدد به 18000 رسید و باز تا 57 دندانه شمارش کردم و دقیق رسید ب همون 40000
              این نشون میده خطا ها از بین رفته

              حالا نکات بعدی:
              در هزار دور بر دقیقه عدد هر دندانه تا دندانه بعدی بین 17 هزار تا 18 هزار بود اما وقتی گاز میدادم ب دو هزار دور بر دقیقه ک نزدیک میشدم ، عدد بین هر دندانه تا دندانه بعدی به 10000 میرسید و عدد نقطه A هم دقیق 20000
              و چون موتور تا 4000دور بر دقیقه هم میره پس این عدد زمانی کوچکتر خواهد شد و از اون طرف در هنگام استارت زدن اونقدر عدد زمانی بین دندانه ها بزرگ میشه ک تایمر داعم سر ریز میشه و نمیتونه عدد دقیقی نشون بده
              نکته بعدی اینکه در لحظه استارت خوردن دور موتور 300 دور بر دقیقه هست (گفتم این شاید به درد بخوره اندازه گرفتم)
              از اون جایی ک ما باید در لحظه استارت خوردن زمان دندانه ها و در انتها زمان نقطه A ک دوبرابر زمان سایر نقاط هست رو بدست بیاریم ، پس باید برنامه رو برای لحظه استارت خوردن تنظیم کنیم ک من هرچی فکر کردم چیزی ب ذهنم نرسید
              مورد بعدی اینکه وقتی پرسکاله روی 256 گذاشتم دیگه در لحظه استارت ظاهرا سر ریز نمیشد و عدد دندانه هارو تقریبا 250 نشون میداد و عدد نقطه A رو 550 تقریبا
              و وقتی موتور روشن بود عدد دندانه هارو 70 تا 75 و عدد نقطه A رو 160 تا 170 نشان میداد

              الان دیگه برنامه خطایی نداره و ظاهرا دقیق کار میکنه
              الان منتظر طرح شما برای زمان بندی در دور های مختلف هستم
              با تشکر

              دیدگاه


                #37
                پاسخ : نیاز به یک تابع در مورد شمارش سیگنال

                امروز یک راه ازمایش کردم ب نظر خوب میاد ولی بهش اعتماد ندارم

                از اونجایی ک برنامه ای ک نوشته بودم عدد شمارش شده زمانی هر دندانه رو میداد خب در سرعت ثابت با گذاشتن دو برابر این عدد در وقفه تایمر در مد مقایسه ای میشد به محض رسیدن ب نقطه A ک دوبرابر تایم سایر نقاط هست وقفه بخوره و کار مارو انجام بده اما مشکلمون تغییر سرعت بود
                من اومدم نوشتم ب ازای هر 59 پالس ک یک دور کامل موتور میشه ، یک واحد به متغیر RP اضافه کنه و بعد یک تایمر یک ثانیه ای ساختم و به محض اینکه زمان یک ثانیه میشه وقفه میخوره و در روتین وقفه نوشتم تعداد دور های موتور (همون متغیر RP) ک چون تعداد دور ها در یک ثانیه بود میشد دور بر ثانیه که با ضرب عدد در 60 میشد دور بر دقیقه و تقریبا منطبق بر دور شمار خود ماشین بود(البته با کمی تغیرات در ضرب و تقسیم عدد کاملا دقیق و منطبق بر دور شمار شد)
                بعد اومدم نوشتم وقتی تعداد دور در یک ثانیه رو داریم پس زمان یک دور رو محاسبه کن در هر لحظه از سرعت و بعد این زمان رو تقسیم بر 60 کن چون یک دور چرخ فلایویل یعنی چرخش 60 دندانه بعد زمان دقیق هر دندانه در هر لحظه از سرعت موتور ، ب دست میامد و بیست درصد مقدار خود این زمان رو بهش اضافه میکردم و در قسمت مقایسه گر تایمر اول ک مال دندانه ها بود قرار دادم و هر بار ک در هر سرعتی زمان دندانه هارو محاسبه میکنه بعد یکم بهش اضافه میکنه و به محض رسیدن ب نقطه A که زمانش بیشتر از سایر نقاطه وقفه میخوره
                در سرعت های مختلف موردی نداره و عمل میکنه اما از اونجایی ک من در محیط شبیه سازی ازمایش کردم گاهی اتفاقی یک پالس جابجا میخوره ک میگم شاید بخاطر ایرادات محیط شبیه سازیه
                و در محیط عملی هم زمانی دقت عملش دیده میشه ک موتور رو بتونه روشن کنه ک من هنوز برای کویل شمع ها درایور نکشیدم تا بعدا ک باز تستش کنم
                ولی از اون جایی ک هیچ ازمایش من تاحالا به دفعه اول ب جواب مثبت نرسیده اینه ک زیاد ب برنامه ای ک نوشتم مطمان نیستم اگر چ ک در ظاهر داره کار میکنه
                فقط اینکه شما بررسی کنید ببینید این راه خوبه یا راه شما بهتره
                و مورد دیگه اینکه چون هر بار یک ثانیه باید طی بشه تا زمان تغییر سرعت و تغییر زمان هر دندانه محاسبه بشه و از این جایی ک در موتور ماشین این تغییر سرعت خیلی سریع تر رخ میده این وسط نباید جرقه زدن مشکلی پیدا کنه برای این کار چیکار کنم؟

                دیدگاه


                  #38
                  پاسخ : نیاز به یک تابع در مورد شمارش سیگنال

                  سلام
                  ببخشید که وسط بحث شما پریدم !
                  این کاری که داری انجام میدی برای ماشینهای بنزینی هست یا دیزل؟!

                  دیدگاه


                    #39
                    پاسخ : نیاز به یک تابع در مورد شمارش سیگنال

                    نوشته اصلی توسط محسن 1
                    سلام
                    ببخشید که وسط بحث شما پریدم !
                    این کاری که داری انجام میدی برای ماشینهای بنزینی هست یا دیزل؟!
                    سلام فدات این حرفا چیه
                    مال موتور 5 سیلندر اسکانیا هست ک جایگزین دیزل موتور های نصب شده روی اتوبوس های ایران خودرو هست

                    البته تمام خودرو های بنزینی و گاز سوز این سیستم رو در ECU خودشون دارن
                    دیزلی ها چون شمع ندارن ب این برنامه نیازی ندارن

                    دیدگاه


                      #40
                      پاسخ : نیاز به یک تابع در مورد شمارش سیگنال

                      استاد رمضانی؟تشریف ندارین؟

                      دیدگاه

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