اطلاعیه

Collapse
No announcement yet.

محاسبه عرض پالس با atmega16 ( زبان c و کامپایلر codevision )

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

    محاسبه عرض پالس با atmega16 ( زبان c و کامپایلر codevision )

    سلام

    میخواستم بدونم برای محاسبه عرض یک پالس با استفاده از تایمرهای atmega16 نیاز به تنظیم دستی رجیسترهای تایمر ها دارم؟؟

    کلا چجوری میشه تایمر رو در برنامه بصورت دستی (بدون استفاده از codewazard ) راه انداخت و بعد از تموم شدن عرض پالس مقدار اون رو خوند؟؟

    محاسبه عرض پالس رو برای راه اندازی یک ماژول التراسونیک لازم دارم

    با تشکر
    به رویاهات فکر کن!!

    #2
    پاسخ : محاسبه عرض پالس با atmega16 ( زبان c و کامپایلر codevision )

    نوشته اصلی توسط اریک ماطوسیان
    سلام

    میخواستم بدونم برای محاسبه عرض یک پالس با استفاده از تایمرهای atmega16 نیاز به تنظیم دستی رجیسترهای تایمر ها دارم؟؟

    کلا چجوری میشه تایمر رو در برنامه بصورت دستی (بدون استفاده از codewazard ) راه انداخت و بعد از تموم شدن عرض پالس مقدار اون رو خوند؟؟

    محاسبه عرض پالس رو برای راه اندازی یک ماژول التراسونیک لازم دارم

    با تشکر
    سلام
    شما عرض پالس را دارید یعنی دوره تناوب پالس رادارید برعکسش کنی فرکانست بدست می آید حالا باید این فرکانس را بسازی که می تونی هم با تایمر وهم با رجیستر های به طور مستقیم اونو بسازی :biggrin:
    را بسازی
    معجزه اين است که هرچه داشته هايت را بيشتر با ديگران سهيم شوي،داراتر مي شوي (لئونارد نيموي)
    اگر مغزانسان،چنان ساده مي بود که ما از آن سر در مي آورديم،هنوز چنان احمق بوديم که هيچ از آن سر در نمي آورديم!
    آموزش Modelsim

    دیدگاه


      #3
      پاسخ : محاسبه عرض پالس با atmega16 ( زبان c و کامپایلر codevision )

      نوشته اصلی توسط skiboys
      سلام
      شما عرض پالس را دارید یعنی دوره تناوب پالس رادارید
      سلام ممنون :smile: فکر کنم سوالمو متوجه نشدید.. یا من جوابت رو نفهمیدم..

      مشکل من اینه که عرض پالس رو ندارم.. یعنی روی یه پایه از ماژول، پالسهای مربعی متناوب ایجاد میشه که من باید عرضش روبر حسب میکروثانیه بدست بیارم ولی نمیدونم چجوری oo:
      به رویاهات فکر کن!!

      دیدگاه


        #4
        پاسخ : محاسبه عرض پالس با atmega16 ( زبان c و کامپایلر codevision )

        با سلام
        برای این کار دو تا راه وجود داره :
        1. استفاده از مد کپچر تایمر ها
        2. استفاده از وقفه و تایمر

        بگید با کدومشون میتونید کار کنید تا درموردشون توضیح بدم .

        دیدگاه


          #5
          پاسخ : محاسبه عرض پالس با atmega16 ( زبان c و کامپایلر codevision )

          من کدویژن بلد نیستم
          همونطور که دوستمون گفتن/یه راهش اینه که از دوتا تایمر استفاده کنی یکی در مد کانتر یکی در مد تایمر و مثلا تو یه بازه زمانی فرکانس رو اندازه بگیری و اگه قسمت مثبت و منفی با هم برابر باشن عرض پالست رو اندازه بگیری
          یا از روش کپچر یا استفاده از روش تایمر و وقفه فعال به سطح
          این در حد علم من بود / همونطور که تو جواب پیغامی که داده بودی /گفتم/
          هميشه به ياد خدا باش !

          دیدگاه


            #6
            پاسخ : محاسبه عرض پالس با atmega16 ( زبان c و کامپایلر codevision )

            یه راه هم اینه
            حتمی می دونی که دیوتی سایکل (یا همون عرض پالس) رابطه مستقیمی با ولتاژ داره
            شما می آی ولتاز خروجی ار اون پایه رو حساب می کنی
            فرکانس رو هم با avr می گیری
            بعد تو فر مول می زاری و دیوتی سایکل بدست می آد
            پس قفط باید یه فرکانس رو بدست بیاری و ولتاژ

            دیدگاه


              #7
              پاسخ : محاسبه عرض پالس با atmega16 ( زبان c و کامپایلر codevision )

              سلام.کدویزن کار نکردم امامیتونی از دستورpulseinدر بسکام استفاده کنی. برای اطلاعات بیشتر به کتاب کاهه یا قسمت helpبسکام مراجعه کن.

              دیدگاه


                #8
                پاسخ : محاسبه عرض پالس با atmega16 ( زبان c و کامپایلر codevision )

                نوشته اصلی توسط mojtaba_led
                با سلام
                برای این کار دو تا راه وجود داره :
                1. استفاده از مد کپچر تایمر ها
                2. استفاده از وقفه و تایمر

                بگید با کدومشون میتونید کار کنید تا درموردشون توضیح بدم .
                من چیزی از مد کپچر نمیدونم :sad: ولی با وقفه و تایمر ها آشنایی دارم.. دقیقا چظور میتونم با اینا عرض پالس رو بدست بیارم؟؟

                این پالسی ه روی خروجی ماژولم تولید میشه یه ضریبی از فاصله(بر حسب سانتی متر) در 100 میکروثانیست...
                به رویاهات فکر کن!!

                دیدگاه


                  #9
                  پاسخ : محاسبه عرض پالس با atmega16 ( زبان c و کامپایلر codevision )

                  نوشته اصلی توسط mmh1
                  یه راه هم اینه
                  حتمی می دونی که دیوتی سایکل (یا همون عرض پالس) رابطه مستقیمی با ولتاژ داره
                  شما می آی ولتاز خروجی ار اون پایه رو حساب می کنی
                  فرکانس رو هم با avr می گیری
                  بعد تو فر مول می زاری و دیوتی سایکل بدست می آد
                  پس قفط باید یه فرکانس رو بدست بیاری و ولتاژ

                  منظورتون اینه که ولتاژ اون پایه رو با ADC میکرو اندازه بگیرم؟؟ فرکانس رو چجوری با avr اندازه بگیرم؟؟

                  میتونی بیشتر توضیح بدی؟
                  به رویاهات فکر کن!!

                  دیدگاه


                    #10
                    پاسخ : محاسبه عرض پالس با atmega16 ( زبان c و کامپایلر codevision )

                    خب نگا کن
                    تا حالا آب خوردی داداش
                    این از اون هم ساده تر هست
                    قرار هست که ما یه چیزی درست کنیم که هر وقت یه 5 ولت به پایه میکرو مون رسید یکی به عدد یه متغیر اضافه کنه
                    مثلا فک کن من یه سیم دستم دارم که می دونم یه فرکانسی توش هست ولی هرگز عددش رو نمی دونم
                    باید بیام در یک ثانیه تعداد پالس های مثبت اون رو بشمارم
                    مثلا در یک ثانیه 4000 با پالس مثبت می آد
                    در نتیجه فرکانس من 4000 هرتز خواهد بود
                    شما اگر با این روش موافقت داری اعلان کن و با بقیه اون کاری نداشته باش
                    باهم می ریم جلو و مشکلاتت رو حل می کنیم
                    فقط یه چیزی بگم
                    من تا حالا خودم هرگز از این روش استفاده نکردم
                    ولی طبق فرمول عملی به نظر می آد
                    پس اگه با این روش موافقی بگو تا شروع کنیم

                    دیدگاه


                      #11
                      پاسخ : محاسبه عرض پالس با atmega16 ( زبان c و کامپایلر codevision )

                      راستی اینم بگیر شاید به کارت بیاد
                      یه فرکانس متر با AVR
                      برنامه رو تو یه فایل TET ریختم
                      فایل هگز هم همراه پروتئوس گذاشتم
                      راستی رفیق
                      آلتراسونیک جواب داد؟؟؟؟؟
                      http://wdl.persiangig.com/pages/download/?dl=http://newdamghan1.persiangig.com/fr%20meter.rar

                      دیدگاه


                        #12
                        پاسخ : محاسبه عرض پالس با atmega16 ( زبان c و کامپایلر codevision )

                        نوشته اصلی توسط اریک ماطوسیان
                        من چیزی از مد کپچر نمیدونم :sad: ولی با وقفه و تایمر ها آشنایی دارم.. دقیقا چظور میتونم با اینا عرض پالس رو بدست بیارم؟؟

                        این پالسی ه روی خروجی ماژولم تولید میشه یه ضریبی از فاصله(بر حسب سانتی متر) در 100 میکروثانیست...
                        خوب روش کار به این ترتیب هست که :
                        اول توی کدویزارد :
                        1. یکی از وقفه ها رو حالت any change تنظیم میکنید .
                        2. یکی از تایمر ها رو روشن میکنید و وقفه سرریز اون رو هم فعال میکنید و مقدار تایمر رو طوری تنظیم میکنید تا وقفه سرریز تایمر در یک زمان معین رخ بده مثلا فرض کنید که فرکانس تایمر رو روی 1 مگ تنظیم کردید و تایمر رو جوری مقدار دهی کردید که وقفه سرریز هر 100 میلی ثانیه رخ میده .

                        حالا کاری که باید بکنید :
                        1. یه متغییر یک بایتی گلوبال مثل i تعریف میکنید و اون رو در وقفه تایمر یک واحد اضافه میکنید (++i)
                        2. تو روتین اصلی برنامه میایید اول تایمر رو که تو کدویزارد روشن کرده بودید خاموش میکنید (اول مقدار رجیستر TCCRn رو کپی میکنید بعد صفرش میکنید)
                        3.داخل روتین وقفه خارجی یه متغیر یکی بایتی لوکال به صورت استاتیک با مقدار اولیه صفر تعریف میکنید مثلا j بعد اون رو هم یک واحد زیاد میکنید (++j) بعد از اون یه ساختار شرطی مثل if میزارید طوری که شرط اون این باشه که اگه j یک بود تایمر رو روشن کنه (مقدار رجیستری TCCRn رو برابر با اون مقداری که کپی کرده بودید میکنید) بعد یه شرط دیگه میگید که اگه مقدار j برابر با دو شد تایمر رو اول خاموش میکنید و بعد وقفه خارجی رو غیر فعال میکنید بعد j رو صفر میکنید بعد یه متغیر تک بیتی گلوبال رو که از قبل تعریف کردید مثلا f_ok رو یک میکنید .
                        3. تو حلقه اصلی برنامه تون یه شرط if میزارید که آرگومانش f_ok باشه بعد داخل ساختار if اولین کاری که میکنید مقدار یه متغیری دو بایتی گلوبال مثلا wpulse رو برابر با ( TCNTn + ( i*1000 میکنید وبعد مقدار i و f_ok و TCNTn رو صفر و وقفه خارجی رو هم فعال میکنید .
                        به این ترتیب مقدار متغیر wpulse بر حسب میکرو ثانیه میشه عرض پالستون .

                        این ایده کار بود حالا شما میتونید این رو هر جور که خواستید به فراخور کارتون تغییر بدید به شرطی که در اصل ماجرا تغییری حاصل نشه.

                        دیدگاه


                          #13
                          پاسخ : محاسبه عرض پالس با atmega16 ( زبان c و کامپایلر codevision )

                          نوشته اصلی توسط mmh1
                          خب نگا کن
                          تا حالا آب خوردی داداش
                          این از اون هم ساده تر هست
                          قرار هست که ما یه چیزی درست کنیم که هر وقت یه 5 ولت به پایه میکرو مون رسید یکی به عدد یه متغیر اضافه کنه
                          مثلا فک کن من یه سیم دستم دارم که می دونم یه فرکانسی توش هست ولی هرگز عددش رو نمی دونم
                          باید بیام در یک ثانیه تعداد پالس های مثبت اون رو بشمارم
                          مثلا در یک ثانیه 4000 با پالس مثبت می آد
                          در نتیجه فرکانس من 4000 هرتز خواهد بود
                          شما اگر با این روش موافقت داری اعلان کن و با بقیه اون کاری نداشته باش
                          باهم می ریم جلو و مشکلاتت رو حل می کنیم
                          فقط یه چیزی بگم
                          من تا حالا خودم هرگز از این روش استفاده نکردم
                          ولی طبق فرمول عملی به نظر می آد
                          پس اگه با این روش موافقی بگو تا شروع کنیم
                          حالا گرفتم روش رو.. اول اون فرکانس پالس رو اندازه میگیریم بعد با فرمول عرض پالس بدست میاد.. :agree: خوب خوبه این روشم یاد بگیرم.
                          به کمک تو بریم جلو

                          خوب قدم اول چیه؟؟ چجوری فرکانس رو محاسبه میکنن؟ :question:

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

                          داداش التراسونیک رو ازم گرفتن :biggrin: داستانش طولانیه. به جاش این یکی رو دادن که میخوام با این روشی که گفتی عرض پالس اون رو بدست بیارم :smile:
                          به رویاهات فکر کن!!

                          دیدگاه


                            #14
                            پاسخ : محاسبه عرض پالس با atmega16 ( زبان c و کامپایلر codevision )

                            نوشته اصلی توسط mojtaba_led
                            خوب روش کار به این ترتیب هست که :
                            اول توی کدویزارد :
                            1. یکی از وقفه ها رو حالت any change تنظیم میکنید .
                            2. یکی از تایمر ها رو روشن میکنید و وقفه سرریز اون رو هم فعال میکنید و مقدار تایمر رو طوری تنظیم میکنید تا وقفه سرریز تایمر در یک زمان معین رخ بده مثلا فرض کنید که فرکانس تایمر رو روی 1 مگ تنظیم کردید و تایمر رو جوری مقدار دهی کردید که وقفه سرریز هر 100 میلی ثانیه رخ میده .

                            حالا کاری که باید بکنید :
                            1. یه متغییر یک بایتی گلوبال مثل i تعریف میکنید و اون رو در وقفه تایمر یک واحد اضافه میکنید (++i)
                            2. تو روتین اصلی برنامه میایید اول تایمر رو که تو کدویزارد روشن کرده بودید خاموش میکنید (اول مقدار رجیستر TCCRn رو کپی میکنید بعد صفرش میکنید)
                            3.داخل روتین وقفه خارجی یه متغیر یکی بایتی لوکال به صورت استاتیک با مقدار اولیه صفر تعریف میکنید مثلا j بعد اون رو هم یک واحد زیاد میکنید (++j) بعد از اون یه ساختار شرطی مثل if میزارید طوری که شرط اون این باشه که اگه j یک بود تایمر رو روشن کنه (مقدار رجیستری TCCRn رو برابر با اون مقداری که کپی کرده بودید میکنید) بعد یه شرط دیگه میگید که اگه مقدار j برابر با دو شد تایمر رو اول خاموش میکنید و بعد وقفه خارجی رو غیر فعال میکنید بعد j رو صفر میکنید بعد یه متغیر تک بیتی گلوبال رو که از قبل تعریف کردید مثلا f_ok رو یک میکنید .
                            3. تو حلقه اصلی برنامه تون یه شرط if میزارید که آرگومانش f_ok باشه بعد داخل ساختار if اولین کاری که میکنید مقدار یه متغیری دو بایتی گلوبال مثلا wpulse رو برابر با ( TCNTn + ( i*1000 میکنید وبعد مقدار i و f_ok و TCNTn رو صفر و وقفه خارجی رو هم فعال میکنید .
                            به این ترتیب مقدار متغیر wpulse بر حسب میکرو ثانیه میشه عرض پالستون .

                            این ایده کار بود حالا شما میتونید این رو هر جور که خواستید به فراخور کارتون تغییر بدید به شرطی که در اصل ماجرا تغییری حاصل نشه.
                            تقریبا گرفتم چجوری.. یعنی رو لبه بالارونده پالس وقفه و تایمر با هم فعال میشن و تو لبه پایین رونده بار دیگه وقفه رخ میده و تایمر متوقف میشه و مقدارش توی TCNTn قرار میگیره. فقط چیزی که نفهمیدم: 1- اینکه تنظیمات کلاک تایمر رو چجوری باید تنظیم بشه تا هر 100 میلی ثانیه وقفه خودشو ایجاد کنه
                            2- اون 1000 که تو i ضرب شده بخاطر تبدیل به میکروثانیه هستش؟؟؟ :smile:

                            مرسی
                            به رویاهات فکر کن!!

                            دیدگاه


                              #15
                              پاسخ : محاسبه عرض پالس با atmega16 ( زبان c و کامپایلر codevisi

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

                              نگا کن برای هر تایمری یه منبع کلاک انتخاب می شه
                              مثلا می گیم منبع کلاک ما کریستال باشه
                              و مثلا اگر داخل متغیر های تایمر یه عدد بریزیم و فقط کریستال رو تغییر بدیم زمان ایجاد شده توسط تایمر تغییر می کنه
                              یعنی اگه یه نایمری هر 10 ثانیه داره یه وقفه ایجاد می کنه اگه ما بیایم کریستال رو نصف کنیم تقریبا می شه گفت هر 20 ثانیه یه وقفه ایجاد می کنه
                              خب حالا کد ویژن به ما این امکان رو می ده که به جای این که از کریستال استفاده کنیم
                              از یه منبع کلاک دیگه استفاده کنیم
                              در این روش ما بایدمنبع کلاک رو به جای کریستال منبع خارجی انتخاب کنیم
                              یعنی باید به پایه 1 آی سی پالس بدیم و آی سی بر طبق اون وقفه رو ایجاد کنه
                              در این رو آی سی هر 256 پالسی که به پایه 1 اش که به عنوان منبع کلاکش انتخاب شده برسه یه وقفه ایجاد می کنه و یه متغییری مثل a رو زیاد می کنه
                              فکر کن بعد از یک ثانیه عدد داخل متغیر شد 100
                              حالا ما باید 100 رو ضرب در 256 کنیم
                              بنابر این 25600 عدد فرکانس ما خوااهد شد و ما یه فرکانس متر ساختیم :applause: :applause:
                              حالا می ریم سر تحلیل ریز برنامه
                              interrupt [TIM0_OVF] void timer0_ovf_isr(void)
                              {
                              timer0_ov ++;
                              }
                              وقفه تایمر که به ازای گذشت هر 256 پالس یه بار سر ریز می شه
                              while (1)
                              {
                              TCCR0=0x06; // Start Timer T0 pin Falling Edge
                              با این گزینه که اولین گزینه حلقه هست ما دستور می دیم که تایمر صفر روشن بشه و حساس بشه به لبه پایین رونده که هر 256 لبه پایین رونده که اتفاق افتاد یه وقفه ایجاد کنه
                              #asm("sei&quot // Global enable interrupts
                              delay_ms(1000);
                              #asm("cli" // Global disable interrupts
                              این تیکه از برنامه به زبان اسمبلی هست
                              معنی اون این هست که به مدت یک ثانیه برنامه رو متوقف کن و منتظر وقفه باش
                              in_freq = timer0_ov * 256 + TCNT0;
                              در اینجا هم عدد داخل وقفه ضرب در 256 شده

                              TCCR0=0x00; //Stopt Timer0
                              اینجام تایمر صفر رو دو باره خاموش کردیم

                              timer0_ov=0; //Prepare for next count
                              TCNT0=0; //Clear Timer0
                              اینجام مقادیر داخل تایمر رو صفر کردیم

                              امیدوارم خوب توضیح داده باشم

                              دیدگاه

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