اطلاعیه

Collapse
No announcement yet.

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

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

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

    سلام ، یه سوالی داشتم : در برنامه بسکام با استفاده از میکرو atmega16 با چه دستوری میشه از ولتاژ نمونه گیری کرد ؟مثلا فرکانس رو 100 هرتز در نظر میگیرم.زمان نمونه برداریو چطور تعیین کنم؟
    میخوام از ولتاژ ورودی تعداد نمونه های زیادی بگیرم و یه عملیات ریاضی روشون انجام بدم.(میخوام همه نمونه ها رو به توان 2 برسونم و با هم جمع کنم بعد تقسیم بر یه زمانی مثل 0.5 ثانیه کنم)
    یه سوال دیگه کسی میدونه سرعت adc میکرو atmega16 چنده ؟
    مشکل اصلیم اینه که نمیدونم چطور زمان رو تعیین کنم ، یعنی مثلا میخوام هر 10 میکرو ثانیه یه نمونه بگیرم چطور باید این زمان رو مشخص کنم ؟؟
    ممنون میشم راهنمایی کنید.

    #2
    پاسخ : نمونه برداری از ولتاژ با میکرو

    a= Getadc(2)

    دیدگاه


      #3
      پاسخ : نمونه برداری از ولتاژ با میکرو

      نوشته اصلی توسط mega8
      a= Getadc(2)
      این دستور رو میدونم .
      منظورم اینه که چطور باید هر 10 میکرو ثانیه نمونه برداری بشه ؟

      دیدگاه


        #4
        پاسخ : نمونه برداری از ولتاژ با میکرو

        سرعت نمونه برداری توی AVR و Atmega16 حدود 100 کیلو هست که چون تبدیل به صورت multiplex هست، سرعت هر کانال چیزی حدود 15 کیلو هستش. هر نمونه برداری هم تقریبا 18 یا 5 تا کلاک استفاده می کنه.
        ---------
        .
        .
        ...........

        دیدگاه


          #5
          پاسخ : نمونه برداری از ولتاژ با میکرو

          کسی یه نمونه برنامه داره برای اینکه میکرو هر 10 میکرو ثانیه نمونه برداری کنه ؟

          دیدگاه


            #6
            پاسخ : نمونه برداری از ولتاژ با میکرو

            نوشته اصلی توسط m.riahi
            کسی یه نمونه برنامه داره برای اینکه میکرو هر 10 میکرو ثانیه نمونه برداری کنه ؟
            منظور شما از نمونه برداری در هر 10میکرو ثانیه چیه ؟
            آیا منظورتون اینه که هر ده میکرو ثانیه یه نمونه از ولتاژ بگیریم و با نمونه دفعه قبلی جمع کنیم ؟
            زمان شروع نمونه براتون مهمه ؟ یعنی میخوایین نمونه گیری با شروع سیکل شروع بشه و با پایان سیکل نمونه گیری تموم بشه ؟؟
            لطفا منظورتون رو کامل بیان کنین تا من هم کامل کمکتون کنم

            دیدگاه


              #7
              پاسخ : نمونه برداری از ولتاژ با میکرو

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

              دیدگاه


                #8
                پاسخ : نمونه برداری از ولتاژ با میکرو

                نوشته اصلی توسط m.riahi
                ممنون از جوابتون
                من یه ولتاژ ورودی میکرو که یکسو شده یعنی قسمت منفی حذف شده رو دارم ، حالا میخوام با شروع سیکل نمونه برداری شروع بشه و هر 20 میکرو ثانیه نمونه برداری انجام بشه تا زمانیکه سیکل تموم بشه.هر نمونه ی ولتاژ رو به توان 2 میرسونم و با هم جمع میکنم .
                خیلی ممنون میشم راهنمایی کنید.

                دارم برنامه رو مینویسم تموم شد براتون میزارم

                دیدگاه


                  #9
                  پاسخ : نمونه برداری از ولتاژ با میکرو

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

                  شروع سیکل توسط وقفه خارجی اطلاع رسانی میشه و همزمان شروع سیکل متغیر C که از نوع بیت هست تغییر حالت پیدا میکنه و 1 میشه با یک شدن متغییرC شرط نمونه برداری آغاز میشه و در ابتدا نمونه ولتاژ از طریق ADC صفر خونده میشه و بعد داخل متغییر D ریخته میشه و بعد بعه توان دو میرسه و با نمونه ولتاژ حالت قبل جمع میشه و با پایان سیکل و شروع سیکل بعدی باز از طریق وقفه خارجی متغییر C از یک به صفر تغییر میکنه و نمونه گیری تموم میشه
                  [code=vb]$regfile = "m16def.dat"
                  $crystal = 8000000

                  Config Adc = Single , Prescaler = Auto , Reference = Avcc

                  Config Int0 = Rising
                  On Int0 Int0_int

                  Dim A As Word , B As Word , C As Bit , D As Single , E As Single

                  Do

                  If C = 1 Then
                  A = Getadc(0)
                  D = A
                  D = D ^ 2
                  E = E + D
                  Waitus 20
                  End If

                  Loop

                  End


                  Int0_int:
                  Toggle C
                  Return

                  [/code]

                  دیدگاه


                    #10
                    پاسخ : نمونه برداری از ولتاژ با میکرو

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

                    شروع سیکل توسط وقفه خارجی اطلاع رسانی میشه و همزمان شروع سیکل متغیر C که از نوع بیت هست تغییر حالت پیدا میکنه و 1 میشه با یک شدن متغییرC شرط نمونه برداری آغاز میشه و در ابتدا نمونه ولتاژ از طریق ADC صفر خونده میشه و بعد داخل متغییر D ریخته میشه و بعد بعه توان دو میرسه و با نمونه ولتاژ حالت قبل جمع میشه و با پایان سیکل و شروع سیکل بعدی باز از طریق وقفه خارجی متغییر C از یک به صفر تغییر میکنه و نمونه گیری تموم میشه
                    [code=vb]$regfile = "m16def.dat"
                    $crystal = 8000000

                    Config Adc = Single , Prescaler = Auto , Reference = Avcc

                    Config Int0 = Rising
                    On Int0 Int0_int

                    Dim A As Word , B As Word , C As Bit , D As Single , E As Single

                    Do

                    If C = 1 Then
                    A = Getadc(0)
                    D = A
                    D = D ^ 2
                    E = E + D
                    Waitus 20
                    End If

                    Loop

                    End


                    Int0_int:
                    Toggle C
                    Return

                    [/code]
                    از برنامه ای که نوشتین خیلی ممنون ، خیلی کمکم کرد.
                    فقط درموردش چند سوال داشتم :
                    1- کجا مشخص شده که C = 1 شروع سیکل رو نشون میده ؟ من نفهمیدم چطور c شروع و پایان سیکل رو نشون میده ؟؟ و اینکه چطور مقدار c عوض میشه؟
                    2- نیازی نیست از دستور enable intrupt استفاده کرد ؟
                    ممنون میشم راهنمایی کنید

                    دیدگاه


                      #11
                      پاسخ : نمونه برداری از ولتاژ با میکرو

                      نوشته اصلی توسط m.riahi
                      از برنامه ای که نوشتین خیلی ممنون ، خیلی کمکم کرد.
                      فقط درموردش چند سوال داشتم :
                      1- کجا مشخص شده که C = 1 شروع سیکل رو نشون میده ؟ من نفهمیدم چطور c شروع و پایان سیکل رو نشون میده ؟؟ و اینکه چطور مقدار c عوض میشه؟
                      2- نیازی نیست از دستور enable intrupt استفاده کرد ؟
                      ممنون میشم راهنمایی کنید
                      1-داخل حلقه do-loop با استفاده از دستور If C = 1 Then فقط زمانی نمونه برداری میشه که c=1باشه
                      حالا هر وقت که سیکل بخواد شروع بشه وقفه خارجی هم که به این ولتاژ وصله فعال میشه و برنامه به زیربرنامه Int0_int میره داخل این زیربرنامه c تغییر حالت میده و از صفر به یک تغییر میکنه
                      باز زمانی که سیکل تمون میشه و سیکل بعدی میخواد شروع بشه وقفه خارجی فعال میشه و c از یک به صفر تبدیل میشه


                      2- آخ آخ آخ آخخخخخخ
                      کلا enable interrupt یادم رفته بود
                      اشکال نداره enable interrupt رو درجای خودش نوشتم و برنامه میشه شکل زیر


                      [code=vb]$regfile = "m16def.dat"
                      $crystal = 8000000

                      Config Adc = Single , Prescaler = Auto , Reference = Avcc

                      Config Int0 = Rising
                      On Int0 Int0_int
                      enable interrupt

                      Dim A As Word , B As Word , C As Bit , D As Single , E As Single

                      Do

                      If C = 1 Then
                      A = Getadc(0)
                      D = A
                      D = D ^ 2
                      E = E + D
                      Waitus 20
                      End If

                      Loop

                      End


                      Int0_int:
                      Toggle C
                      Return

                      [/code]

                      دیدگاه


                        #12
                        پاسخ : نمونه برداری از ولتاژ با میکرو

                        نوشته اصلی توسط اشکان غفارزاده.
                        1-داخل حلقه do-loop با استفاده از دستور If C = 1 Then فقط زمانی نمونه برداری میشه که c=1باشه
                        حالا هر وقت که سیکل بخواد شروع بشه وقفه خارجی هم که به این ولتاژ وصله فعال میشه و برنامه به زیربرنامه Int0_int میره داخل این زیربرنامه c تغییر حالت میده و از صفر به یک تغییر میکنه
                        باز زمانی که سیکل تمون میشه و سیکل بعدی میخواد شروع بشه وقفه خارجی فعال میشه و c از یک به صفر تبدیل میشه


                        2- آخ آخ آخ آخخخخخخ
                        کلا enable interrupt یادم رفته بود
                        اشکال نداره enable interrupt رو درجای خودش نوشتم و برنامه میشه شکل زیر


                        [code=vb]$regfile = "m16def.dat"
                        $crystal = 8000000

                        Config Adc = Single , Prescaler = Auto , Reference = Avcc

                        Config Int0 = Rising
                        On Int0 Int0_int
                        enable interrupt

                        Dim A As Word , B As Word , C As Bit , D As Single , E As Single

                        Do

                        If C = 1 Then
                        A = Getadc(0)
                        D = A
                        D = D ^ 2
                        E = E + D
                        Waitus 20
                        End If

                        Loop

                        End


                        Int0_int:
                        Toggle C
                        Return

                        [/code]
                        خیلی ممنون از جوابتون
                        یه سوالی درباره نحوه اجرای برنامه داشتم ، میشه بگین من دارم درست میگم یا نه؟
                        برنامه اینطوریه که با رسیدن به دستور enable interrupt وقفه فعال میشه و با دستور On Int0 Int0_int برنامه به خط 27 که Int0_int است میره و c را برعکس میکنه و برمیگرده به خط 12 که دستور do است دستوراتو انجام میده و زمانیکه به loop رسید برمیگرده به do و این چرخه تکرار میشه.
                        این نحوه براشته منه ، میخوام ببینم درسته یا نه ؟ ممنون میشم راهنمایی کنید.چون اگه درست باشه درحقیت مقدار c فقط یک بار عوض میشه چون برنامه فقط یک بار On Int0 Int0_int را اجرا میکنه و به خط 27 که Int0_int است میره.
                        مشکل منم دقیقا همینه که برنامه فقط یکبار دستور Toggle C رو انجام میده.
                        اگه دارم اشتباه میکنم میشه توضیح بدین برنامه چطور کار میکنه ؟

                        یه سوال دیگه ، ببخشید که دوباره میپرسم چون متوجه نشدم: ببینید ما به ورودی adc میکرو یک ولتاژ یکسوشده وصل کردیم که طبق حرف شما c=1 نشون دهنده شروع سیکله و باید نمونه برداری انجام بشه و c=0 یعنی سیکل تموم شده و نمونه برداری نباید انجام بشه.حالا من میخوام بدونم چطوری برنامه اینو تشخیص میده؟ اخه هیچ برنامه ننوشتیم که بشه شروع و پایان سیکل را تشخیص داد.
                        شاید برداشت من اشتباهه، میشه در این مورد هم راهنمایی کنید.
                        خیلی ممنون

                        دیدگاه


                          #13
                          پاسخ : نمونه برداری از ولتاژ با میکرو

                          خب بذارید یه بار دیگه از اول براتون توضیح بدم چون ظاهرا خوب متوجه نشدید

                          تا سطر دهم که کانفیگ و تعریف متغییر هست که برنامه از سطر 10به بعد رو اجرا میشه

                          برنامه ابتدا وارد حلقه do loop میشه و در سطر 14 مقدار c رو چک میکنه و تا زمانی که c به یک تغییر نکرده سطر 16تا 19 رو اجرا نمیکنه و فقط c رو چک میکنه

                          تغییر حالت c زمانی اتفاق میوفته که سیکل شروع بشه ، با شروع سیکل برنامه از do loop خارج میشه و به Int0_int میره و c رو برابر یک میکنه و با دستور return به do loop برمیگرده و c رو چک میکنه . حالا که c یک شده شرط If C = 1 Then اجرا میشه و نمونه گیری از ولتاژ و انجام عملیات صورت میگیره و این پروسه تا زمانی که If C = 1 Then یک بمونه صورت میگیره

                          حالا با اتمام سیکل برنامه از do loop خارج میشه و به Int0_int وارد میشه و c رو از یک به صفر تبدیل میکنه و با دستور return برنامه به حلقه do loop برمیگرده و باز c رو چک میکنه و چون c=0 هست شرط If C = 1 Then اجرا نمیشه

                          باز با شروع یه سیکل دیگه برنامه از do loop خارج میشه و به Int0_int میره و c رو برابر یک میکنه و با دستور return به do loop برمیگرده و c رو چک میکنه . حالا که c یک شده شرط If C = 1 Then اجرا میشه و نمونه گیری از ولتاژ و انجام عملیات صورت میگیره و این پروسه تا زمانی که If C = 1 Then یک بمونه صورت میگیره

                          این پروسه تغییر c با شروع هر سیکل ادامه پیدا میکنه

                          دیدگاه


                            #14
                            پاسخ : نمونه برداری از ولتاژ با میکرو

                            نوشته اصلی توسط m.riahi
                            سلام ، یه سوالی داشتم : در برنامه بسکام با استفاده از میکرو atmega16 با چه دستوری میشه از ولتاژ نمونه گیری کرد ؟مثلا فرکانس رو 100 هرتز در نظر میگیرم.زمان نمونه برداریو چطور تعیین کنم؟
                            میخوام از ولتاژ ورودی تعداد نمونه های زیادی بگیرم و یه عملیات ریاضی روشون انجام بدم.(میخوام همه نمونه ها رو به توان 2 برسونم و با هم جمع کنم بعد تقسیم بر یه زمانی مثل 0.5 ثانیه کنم)
                            یه سوال دیگه کسی میدونه سرعت adc میکرو atmega16 چنده ؟
                            مشکل اصلیم اینه که نمیدونم چطور زمان رو تعیین کنم ، یعنی مثلا میخوام هر 10 میکرو ثانیه یه نمونه بگیرم چطور باید این زمان رو مشخص کنم ؟؟
                            ممنون میشم راهنمایی کنید.
                            برای نمونه برداری از فرکانس صد هرتز باید حداقل 10 تا 20 برابر فرکانس نمونه برداری کنی (طبق اصل شانون هارتلی)
                            یعنی برای 100 هرتز با کیفیت بالا میشه 2 کیلو هرتز و برای اینکار باید کلاک میکرو 16 مگا باشه و کلاک adc هم همون 16 مگا که البته ممکنه نویز بگیره یکم دستوراتش که دوستان اشاره کردن شما باید تند تند نمونه برداری کنی و بریزی در متغییر ها و بعد بری سراغ کار پردازش اطلاعات

                            sigpic

                            دیدگاه


                              #15
                              پاسخ : نمونه برداری از ولتاژ با میکرو

                              نوشته اصلی توسط ناصر منتظری
                              برای نمونه برداری از فرکانس صد هرتز باید حداقل 10 تا 20 برابر فرکانس نمونه برداری کنی (طبق اصل شانون هارتلی)
                              یعنی برای 100 هرتز با کیفیت بالا میشه 2 کیلو هرتز و برای اینکار باید کلاک میکرو 16 مگا باشه و کلاک adc هم همون 16 مگا که البته ممکنه نویز بگیره یکم دستوراتش که دوستان اشاره کردن شما باید تند تند نمونه برداری کنی و بریزی در متغییر ها و بعد بری سراغ کار پردازش اطلاعات
                              یه سوال : کلاک adc را چطور باید تعیین کرد ؟

                              دیدگاه

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