اطلاعیه

Collapse
No announcement yet.

حداکثر سرعت ADC در STM32F103

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

    حداکثر سرعت ADC در STM32F103

    باسلام
    در میکرو های جدید امکانات فوق العاده ای دیده میشه!
    یکی از اونها که وقتی در موردش خوندم و شیفتش شدم امکان دسترسی مستقیم به رم (DMA) بود
    میکرو های STM32 واحد ADC فوق العاده ای دارن بطوریکه حتی در دیتاشیت ضعیفترین اونها هم شاهد حضور ADC با سرعت یک میکروثانیه هستیم و برای کسی که خیلی تو حال و هوای دیجیتال و میکرو نبوده و سابقا فقط اندک آشنایی با AVR داشته دیدن همچین سرعتی شگفت انگیزه
    اما مشکلی که هست اینه که در عمل دستیابی به نرخ نمونه برداری یک میلیون نمونه در ثانیه ذکر شده در دیتاشیت یه جورهایی محال و صرفا یه قپی به نظر میرسه!!!
    بنده چند وقتیه کار با میکروی STM32F103RET6 رو با کیوب و توابع هال شروع کردم و به نمونه برداری با نرخ بالا هم نیاز دارم،اما به هر روشی که برنامه نوشتم نتونستم به سرعتی بیشتر از 500 کیلو سمپل برسم که واقعا برام عجیبه!
    چون من فقط و فقط یک کانال رو دارم با یک واحد مبدل میخونم و پس از هر چند ده هزار بار خوندن،تعداد سمپل هارو روی السیدی نشون میدم که نتیجه ای ناامید کننده رو نشون میده!
    ابتدا با روش های ساده و پیش پاافتاده توی حلقه ی اصلی مبدل رو روشن میکردم و با بررسی اینکه تبدیل انجام شده یا نه خروجی رو میگرفتم که خب این روش مسلما سرعت کمی داره
    بعد با استفاده از وقفه و قرار دادن مبدل در حالت پیوسته و گرفتن وقفه این کار رو انجام دادم که در وقفه یک متغیر رو بعلاوه یک میکنم و پس از هر مدت معلومی این عدد رو روی السیدی نشون میدم
    اما همونطور که گفتم نهایت سرعتی که بهش دست پیدا کردم،نیم میلیون نمونه در ثانیه بود و این در حالی بود که در حلقه اصلی تقریبا هیچ کاری انجام نمیشد و در روتین وقفه هم فقط خروجی مبدل رو میریزم توی یه متغیر و همچنین متغیری که مربوط به تعداد نمونه های گرفته شده هست رو بعلاوه یک میکنم
    در این حالت نمیشه حتی مدت زمان نمونه برداری رو کمتر از 55 سیکل کلاک کرد و اگر این عدد رو کمتر کنم هییییییچ چیزی روی السیدی نشون داده نمیشه که نشانگر اینه که برنامه دائما در روتین وقفه هست و این نتیجه گیری با دیباگر هم تایید شد!!!!!!!!!
    همچنین اگر حتی یک دستور به دستورات روتین وقفه اضافه کنم باز هم میکرو توی وقفه میمونه و مجبور میشم زمان نمونه گیری رو از 55 سیکل هم بیشتر کنم و حتی تا 200 سیکل برسونم

    در این حال بود که با اشنایی با قابلیت DMA و با دنیای امید و آرزو راه اندازی این قسمت رو یاد گرفتم و راهش انداختم اما با کمال ناباوری دیدم که سرعت نمونه برداری در این حالت نصف و یا حتی کمتر از نصف حالت قبلی یعنی کار با وقفه هست
    در این حالت اصلا با زمان نمونه برداری کمتر از 200 سیکل برنامه کار نمیکنه و توی وقفه DMA میمونه!!!!!

    آخه چرا؟!؟!!؟!؟

    حتی اوضاع از این هم بدتر شد تاجاییکه من تمام برنامه رو حذف کردم و فقط مبدل رو راه انداختم همراه با DMA و از هیچ وقفه ای هم استفاده نکردم بطوریکه صرفا ADC داشت ول میگشت و داده میگرفت و تبدیل میکرد و با DMA میریخت توی حافظه و توی حلقه اصلی برنامه فقط و فقط یه دستور ساده برای نمایش روی السیدی بود!
    اما در کمال ناباوری چیزی روی السیدی نمیومد!
    آخه مگه نمیگن خوبی DMAاینه که سی پی یو رو مشغول نمیکنه؟!
    خب من که کاری با ADC نداشتم،چرا سی پی یو گیر میکرد؟!؟!


    در انتها باید بگم کلاک ورودی میکرو یک کریستال 8 مگ هست و کلاک داخلی روی حداکثر یعنی 72 تنظیم شده و کلاک ADC دوازده مگ هست که حداکثر کلاک مجازش 14 هست
    ممنون میشم از دوستان راهنماییم کنن
    ................Fx7SAM................

    #2
    پاسخ : حداکثر سرعت ADC در STM32F103

    عدد یک مگ عدد زیادی برای DMA نیست، برای مثال عددهای SPI خیلی بیشتر از این حد داده میشود. احتمالا تو تنظیمات اشتباهی رخ داده اگر ممکن است فایل Cube را به اشتراک بگذارید. ( اگر فرکانس باس ها را درست تنظیم کنید نباید مشکلی وجود داشته باشد برای مثال نوت دیتا شیت
    To have an ADC conversion time of 1 µs, APB2 must be at 14 MHz, 28 MHz or 56 MHz
    )
    پیشنهاد ST برای نمونه برداری نرخ بالا interleaved است که همزمان دو ADC است این کار دقت ADC را بالا میبرد و شبیه ADC پایلاین میشود.

    دیدگاه


      #3
      پاسخ : حداکثر سرعت ADC در STM32F103

      سلام
      قبلا وقتی یک پین میکرو AVR به زبان سی در یک حلقه 1 و 0 میکردم سرعت کمتری نسبت به اسمبلی داشتم . ( یادم نمیاد چقدر بود ولی فرقش خیلی بود )
      نمیدونم شاید این مشکل هم یه ربطی به هم مورد داشته باشه .

      دیدگاه


        #4
        پاسخ : حداکثر سرعت ADC در STM32F103

        ظاهرا فرکانس میکرو رو بیارید رو 56 و دقت کنید فرکانسی که به ADC میرود 14مگ بشود که شما به نرخ 1MSPS میرسید. احتمالا با اور کلاک ماژول سرعت بالا تر هم بگیرید ولی ریسک هنگ و ریستش زیاده. بهتره همون مدل اینترلیو کار کنید. یا از سری F4 یا F7 استفاده کنید
        جدیدترین ویرایش توسط Faateh; ۲۰:۵۷ ۱۳۹۷/۰۴/۰۸.

        دیدگاه


          #5
          پاسخ : حداکثر سرعت ADC در STM32F103

          نوشته اصلی توسط Faateh نمایش پست ها
          عدد یک مگ عدد زیادی برای DMA نیست، برای مثال عددهای SPI خیلی بیشتر از این حد داده میشود. احتمالا تو تنظیمات اشتباهی رخ داده اگر ممکن است فایل Cube را به اشتراک بگذارید. ( اگر فرکانس باس ها را درست تنظیم کنید نباید مشکلی وجود داشته باشد برای مثال نوت دیتا شیت
          To have an ADC conversion time of 1 µs, APB2 must be at 14 MHz, 28 MHz or 56 MHz
          )
          پیشنهاد ST برای نمونه برداری نرخ بالا interleaved است که همزمان دو ADC است این کار دقت ADC را بالا میبرد و شبیه ADC پایلاین میشود.
          باتشکر از وقتی که گذاشتید
          این فایل کیوب هست

          اینم بگم که حتی تا دوبرابر کلاک مجاز هم اورکلاک کردم ولی باز هم سرعت خیییییییییلی کمه!!!
          در مورد مد اینترلیو هم خب بالاخره اینطوری باید حداقل سرعت در حد 500 کیلو باشه که من الان مجدد برنامه رو تست کردم سرعت در حد صد کیلو سمپله
          ................Fx7SAM................

          دیدگاه


            #6
            پاسخ : حداکثر سرعت ADC در STM32F103

            دقت کنید اول "
            فرکانس میکرو رو بیارید رو 56 و دقت کنید فرکانسی که به ADC میرود 14مگ بشود"
            دوم در قسمت تنظیمات ADC1 در sampling time را 1.5 سیکل قرار دهید ( الان 239.5 سیکل هست!)
            این را چک کنید


            دلیل: ادغام دو پست برای جلوگیری از اسپم

            با تنظیمات شما حدود 47 کیلو سمپل می شود!

            دیدگاه


              #7
              پاسخ : حداکثر سرعت ADC در STM32F103

              نوشته اصلی توسط Faateh نمایش پست ها
              دقت کنید اول "
              فرکانس میکرو رو بیارید رو 56 و دقت کنید فرکانسی که به ADC میرود 14مگ بشود"
              دوم در قسمت تنظیمات ADC1 در sampling time را 1.5 سیکل قرار دهید ( الان 239.5 سیکل هست!)
              این را چک کنید


              دلیل: ادغام دو پست برای جلوگیری از اسپم

              با تنظیمات شما حدود 47 کیلو سمپل می شود!
              با تنظیمات کلاکی که فرمودین هم تست کردم،باز هم اوضاع مثل قبل است
              دلیل اینکه زمان نمونه برداری روی 239 است اینه که با زمان کمتر اصلا برنامه گیر میکنه و چیزی روی السیدی نمیاد!!!!!!!!
              ................Fx7SAM................

              دیدگاه


                #8
                پاسخ : حداکثر سرعت ADC در STM32F103

                عدد درست 1.5 هست، بقیش مشکل از کد هست . نیامدن داده روی LCD ربط داره به درگیر شدن ADC با LCD که به کد شما ربط داره؛

                دیدگاه


                  #9
                  پاسخ : حداکثر سرعت ADC در STM32F103

                  نوشته اصلی توسط Faateh نمایش پست ها
                  عدد درست 1.5 هست، بقیش مشکل از کد هست . نیامدن داده روی LCD ربط داره به درگیر شدن ADC با LCD که به کد شما ربط داره؛
                  دوست عزیز با 1.5 سیکل هم اوضاع همونه و اصلا میکرو وارد حلقه اصلی برنامه نمیشه!!
                  ................Fx7SAM................

                  دیدگاه


                    #10
                    پاسخ : حداکثر سرعت ADC در STM32F103

                    پس اگر میشود بخش هایی از کد مربوط به اینتراپت و خواندن از adc و محاسبه فرکانس رو بزارید

                    دیدگاه


                      #11
                      پاسخ : حداکثر سرعت ADC در STM32F103

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

                      قسمت های اصلی کد در زیر اومده،مابقی قسمت هارو هم که کیوب مینویسه خودش


                      کد:
                      [LEFT][INDENT]char str[17];[/INDENT]
                      [INDENT]int LCD_Refresh=0;[/INDENT]
                      [INDENT]long int i;[/INDENT]
                      [INDENT]uint32_t vv1 , vv2;
                      
                      int main(void){
                      [/INDENT]
                      [INDENT]lcd_init();[/INDENT]
                      [INDENT]  lcd_clear();[/INDENT]
                      [INDENT]
                      [/INDENT]
                      [INDENT]  lcd_gotoxy(0,0);[/INDENT]
                      [INDENT]  lcd_puts("**---Fx7SAM---**");[/INDENT]
                      [INDENT]  HAL_Delay(1000);[/INDENT]
                      [INDENT]  lcd_clear();[/INDENT]
                      [INDENT]  HAL_ADC_Start_DMA(&hadc1,&vv1,1);[/INDENT]
                      [INDENT]  HAL_ADC_Start_DMA(&hadc3,&vv2,1);[/INDENT]
                      
                      [INDENT]
                      while(1){[/INDENT]
                      [INDENT]LCD_Refresh++;[/INDENT]
                      [INDENT]    if(LCD_Refresh>1000){[/INDENT]
                      [INDENT]    sprintf(str,"v1=%0.2f",((float)vv1/4095)*3.3);[/INDENT]
                      [INDENT]    lcd_gotoxy(0,0);[/INDENT]
                      [INDENT]    lcd_puts(str);[/INDENT]
                      [INDENT]    sprintf(str,"v2=%0.2f",((float)vv2/4095)*3.3);[/INDENT]
                      [INDENT]    lcd_gotoxy(0,1);[/INDENT]
                      [INDENT]    lcd_puts(str);[/INDENT]
                      [INDENT]    sprintf(str,"i=%u",i);[/INDENT]
                      [INDENT]    lcd_gotoxy(7,1);[/INDENT]
                      [INDENT]    lcd_puts(str);[/INDENT]
                      [INDENT]    LCD_Refresh=0;}[/INDENT]
                      [INDENT]}}
                      
                      
                       [/INDENT]
                      [/LEFT]



                      در داخل وقفه DMAهم فقط دستور زیر هست


                      i++;

                      که البته حتی با حذف این دستور هم اوضاع فرقی نمیکنه

                      باتشکر
                      جدیدترین ویرایش توسط سیدعلی.م; ۲۳:۲۵ ۱۳۹۷/۰۴/۰۸.
                      ................Fx7SAM................

                      دیدگاه


                        #12
                        پاسخ : حداکثر سرعت ADC در STM32F103

                        وقتی دارید با DMA کار میکنید اصلا یک دونه یکدونه خوب نیست، از این ADC با سرعت زیاد داره داده میاد، برای همین حتما بافر داده بردارید، چون اون موقع عملا DMA کاری نمیکنه و عملا به ازای هر سمپل اینتراپت دارید.
                        [1000]uint32_t vv1[1000] , vv2; و بعد
                        فعلا برای تست کانال ADC3 رو غیر فعال کنید تا وسط تست ظاهر نشود
                        و خط زیر زا اضافه کنید
                        HAL_ADC_Start_DMA(&hadc1,vv1,1000);
                        و خط زیر زا اضافه کنید
                        در وقفه هم i = i+1000; یعنی هر اینتراپت 1000 داده در حال آمدن هست
                        اگر خوب نبود 1000 را بزرگتر کنید

                        * شما به خاطر اینکه دارید با سرعت 1 مگاهرتز اینتراپت دریافت میکنید، عملا CPU از کار افتاده
                        جدیدترین ویرایش توسط Faateh; ۲۳:۳۹ ۱۳۹۷/۰۴/۰۸.

                        دیدگاه


                          #13
                          پاسخ : حداکثر سرعت ADC در STM32F103

                          نوشته اصلی توسط Faateh نمایش پست ها
                          وقتی دارید با DMA کار میکنید اصلا یک دونه یکدونه خوب نیست، از این ADC با سرعت زیاد داره داده میاد، برای همین حتما بافر داده بردارید، چون اون موقع عملا DMA کاری نمیکنه و عملا به ازای هر سمپل اینتراپت دارید.
                          [1000]uint32_t vv1[1000] , vv2; و بعد
                          فعلا برای تست کانال ADC3 رو غیر فعال کنید تا وسط تست ظاهر نشود
                          و خط زیر زا اضافه کنید
                          HAL_ADC_Start_DMA(&hadc1,vv1,1000);
                          و خط زیر زا اضافه کنید
                          در وقفه هم i = i+1000; یعنی هر اینتراپت 1000 داده در حال آمدن هست
                          اگر خوب نبود 1000 را بزرگتر کنید

                          * شما به خاطر اینکه دارید با سرعت 1 مگاهرتز اینتراپت دریافت میکنید، عملا CPU از کار افتاده
                          سر این دستور ارور میده

                          HAL_ADC_Start_DMA(&hadc1,vv1,1000);


                          همچنین با این کار باید در حلقه برنامه از این هزار داده میانگین گیری کنم،درسته؟
                          ................Fx7SAM................

                          دیدگاه


                            #14
                            پاسخ : حداکثر سرعت ADC در STM32F103

                            فعلا از داده


                            vv1[0]

                            به عنوان متغیر استفاده کنید، چه اروری ؟
                            جدیدترین ویرایش توسط Faateh; ۰۰:۰۰ ۱۳۹۷/۰۴/۰۹.

                            دیدگاه


                              #15
                              پاسخ : حداکثر سرعت ADC در STM32F103

                              نوشته اصلی توسط Faateh نمایش پست ها
                              فعلا از


                              vv1[0]


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

                              اون قبلی رو هم میگه
                              argument of type uint_t32(^)[1000] is incompatible with parameter of type uint_t32
                              ................Fx7SAM................

                              دیدگاه

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