اطلاعیه

Collapse
No announcement yet.

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

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

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

    نوشته اصلی توسط ezraeell
    ببنید بزارید تمام بگم چون تا الان ک کسی جز شما نیس ک راهنمایی کنه
    تو هر ماشین یک دستگاهی است که قابش اندازه کف دسته و توش یک میکرو کنترلر داره با چند ترانزیستور قدرت که کار این دستگاه اینه که با توجه به داده های سنسور موقیعت میل لنگ موتور رو بسنجه و با توجه به موقیت پیستون ها در هر سیلندر ، زمان جرقه رو تعیین کنه و به ترانزیستور ها فرمان روشن و خاموش شدن بده تا کویل هر شمع در زمان خودش جرقه بزنه
    یک مدل ماشین هست که این یونیت جرقه به ایران وارد نمیشه و خیلی گرونه چون کمیابه
    من چند ماهه دارم روش کار میکنم تا بتونم بسازم از روش اما هیچکس نتونسته بسازه چون کارخانش ک اسکانیا هم هست نوعی رزین(چسب صنعتی) داخل قوطی این دستگاه ریخته ک هیچ حلالی نداره
    من با شگردی خاص بعد جند ماه تونستم یکی از این یونیت هارو باز کنم و دیدم دقیقا مث ECU ماشین توش یک میکرو داره و چند ترانزیستور قدرت برای سوییچ و بعد با بازدید از خود ماشین متوجه شدم تنها ورودی به این یونیت یک سنسور هست ک سه تا سیم داره دو سیم برای تغذیه و یک سیم هم ک پالس ها رو میفرسته به یونیت جرقه
    بعد یک اسیلوسکوپ درست کردم و باهاش شکل موج خروجی این سنسور رو دیدم و ازش عکس گرفتم

    این سنسور روی یک چرخ دندانه دار هست که برای هر تعداد دندانه ها متفاوته مثلا من اسکوپم رو روی سنسور خودرو پراید تست کردم ک چرخش 360 دندانه داره اما دو دندانه حذف شده یعنی در کل 358 دندانه داره و جای دو دندانه خالیه
    در عکس بالا فلش سفید نشانگر شکل پالس ایجاد شده حاصل از 358 دندانه هست و فلش قرمز نشانگر همون پالس ثابت نقطه A یا جای همون دو دندانه خالیه
    اونجایی ک روی ال سی دی نوشته فرکانس یعنی دور موتور ماشین چون تقریبا دور موتور با فرکانس برابره و به ازای هر 1000 دور در دقیقه از موتور 980 هرتز فرکانس تولید میشه ک روی عکس میبینی و هرچی به عکس های بعدی میره دور موتور تغییر میکنه به فرکانس نگاه کن گاهی تا 1460 هرتز هم میره که همون دور موتور 1500 دور بر دقیقه پرایدهست که شکل و ارتفاع موج و فرکانس موج دندانه ها در اثر افزایش دور موتور بیشتر میشه اما موج نقطه A تغیر چنداد محسوسی نمیکنه

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

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

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

    حالا میکرو دوم ک شما راهنمایی کردین ک کارش انالیز یا شمارش پالس ها و پیدا کردن نقطه A هست
    این میکرو رو طبق گفته شما اول یک تایمر میکرو را در مد کانتر معرفی کردم و خاصیت مقایسه گر کانتر و وقفه آن را فعال کردم
    یعنی تا اینجا میکرو قادر هست با دریافت هر مقدار پالس ، اون رو بشماره و به ازای هر عددی ک اول برنامه به وقفه کانتر بدیم بلا فاصله وقتی تعداد پالس های شمرده شده به اون مقدار رسید ، پرش میزنه به لیبل مشخص شده در وقفه
    اما از اون جایی که به محض روشن شدن میکرو ، کانتر هرچی پالس دریافت کنه میشماره و ما میخوایم هر پالس رو ک دریافت کرد وقفه بخوره و پرش کنه به لیبل
    خب پس باید در عدد نوشته شده در مقایسه گر کانتر ، عدد یک رو نوشت یعنی به محضی ک یک پالس رو شمارش کرد یعنی یک پالس دریافت کرد به لیبل وقفه پرش کنه
    خب تا به لیبل پرش میکنه اونجا یک جمله شرطی نوشتم که اگر x مساوی صفر بود تایمر استارت بخوره (چون دفعه اوله که وارد لیبل میشه عدد x از قبل صفر بوده پس وارد میشه) تایمر شماره دو میکرو استارت میخوره(درضمن تایمر شماره دو میکرو هم قبلا پیکر بندی شده با دقت بالا و در مد مقایسه گر با وقفه معرفی شده) خب به محض استارت خوردن تایمر عدد x رو هم بعد از استارت خوردن تایمر مساوی یک میشه تا دفعه بعد که وارد این لیبل شد تایمر استارت مجدد نخوره یا هنگ نکنه
    بعد یک واحد به متغیر y که تعداد دندانه ها هست اضافه میشه و میشه یک ک یعنی دندانه شماره یک و بعد یک واحد به متغیر x اضافه میشه و میشه دو جمله شرطی دوم که نوشتم اگر x مساوی سه شد تایمر رو استپ کن و عدد تایمر رو بریز تو متغیر تایم اما چون الان متغیر x دو هستش وارد این شرط نمیشه و کانتر مساوی صفر میشه خارج میشه و بر میگرده به ادامه شمارش پالس و به محض دریافت پالس دوم یا دندانه دوم که میشه پالس شمرده شده یک دوباره وارد همین لیبل میشه و چون x مساوی دو هست وارد شرط استارت تایمر نمیشه و میاد پایین و یک واحد به متغیر y ک تعداد دندانه ها است اضافه میش و میشه 2 که یعنی دندانه دوم و بعد یک واحد به x اضافه میشه ک یعنی x مساوی سه میشه و شرط دوم ک استاپ تایمر هست اجرا میشه و تایمر متوقف میشه و میزان تایم بین دو دندانه شمارده شده داخل متغیر تایم ریخته میشه و روی ال سی دی نشون میده و متغیر x مساوی صفر میشه و همینطور ادامه پیدا میکنه و با وقفه بعدی وارد لیبل میشه و شرط استارت تایمر اجرامیشه و باز دفعه بعد ک میاد تو لیبل شرط استاپ تایمر اجرامیشه و الا اخر

    این برنامه ای هست ک من نوشتم اما ب نظرم اصولی نیس
    ای ول :biggrin:

    خب شما با این همتتون , انشاالله به زودی هم پروژتون رو به خوبی انجام میدین هم به میکرو مسلط میشید

    فقط کمی حوصله به خرج بدین و درباره ماژول های CCP و ECCP که در میکروهای PIC هست تحقیق کنید , نمیدونم در AVR همچین چیزی هست یا خیر ! اما با توضیحاتی که دادین کار خیلی حساس هست و نباید با پردازش های اضافی ریسک کرد , ماژول های فوق کار رو بهتر میتونن انجام بدن
    برای تحقیق فوق میتونید از کتاب " ساختار میکروکنترلرهای PIC " انتشارات شیخ بهائی استفاده کنید


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

    دیدگاه


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

      نوشته اصلی توسط ramezani.t
      ای ول :biggrin:

      خب شما با این همتتون , انشاالله به زودی هم پروژتون رو به خوبی انجام میدین هم به میکرو مسلط میشید

      فقط کمی حوصله به خرج بدین و درباره ماژول های CCP و ECCP که در میکروهای PIC هست تحقیق کنید , نمیدونم در AVR همچین چیزی هست یا خیر ! اما با توضیحاتی که دادین کار خیلی حساس هست و نباید با پردازش های اضافی ریسک کرد , ماژول های فوق کار رو بهتر میتونن انجام بدن
      برای تحقیق فوق میتونید از کتاب " ساختار میکروکنترلرهای PIC " انتشارات شیخ بهائی استفاده کنید


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

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

      با تشکر

      دیدگاه


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

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

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

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

        دیدگاه


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

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

          الان دیگه برنامه به یک خط ساده میتونه دقیق فاصله زمانی بین دو پالس رو بیان کنه بدون خطا تا اینجا 50 درصد برنامه حل شد
          بله با AVR هم میشه این کار رو کرد , شاید با اسم دیگه ای به غیر از CCP ,

          من قصد داشتم کار ماژول CCP در PIC رو براتون شرح بدم , اما حالا که تونستید با AVR راه اندازیش کنید دیگه نیاز نیست و خیلی بهتره که با AVR کار کنید و وقت کمتری صرف کنید.

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

          ببینید شما نباید زمان نقطه A رو ثابت تعیین کنید
          فرض کنید سرعت در حال افزایش است , حال زمان بین دندانه ها کمی , کمکم , تغییر کرده و کم میشود , اما زمان نقطه A به یکباره تغییر کرده و حداقل 50 درصد بیشتر از زمان های دیگه هست , حال فقط شما باید در روتین وقفه تایمرتون زمان ها رو چک کنید و همیشه یه میان گین از زمان بین دندانه ها داشته باشید و با یه IF چک کنید که اگر زمان میان گین زمان بین دندانه ها به یک باره 50% افزایش یافت , نقطه A دیده شده است , و این کار رو فقط یک بار انجام دهید , و وقتی نقطه A رو پیدا کردین از این پس دیگه فقط با شمارش دندانه ها نقطه A رو پیش بینی کنید , هیچ مشکلی هم پیش نمیاد اگر برنامتون بی نقص نوشته شده باشه و میکرو وسط کار ریست نشه.

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

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

          دیدگاه


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

            نوشته اصلی توسط ramezani.t
            بله با AVR هم میشه این کار رو کرد , شاید با اسم دیگه ای به غیر از CCP ,

            من قصد داشتم کار ماژول CCP در PIC رو براتون شرح بدم , اما حالا که تونستید با AVR راه اندازیش کنید دیگه نیاز نیست و خیلی بهتره که با AVR کار کنید و وقت کمتری صرف کنید.

            بیشتر تو پیام های قبلیم دقت کنید :smile:

            ببینید شما نباید زمان نقطه A رو ثابت تعیین کنید
            فرض کنید سرعت در حال افزایش است , حال زمان بین دندانه ها کمی , کمکم , تغییر کرده و کم میشود , اما زمان نقطه A به یکباره تغییر کرده و حداقل 50 درصد بیشتر از زمان های دیگه هست , حال فقط شما باید در روتین وقفه تایمرتون زمان ها رو چک کنید و همیشه یه میان گین از زمان بین دندانه ها داشته باشید و با یه IF چک کنید که اگر زمان میان گین زمان بین دندانه ها به یک باره 50% افزایش یافت , نقطه A دیده شده است , و این کار رو فقط یک بار انجام دهید , و وقتی نقطه A رو پیدا کردین از این پس دیگه فقط با شمارش دندانه ها نقطه A رو پیش بینی کنید , هیچ مشکلی هم پیش نمیاد اگر برنامتون بی نقص نوشته شده باشه و میکرو وسط کار ریست نشه.

            ببینید , این راه هم اصولیه , اینکه شما با شمارش نقطه A رو پیدا کنید , اینجوری بهتر میتونید جای جرقه زدن شمع رو هم تنظیم کنید

            پس به نظر من فقط یک بار نقطه A رو پیدا کنید و در ادامه فقط از شمارش استفاده کنید
            من خب دقیق منظور شما رو از درصد و میانگین متوجه نشدم میشه با مثال و یکم کامل تر و بدون واژه ای مث روتین بگین تا متوجه بشم

            من راه شمارش رو هم چک کردم
            با کمترین دستورات ابتدا شروع به شمارش میکنه و به محض رسیدن به نقطه A تا رسیدن مجدد به این نقطه دندانه ها رو میگه و زمان دقیق نقطه A رو هم میگه(البته در سرعت ثابت) بعد از گزارش اولین بار ک تعداد دندانه های بین نقطه A اول و نقطه Aدوم اون تعداد رو در وقفه کانتر قرار میدم و شروع به شمارش پالس ها میکنه و هر بار ک به اون عدد میرسه یک پالس مجزا میزنه ک همون پالس زمان جرقه شمع هست اما هرچی بیشتر پیش میره ، پالس جرقه از نقطه A دور میشه یعنی اگر اول حرکت پالس جرقه با نقطه A برابر هستن ، بعد از یک دقیقه به اندازه چنین دندانه از هم دور تر میشن و هرچی زمان بیشتر میشه فاصله ها دور تر میشه

            به نظرم باید همون توضیحات شمارو گوش کنم و در هر لحظه نقطه A رو بسنجه




            خب خوشحال میشم اگر وقت دارین جهت اطلاعات عمومی بگین اون ماژول چطوریه کارش

            دیدگاه


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

              مشکل دور شدن پالس جرقه از پالسه نقطه A رو پیدا کردم تو برنامم یک عدد رو هی در حلقه کم میکرد واس همین دور میشد

              حقیقتش هرچی سعی کردم با شمارش پالس ها کار دنبال بشه نشد هر بار خطا زیاد شد و عدد دقیق در نیومد (فکر کنم میکرو AVR همزمان و دقیق نمیتونه هم از کانتر و هم از تایمر و وقفه هاش در یک زمان استفاده کنه واس همین خطا داره) در حالی ک با سرعت ثابت و اون راه اول ک شناسایی نقطه A با استفاده از وقفه زمانیش بود رو دقیق انجام میده
              من هرچی جمله شرطی ک ب ذهنم میرسید نوشتم اما سرعت ک تغییر میکنه بازم جواب نمیده:(
              الان فقط همین بخش برنامه مونده ک شما هروقت وقت داشتین راهنمایی کنید ک چطور شروطی تعیین کنم تا میانگین و زمان رو به لحظه حساب کنه و تغییرات سرعت محسوس باشه

              یک سوال هم داشتم در اون یونیت جرقه ساخت اسکانیا ک گفتم میکرو PIC18F2523 استفاده شده . میخواستم ببینم این میکرو قابلیت های خاصی داره؟

              دیدگاه


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

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

                روتین وقفه : ببینید وقتی وقفه رخ میده جریان برنامه به نقطه خاصی از حافظه که برنامه وقفه شما در اون قرار داره هدایت میشه , همون چند خط برنامه رو بهش میگن روتین وقفه

                آقا شما باید با میکروها بیشتر آشنا بشید ! من با خوندن پیام شما فکر میکنم مشکلی در برنامه نویسی شما وجود داره که در شمارش دچار مشکل میشید , چون یه شمارش ساده برای میکرو که کاری نداره ! فرکانس میکرو شما الآن چقدره ؟
                میکروی PIC18F2523 رو من چک کردم , فرکانس CPU اون کلا 10 مگاهرتزه ! و سرعت بالایی نداره , من فکر میکنم از این بابت انتخاب شده که هم ارزون قیمته هم تحمل دمای بیشتری داره ( منفی 40 تا مثبت 125 درجه ) هم محدوده ولتاژش بیشتر ( بین 2 تا 5.5 ولت ) داره , وگرنه من مزیت دیگه ای ندیدم , دو تا ماژول CCP هم داره که همه میکرو ها دارن

                راستی در مورد توضیحات ماژول CCP باید , باید بگم که شما خودتون با کار کردن و جواب گرفتن از این ماژول توضیحات رو دادین :smile: , یکی از کار های مهم ایم ماژول اندازه گیری پریود یک سیگناله که شما با میکرو AVR از اون جواب گرفتید , در PIC ها میشه این ماژول رو طوری پیکر بندی کرد تا بشه از اون برای ساخت پالس PWM استفاده کرد , اما من باز هم به شما توصیه میکنم با همون AVR کار کنید , من با AVR کار نکردم اما بعید میدونم کار به این سادگیی رو نشه با این میکرو انجام داد.

                ببینید برای شمارش دندانه ها شما فقط نیاز به یک وقفه دارید , تو همون روتین وقفه CCP که زمان بین دندانه ها رو بهتون میده میتونید شمارش هم انجام بدین , و یه متغیر رو یک واحد افزایش بدین ( X++ )
                و اگر , وقفه AVR اولویت پذیر هست , این وقفه رو روی بالا ترین اولویت قرار دهید.


                بیاید پله پله پیش بریم :
                در حال حاضر فقط یه برنامه ساده بنویسید که با کمترین کد , و در یک روتین وقفه هم زمان بین دندانه ها رو ذخیره کنه و هم تعداد دندانه ها


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

                دیدگاه


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

                  اول جا داره تشکر ویژه داشه باشم از اینکه همراهی میکنید با راهنمایی هاتون
                  خیلی ممنونم

                  اهان پس روتین همون لیبل و دستورات خودمونه ک وقتی وقفه میخوره پرش میشه به اون نقطه و دستورات اجرا میشه

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

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

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

                  فرکانس رو در نرم افزار شبیه ساز روی 8 مگاهرتز خود میکرو و در تست واقعی روی 16 مگاهرتز با کریستال خارجی

                  اهان پس احتمالا برای دما اون میکرو رو انتخاب کردن چون یونیت روی بدنه موتوری نصب میشه و حرارت بشدت بالاست .


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

                  الان سوالی ندارم توضیحات کامل بود

                  http://uplod.ir/4g2xu86i7h30/amoozeshe_bascome+sample_project.pdf.htm

                  طریقه دانلود کیلیک روی لینک و بعد کیلیک روی گزینه دانلود رایگان با سرعت پایین و بعد روی گزینه دانلود بزنید

                  دیدگاه


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

                    الان برنامه در قدم اول ک نوشته بودین درست شد
                    میکرو رو روی فرکانس 16 مگاهرتز گزاشتم
                    تایمر 1 میکرو را در حالت تایمر و مد کپچر فعال کردم و دقت تایمر را روی 64 گزاشتم (مد کپچر در اون صفحات توضیح داده یعنی با اعمال هر پالس به پایه ICP1 میکرو بلافاصله مقدار شمارش شده در رجیستر Captuer1 قرار میگیره )
                    وقفه این مد رو هم فعال کردم (یعنی هر بار ک پالس به این پایه اعمال شد به روتین وقفه پرش صورت میگیره

                    در روتین برنامه فقط دو دستور نوشتم دستور اول مقدار اولیه تایمر رو صفر میکنه تا با اعمال هر پالس بتونه در رجیستر کپچر ، مقدار زمانی بین دو دندانه قرار بگیره و دستور دوم یک واحد به متغییر Dan اضافه میکنه(این متغیر تعداد دندانه هاست)

                    به راحتی الان داره این برنامه کار میکنه(مشکلش در سری های قبل تاخییر زمانی نمایش در ال سی دی بود همون تاخییر در سرعت و فرکانس بالای پالس باعث اشتباهات میکرو میشد)

                    اینم متن برنامه ک اگر فرصت کنید اون چند صفحه رو بخونید میتونید مقایسه کنید
                    [pre]$regfile = "m64def.dat"
                    $crystal = 16000000

                    Dim Dan As Integer

                    Config Timer1 = Timer , Capture Edge = Rising , Noise Cancel = 1 , Prescale = 64

                    Enable Interrupts
                    Enable Icp1
                    On Icp1 A

                    Main:
                    Do

                    Loop
                    End

                    A:
                    Incr Dan
                    Timer1 = 0
                    Return[/pre]

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

                    دیدگاه


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

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

                      فقط قبل از ادامه کد نویسی دو سوال :
                      هنگام استارت زدن خودرو چه عددی در تایمر شکل میگیره ؟ فاصله بین دندانه ها رو چند نشون میده ؟
                      فرکانس کلاک تایمر هم روی 16MHz هست دیگه ؟ درسته ؟

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

                      دیدگاه


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

                        نوشته اصلی توسط ramezani.t
                        خب خوبه کا تا اینجا مشکلی نیست
                        من PDF رو دانلود کردم , اما راستش فکر نمیکنم فرصت پیدا کنم بخونمش , اما اگه همینطور پله پله پیش بریم مشکلی نیست , فقط شما هر وقت که وقت پیدا کردین سعی کنید بیشتر درباره میکرو مطالعه داشته باشید تا با تسلط بیشتری راهکارهای انجام پروژتون رو پیدا کنید.

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

                        مشکل همینجاست ک هنگام استارت خوردن میکرو ریست میشه و تقریبا تا روشن شدن خودرو هیچی رو نشون نمیده
                        ماشین از لحظه استارت در ثانیه اول روشن میشه و چون همون لحظه استارت ولتاژ باطری در یک لحظه کمینه مقدار میشه در نتیجه میکرو و تمام امکانات برقی ماشین در یک تا دوثانیه خاموش میشن حتی ضبط ماشین رو خودتون میتونید چک کنید

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

                        الان یک عکس پیوست میکنم توش توضیحات رو نوشته

                        دیدگاه


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

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

                          دیدگاه


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

                            مشکل همینجاست ک هنگام استارت خوردن میکرو ریست میشه و تقریبا تا روشن شدن خودرو هیچی رو نشون نمیده
                            ماشین از لحظه استارت در ثانیه اول روشن میشه و چون همون لحظه استارت ولتاژ باطری در یک لحظه کمینه مقدار میشه در نتیجه میکرو و تمام امکانات برقی ماشین در یک تا دوثانیه خاموش میشن حتی ضبط ماشین رو خودتون میتونید چک کنید

                            به همین خاطر تا روشن شدن ماشین هیچی روی میکرو پردازش نمیشه نه دندانه ها رو نشون میده و نه زمان بین دندانه هارو
                            پس باید این مشکل رو هم به عنوان یک مسعله تعریف کنید و راه حلش رو پیدا کنید

                            من دو راه به ذهنم میرسه[list type=decimal]
                            [li]
                            از میکرویی استفاده کنید که در ولتاژ های پایین هم کار میکنه
                            [/li]
                            [li]
                            از یه تغذیه سوئیچینگ DC به DC استفاده کنید , یه سوئیچینگ Step Up/Down تا اگر ولتاژ بالا یا پایین رفت مشکلی پیش نمیاد , میتونید از یه تراشه مثل MC34063 استفاده کنید , اگر تو انجمن هم سرچش کنید اطلاعاتی دربارش میبینید , در دیتاشیت هم شماتیک داره
                            [/li][/list]

                            البته من راه اول رو توصیه نمیکنم , چون میکروها در ولتاژ های پایین توان پردازششون پایین میاد

                            کلاک تایمر از کریستال خود میکرو فکر کنم میگیره اخه دستوری برای تعیین کلاک نداره و فقط یک عدد هست ک هنگام پارت بندی تایمر ، که بهش دقت تایمر میگن و دو تا فرمول هم هر تایمر داره که باهاش زمان هر واحد شمارش شده و فرکانس کریستال رو بدست میاره ک من کاربردشو نمیدونم راستش (ولی میتونم تنظیمش کنم روی دوپایه مخصوص خود تایمر کریستال خارجی نصب کنم)
                            بله تو همون تصویر دقت کنید , سخت افزاری هست به نام PREACALE که برای تقسیم فرکانس ورودی تایمر هست , معمولا پیش فرض این تقسیم , یک هست , اما AVR رو نمیدونم , به هر حال از این موضوع مطمئن شوید که فرکانس ورودی تایمر 16MHz است

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

                            دیدگاه


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

                              فرکانس همون 16 مگاهرتزه
                              و عدد PREACALE یا دقت تایمر هم روی عدد 64 تنظیم کردم

                              برای ولتاژ از چند خازن موازی استفاده میکنم درست میشه

                              زمان بین دندانه ها پرش داره وقتی موتور در دور ارام روشن هست اونقدر نقطه A سریع رد میشه ک زمان پله ها و زمان A فرصت نمیکنه روی ال سی دی چاپ بشه
                              ولی مجدد فردا ازمایش میککنم تا دقیق بگم
                              ولی هرچی عدد PREACALE بیشتر باشه ، عدد شمارش تایمر کمتر میشه و هرچی عدد PREACALE از 1024 تا یک کم میشه عدد تایمر بیشتر میشه
                              این عدد دلخواه هست انتخابش میتونه 1024-256-64-8-1 باشه که من روی 64 گزاشتم

                              دیدگاه


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

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

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

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

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

                                دیدگاه

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