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