اطلاعیه

Collapse
No announcement yet.

[آموزشی]چطور دقت ADC میکرو STM32 را افزایش بدیم؟

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

    [آموزشی]چطور دقت ADC میکرو STM32 را افزایش بدیم؟

    خب از اونجایی که بعضی بچه ها بلد نیستن که درست از ADC میکرو درست استفاده کنن و خطاهاشو برطرف کنن من این تاپیک رو زدم. سعی دارم خطاهای اصلی رو معرفی و توضیح بدم. امیدوارم وقت کافی بیارم که بتونم خوب و کامل توضیحش بدم. اگه از بین دوستان کسی هم کمک کنه خوبه. پیشاپیش استقبال میکنم.
    چهارتا خطای مهم داریم که دوتای اولی بسیار مهم هستن:
    1. خطای off-set
    2. خطای gain
    3. خطای حالت خطی دیفرانسیلی
    4. خطای حالت خطی انتگرالی


    این خطاها رو در شکل زیر که از دیتاشیت STM32 برداشتم می تونید ببینید.



    واسه میکروهای دیگه مثل AVR یا PIC یا LPC و غیره هم وجود داره.
    خطای off-set
    اگه به پایین نمودار نگاه کنید، متوجه میشید که در واقعیت نمودار واقعی رو صفر نیست. یعنی مقداری به سمت راست شیفت پیدا میکنه. این همون خطای off-set هستش. پس شما باید مقدار این خطا رو باید اندازه بگیرید و از مقدار خونده شده کم کنید تا اثرش از بین بره.



    خطای gain
    این خطا مثل مضربی برای نمودار می مونه که شیب نمودار رو تغییر میده. اگه دقت کنید متوجه میشید که بالای نمودار رو تحت تاثیر قرار میده. پس باید در عدد 1-مقدار شیب ضرب شود تا این خطا نیز از بین برود.



    #2
    پاسخ : [آموزشی]چطور دقت ADC میکرو STM32 را افزایش بدیم؟

    دوستان دقت کنید که تمامی این خطاها رو بقیه میکرو ها هم دارند. برای اینکه بهتون ثابت کنم:

    مثلا بین AVRها، اگه دیتاشیتشون رو نگاه کنید اینو میبینید:



    یا برای xmega از یکی از فایل های اپلیکش نات هاش اینو میبینید:



    یا LPC ها:



    یا اونایی که با محصولات میکروچیپ کار میکنن:



    و....

    منابع:








    دیدگاه


      #3
      پاسخ : [آموزشی]چطور دقت ADC میکرو STM32 را افزایش بدیم؟

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

      دیدگاه


        #4
        پاسخ : [آموزشی]چطور دقت ADC میکرو STM32 را افزایش بدیم؟

        با سلام برای کالیبره کردن ADC ها، اولین قدم اینه که ولتاژ تغذیه، ولتاژ رفرنس و سیگنال ورودی رو با اسکوپ بررسی کنین و اطمینان داشته باشین که مقدارشون درست باشه و صاف و بدون ریپل باشن. البته معمولا ریپلهای فرکانس بالا که در اسکوپ دیده میشن و مربوط به DC/DC ها هستن در فرآیتد تبدیل، تاثیر نمیذارن. اما ریپل فرکانس پایین باید حتما حذف بشه. گام بعدی اینه که حتما یه مولتی متر دقیق و کالیبره داشته باشین تا نتیجه رو با مقدار اون مقایسه کنین و خطا رو بدست بیارین. اما نکته ی مهم اینه که ممعمولا مقدار ADC ها با کمی پرش همراه هست و باید پیش از کالیبره ی دقیق، این پرش هم حذف بشه. روشی که معمولا استفاده میشه میانگین گیری هست که در این روش تعداد مشخصی نمونه خونده میشه و مجموع مقادیر اونها تقسیم بر تعدادشون میشه. عیب این روش اینه که نتیجه ی این تقسیم میتونه پیوستگی نداشته باشه و تقریبا همون مقدار پرش رو داره اما با سرعت کمتر. روش بهتر که هم مقدار واقعی ولتاژ ورودی رو میده و هم پیوستگی داره استفاده از فیلتر کالمن هست. ساده ترین فیلتر کالمن نوع دو جمله ای هست که به اینصورت پیاده میشه: VALUE = K * OLD + (1-K) * NEW که در اون VALUE ،مقدار فعلی هست و OLD مقدار فبلی و NEW مقدار فعلی که از ADC خونده شده. ضریب K هم هر عددی مابین صفر و یک میتونه باشه و دقت کنین که در صورت استفاده از هر چند جمله، مجموع ضرایب جملات حتما باید 1 بشه تا عدد نهایی درست باشه و خطا نداشته باشه. در عبارت فوق هرچه K بزرگتر باشه، خروجی لخت تر و کندتر، اما پایدارتر میشه و بالعکس با کوچکتر شدن K، سرعت افزایش پیدا میکنه و مقدار نوسانات هم بیشتر میشه. در حقیقت خوندن ADC بصورت عادی و بدون فیلتر کالمن، همون استفاده از K = 0 هست. پس عدد K به سرعت مورد نیاز شما مربوط میشه و در اختیار خودتون هست. با این روش عملا محدودیت رزولوشن ADC هم حداقل در نمایش برداشته میشه، البته خطای یک LSB باقی هست و از بین نمیره. وقتی با این روش، عدد پایداری از ADC تون بدست آوردید با مولتی متر کالیبره میتونید اون رو کالیبره کنید. برای کالیبراسیون آفست، ورودیِ صفر بهش میدید و خروجی هم باید پس از پایداری صفر باشه و اگه نبود، مقدارش رو یادداشت کنید و در برنامه بصورت نرم افزاری از عدد بدست اومده ی کالمن کم کنین. تا اینجا خطای آفست برطرف میشه. برای کالیبره کردن گین هم حداقل یک نقطه که معمولا نقطه ی وسط رنج ورودی، بهترین نقطه هست رو باید به ADC بدین و همزمان با مولتی متر هم اندازه گیری کنین.با فرض اینکه عدد مولتی متر، کالیبره و درست هست، عدد ADC رو با ضریبی به عدد مولتی متر برسونین که معمولا این ضریب احتمالا با اختلاف جزئی در حدود عدد 1 در میاد. در اینجا کالیبراسیون به پایان میرسه. اما برای اطمینان از صحت عملیات کالیبراسیون، در نقاط دیگه ی بازه ی ورودی هم مقادیر قرائت شده توسط مولتی متر و ADC رو چک کنین. پی نوشت: نمیدونم چرا من بین جملات فاصله میذارم تا خوانایی بهتر بشه، اما ادیتور فاصله ها رو حذف میکنه و همه رو بهم میچسبونه، ظاهرا اینتر ها و اسپیس ها رو حذف میکنه، مسئولین لطفا رسیدگی کنن!!
        جدیدترین ویرایش توسط نو رسیده; ۲۰:۵۱ ۱۳۹۶/۰۶/۲۲.
        کمترین توقع از یک فرد تحصیلکرده، دانستن املای صحیح کلمات است.

        دیدگاه


          #5
          پاسخ : [آموزشی]چطور دقت ADC میکرو STM32 را افزایش بدیم؟

          دوست عزیز برای افزایش دقت استفاده از روش های Oversampling میباشد که دو روش داره یکی روش white noise و یکی هم روش triangular dither ،که داخل فایل AN2668 بطور کامل توضیح داده . خیلی ساده میشه این کار رو انجام داد موفق باشید

          دیدگاه


            #6
            پاسخ : [آموزشی]چطور دقت ADC میکرو STM32 را افزایش بدیم؟

            نوشته اصلی توسط نو رسیده نمایش پست ها
            با سلام برای کالیبره کردن ADC ها، اولین قدم اینه که ولتاژ تغذیه، ولتاژ رفرنس و سیگنال ورودی رو با اسکوپ بررسی کنین و اطمینان داشته باشین که مقدارشون درست باشه و صاف و بدون ریپل باشن. البته معمولا ریپلهای فرکانس بالا که در اسکوپ دیده میشن و مربوط به DC/DC ها هستن در فرآیتد تبدیل، تاثیر نمیذارن. اما ریپل فرکانس پایین باید حتما حذف بشه. گام بعدی اینه که حتما یه مولتی متر دقیق و کالیبره داشته باشین تا نتیجه رو با مقدار اون مقایسه کنین و خطا رو بدست بیارین. اما نکته ی مهم اینه که ممعمولا مقدار ADC ها با کمی پرش همراه هست و باید پیش از کالیبره ی دقیق، این پرش هم حذف بشه. روشی که معمولا استفاده میشه میانگین گیری هست که در این روش تعداد مشخصی نمونه خونده میشه و مجموع مقادیر اونها تقسیم بر تعدادشون میشه. عیب این روش اینه که نتیجه ی این تقسیم میتونه پیوستگی نداشته باشه و تقریبا همون مقدار پرش رو داره اما با سرعت کمتر. روش بهتر که هم مقدار واقعی ولتاژ ورودی رو میده و هم پیوستگی داره استفاده از فیلتر کالمن هست. ساده ترین فیلتر کالمن نوع دو جمله ای هست که به اینصورت پیاده میشه: VALUE = K * OLD + (1-K) * NEW که در اون VALUE ،مقدار فعلی هست و OLD مقدار فبلی و NEW مقدار فعلی که از ADC خونده شده. ضریب K هم هر عددی مابین صفر و یک میتونه باشه و دقت کنین که در صورت استفاده از هر چند جمله، مجموع ضرایب جملات حتما باید 1 بشه تا عدد نهایی درست باشه و خطا نداشته باشه. در عبارت فوق هرچه K بزرگتر باشه، خروجی لخت تر و کندتر، اما پایدارتر میشه و بالعکس با کوچکتر شدن K، سرعت افزایش پیدا میکنه و مقدار نوسانات هم بیشتر میشه. در حقیقت خوندن ADC بصورت عادی و بدون فیلتر کالمن، همون استفاده از K = 0 هست. پس عدد K به سرعت مورد نیاز شما مربوط میشه و در اختیار خودتون هست. با این روش عملا محدودیت رزولوشن ADC هم حداقل در نمایش برداشته میشه، البته خطای یک LSB باقی هست و از بین نمیره. وقتی با این روش، عدد پایداری از ADC تون بدست آوردید با مولتی متر کالیبره میتونید اون رو کالیبره کنید. برای کالیبراسیون آفست، ورودیِ صفر بهش میدید و خروجی هم باید پس از پایداری صفر باشه و اگه نبود، مقدارش رو یادداشت کنید و در برنامه بصورت نرم افزاری از عدد بدست اومده ی کالمن کم کنین. تا اینجا خطای آفست برطرف میشه. برای کالیبره کردن گین هم حداقل یک نقطه که معمولا نقطه ی وسط رنج ورودی، بهترین نقطه هست رو باید به ADC بدین و همزمان با مولتی متر هم اندازه گیری کنین.با فرض اینکه عدد مولتی متر، کالیبره و درست هست، عدد ADC رو با ضریبی به عدد مولتی متر برسونین که معمولا این ضریب احتمالا با اختلاف جزئی در حدود عدد 1 در میاد. در اینجا کالیبراسیون به پایان میرسه. اما برای اطمینان از صحت عملیات کالیبراسیون، در نقاط دیگه ی بازه ی ورودی هم مقادیر قرائت شده توسط مولتی متر و ADC رو چک کنین. پی نوشت: نمیدونم چرا من بین جملات فاصله میذارم تا خوانایی بهتر بشه، اما ادیتور فاصله ها رو حذف میکنه و همه رو بهم میچسبونه، ظاهرا اینتر ها و اسپیس ها رو حذف میکنه، مسئولین لطفا رسیدگی کنن!!
            سلام
            بابت توضیحات مفیدتون واقعا ممنونم
            سوالاتم در مورد نحوه فیلتر کردن و... تقریبا حل شد
            اما یک مشکلی هنوز باقی مونده
            همونطور که گفتید یکی از روش ها استفاده از میانگین گیری هست.
            از طرفی این میکرو ها میتونن تا سرعت یک مگاسمپل بر ثانیه نمونه برداری کنن،ولی اگر بخواهیم از میانگین گیری استفاده کنیم و همچنین حداکثر سرعت رو داشته باشیم به نظر میاد باید از DMA استفاده کنیم؛حال آنکه با این کار نمیشه تعداد نمونه هاییکه با DMA ذخیره میشن( و سپس وقفه رخ میده تا بین این نمونه ها میانگین بگیریم ) رو کمتر از حدود 20 تا کرد!
            و این یعنی کم کردن سرعت نمونه برداری به یک بیستم
            اگر برنامه طوری نوشته بشه که وقفه DMA در تعداد نمونه هایی کمتر از 15 تا رخ بده؛میکرو عملا به هیچ کار دیگه ای نمیرسه و همش تو وقفست
            برای حل این مشکل راه حلی وجود داره؟
            باتشکر
            ................Fx7SAM................

            دیدگاه


              #7
              پاسخ : [آموزشی]چطور دقت ADC میکرو STM32 را افزایش بدیم؟

              برای این کار از FIFO باید استفاده کنید، مثلا 1000 عدد میگیرید با فرکانس 1 مگ، حالا مثلا 5 عدد از اعداد را برداشته و میانگین گیری میکنیم در عمل فرکانس این سیگنال 200 کیلو هست. این عدد را وارد FIFO میکنیم.
              فرض کنید میخواهیم این اعداد را روی DAC قرار بدهیم
              یک تایمر فعال میکنیم و در زمان اینتراپت تایمر یک داده از FIFO خارج و روی DAC قرار میدهیم. ( ممکن است که فرکانس 200 کیلو DAC زیاد باشد) در این صورت باید DAC مد DMA فعال باشد و هر بار یک سری عدد را در بافر DMA به روز کنیم.

              دیدگاه


                #8
                پاسخ : [آموزشی]چطور دقت ADC میکرو STM32 را افزایش بدیم؟

                نوشته اصلی توسط Faateh نمایش پست ها
                برای این کار از FIFO باید استفاده کنید، مثلا 1000 عدد میگیرید با فرکانس 1 مگ، حالا مثلا 5 عدد از اعداد را برداشته و میانگین گیری میکنیم در عمل فرکانس این سیگنال 200 کیلو هست. این عدد را وارد FIFO میکنیم.
                خیلی ممنونم از وقتی که گذاشتید
                دو تا سوال
                یکی اینکه میکروم فقط روی usb و sdcard فیفو داره
                دوم اینکه توی این مثالی که زدید ،فرکانس نمونه برداری نهاییمون میشه یک کیلوهرتز یا 200؟
                چون ما اینطوری هر هزار تا نمونه یک وقفه داریم که تو اون وقفه میایم و از 5 تامیانگین گیری میکنیم.....یعنی تو هر ثانیه هزار بار این اتفاق میوفته....خب اینکه میشه یک کیلو سمپل
                ................Fx7SAM................

                دیدگاه


                  #9
                  پاسخ : [آموزشی]چطور دقت ADC میکرو STM32 را افزایش بدیم؟

                  نوشته اصلی توسط سیدعلی.م نمایش پست ها
                  سلام
                  بابت توضیحات مفیدتون واقعا ممنونم
                  سوالاتم در مورد نحوه فیلتر کردن و... تقریبا حل شد
                  اما یک مشکلی هنوز باقی مونده
                  همونطور که گفتید یکی از روش ها استفاده از میانگین گیری هست.
                  از طرفی این میکرو ها میتونن تا سرعت یک مگاسمپل بر ثانیه نمونه برداری کنن،ولی اگر بخواهیم از میانگین گیری استفاده کنیم و همچنین حداکثر سرعت رو داشته باشیم به نظر میاد باید از DMA استفاده کنیم؛حال آنکه با این کار نمیشه تعداد نمونه هاییکه با DMA ذخیره میشن( و سپس وقفه رخ میده تا بین این نمونه ها میانگین بگیریم ) رو کمتر از حدود 20 تا کرد!
                  و این یعنی کم کردن سرعت نمونه برداری به یک بیستم
                  اگر برنامه طوری نوشته بشه که وقفه DMA در تعداد نمونه هایی کمتر از 15 تا رخ بده؛میکرو عملا به هیچ کار دیگه ای نمیرسه و همش تو وقفست
                  برای حل این مشکل راه حلی وجود داره؟
                  باتشکر
                  درود بر شما
                  معمولا پردازش سیگنالهای سریع در حین سمپلینگ انجام نمیشه.
                  شما با فرکانس 1 مگ دیتا برداری میکنید و اونها رو بصورت راو یا خام به کامپیوتر ارسال میکنید و بعد اونجا فیلتر، پردازش و استفاده میشه.
                  اما اگه حتما نیازه که در همون لحظه پردازش بشه بهتره از یه مدار محاسباتی سخت افزاری مبتنی بر FPGA استفاده کنین و میکرو درگیر محاسبات نشه.
                  کمترین توقع از یک فرد تحصیلکرده، دانستن املای صحیح کلمات است.

                  دیدگاه


                    #10
                    پاسخ : [آموزشی]چطور دقت ADC میکرو STM32 را افزایش بدیم؟

                    نوشته اصلی توسط سیدعلی.م نمایش پست ها
                    خیلی ممنونم از وقتی که گذاشتید
                    دو تا سوال
                    یکی اینکه میکروم فقط روی usb و sdcard فیفو داره
                    دوم اینکه توی این مثالی که زدید ،فرکانس نمونه برداری نهاییمون میشه یک کیلوهرتز یا 200؟
                    چون ما اینطوری هر هزار تا نمونه یک وقفه داریم که تو اون وقفه میایم و از 5 تامیانگین گیری میکنیم.....یعنی تو هر ثانیه هزار بار این اتفاق میوفته....خب اینکه میشه یک کیلو سمپل
                    فیفو نرم افزاری ( آنچه مد نظر من بود) یا رشته ای که تولید می کنید، تا در یک زمان خاص به DMA یا اینتراپت داده شود.
                    با عدد 5 عدد 200 کیلو درست هست.
                    دقت کنید نمونه برداری 1 مگ بوده که DMA تعداد 1000 نمونه آن را یکجا تحویل میدهد. حال شما این 1000 نمونه را 5 عدد، 5 عدد متوسط میگیرید، میشود 200 عدد ( که اینجا در یک فیفو ارسال میکنید) یا در مثال قبل که گفتم همین 200 عدد را در DMA واحد DAC قرار دهید
                    حالا DAC دارد 200 کیلو سمپل خروجی میدهد

                    دیدگاه


                      #11
                      پاسخ : [آموزشی]چطور دقت ADC میکرو STM32 را افزایش بدیم؟

                      نوشته اصلی توسط Faateh نمایش پست ها
                      فیفو نرم افزاری ( آنچه مد نظر من بود) یا رشته ای که تولید می کنید، تا در یک زمان خاص به DMA یا اینتراپت داده شود.
                      با عدد 5 عدد 200 کیلو درست هست.
                      دقت کنید نمونه برداری 1 مگ بوده که DMA تعداد 1000 نمونه آن را یکجا تحویل میدهد. حال شما این 1000 نمونه را 5 عدد، 5 عدد متوسط میگیرید، میشود 200 عدد ( که اینجا در یک فیفو ارسال میکنید) یا در مثال قبل که گفتم همین 200 عدد را در DMA واحد DAC قرار دهید
                      حالا DAC دارد 200 کیلو سمپل خروجی میدهد
                      اهان....بله....من اشتباه متوجه شده بودم.....200 کیلو درسته اینطور
                      ولی خب برای من که دارم از نمونه های برای فیدبک منبع تغذیه سوئیچینگ استفاده میکنم این روش به نظرم به کار نمیاد و مجبورم پس از مثلا هر 20 نمونه یه بار میانگین بگیرم و دیوتی سایکل رو بر اساس این نمونه های جدید تنظیم کنم و بخاطر همین هم هست که با مشکل روبرو شدم

                      بعدش میشه یه مقدار در مورد فیفو نرم افزاری توضیح بدید؟
                      آشنا نیستم باهاش
                      متشکرم
                      ................Fx7SAM................

                      دیدگاه

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