فهرست مطالب:
- مرحله 1: مورد استفاده: یکنواخت کردن اندازه گیری های ADC
- مرحله 2: مورد استفاده: اندازه گیری قطعه DC سیگنال میکروفون
- مرحله 3: محاسبه
- مرحله 4: کد
- مرحله 5: موارد اضافی
- مرحله 6: نتیجه گیری
تصویری: میانگین عملکرد پروژه های میکروکنترلر شما: 6 مرحله
2024 نویسنده: John Day | [email protected]. آخرین اصلاح شده: 2024-01-30 08:52
در این مقاله آموزشی من توضیح می دهم که میانگین در حال اجرا چیست و چرا باید به آن اهمیت دهید ، همچنین به شما نشان خواهم داد که چگونه باید برای حداکثر کارایی محاسباتی پیاده سازی شود (نگران پیچیدگی نباشید ، درک آن بسیار ساده است و من یک کتابخانه آسان برای استفاده برای پروژه های آردوینو خود نیز ارائه دهید:)
میانگین در حال اجرا ، که معمولاً به عنوان میانگین متحرک ، میانگین متحرک یا میانگین دویدن نیز نامیده می شود ، اصطلاحی است که برای توصیف مقدار متوسط آخرین مقادیر N در سری داده ها استفاده می شود. می توان آن را به طور متوسط محاسبه کرد یا می توانید از یک ترفند استفاده کنید تا تاثیر آن بر عملکرد کد شما حداقل باشد.
مرحله 1: مورد استفاده: یکنواخت کردن اندازه گیری های ADC
آردوینو دارای ADC مناسب 10 بیتی با سر و صدای بسیار کم است. هنگام اندازه گیری مقدار روی سنسوری مانند پتانسیومتر ، مقاومت در برابر نور یا سایر اجزای سر و صدای زیاد ، نمی توان به صحت اندازه گیری اعتماد کرد.
یک راه حل این است که هر بار که می خواهید سنسور خود را بخوانید اندازه گیری های متعددی انجام دهید و آنها را متوسط کنید. در برخی موارد این یک راه حل مناسب است اما نه همیشه. اگر می خواهید ADC را 1000 بار در ثانیه بخوانید ، اگر به طور متوسط 10 اندازه گیری انجام دهید ، باید 10 000 را بخوانید. اتلاف زیاد زمان محاسبه
راه حل پیشنهادی من این است که 1000 بار در ثانیه اندازه گیری کنید ، هر بار میانگین عملکرد را به روز کنید و از آن به عنوان مقدار فعلی استفاده کنید. این روش تاخیری را ارائه می دهد اما از پیچیدگی محاسباتی برنامه شما می کاهد و زمان بیشتری را برای پردازش بیشتر در اختیار شما قرار می دهد.
در تصویر بالا از میانگین دویدن 32 اندازه گیری اخیر استفاده کردم. خواهید دید که این روش 100٪ ضد خطا نیست اما دقت را به میزان قابل توجهی بهبود می بخشد (بدتر از میانگین 32 نمونه در هر بار نیست). اگر می خواهید هر بار به طور متوسط 32 اندازه گیری را محاسبه کنید ، برای اندازه گیری تنها در Arduino UNO بیش از 0.25 میلی ثانیه طول می کشد!
مرحله 2: مورد استفاده: اندازه گیری قطعه DC سیگنال میکروفون
آردوینو می تواند ولتاژهای بین 0 تا Vcc (معمولاً 5 ولت) را اندازه گیری کند. سیگنال صوتی کاملاً AC است و اگر می خواهید آن را روی میکروکنترلر اندازه گیری کنید ، باید آن را در حدود 1/2 Vcc بایاس کنید. در پروژه Arduino UNO که تقریباً 2.5 ولت (DC) + سیگنال صوتی (AC) را نشان می دهد. هنگام استفاده از منبع تغذیه 10 بیتی ADC و تغذیه 5 ولت ، بایاس 2.5 ولت باید برابر 512 باشد. بنابراین برای بدست آوردن مقدار AC سیگنال ، 512 باید از اندازه گیری ADC کم شود و تمام ، درست است؟
در دنیای ایده آل ، این درست خواهد بود. متأسفانه زندگی واقعی پیچیده تر است و سوگیری سیگنال ما تمایل به حرکت دارد. نویز 50 هرتز (اگر در ایالات متحده زندگی می کنید 60 هرتز) از شبکه برق بسیار رایج است. معمولاً همه چیز مشکل ساز نیست ، اما خوب است بدانید که وجود دارد. مشکل بیشتر رانش خطی از گرم شدن قطعات است. شما در شروع تصحیح DC offset را با دقت تنظیم می کنید و با اجرای برنامه شما به آرامی دور می شود.
من این مشکل را با آشکارساز ضربان (موسیقی) نشان خواهم داد. شما حذف سوگیری خود را تنظیم کرده و ضربان ها واضح هستند (تصویر 2). پس از مدتی ، حرکت بایاس DC و ضربات به سختی برای میکروکنترلر قابل مشاهده است (تصویر 3). الگوریتم تشخیص ضربات در آینده به صورت عمیق مورد بررسی قرار می گیرد زیرا از محدوده این مقاله فراتر می رود.
خوشبختانه راهی برای محاسبه مداوم افست DC صوت وجود دارد. تعجب آور نخواهد بود که میانگین دویدن ، موضوع این دستورالعمل ، راه حلی ارائه دهد.
ما می دانیم که مقدار متوسط هر سیگنال AC 0 است. با استفاده از این دانش می توان مقدار متوسط سیگنال AC+DC را از جهت گیری DC آن کسر کرد. برای حذف آن ، می توانیم میانگین در حال اجرا از چند مقدار گذشته را گرفته و از خواندن ADC فعلی کم کنیم. توجه داشته باشید که باید از میانگین دویدن به اندازه کافی طولانی استفاده کنید. برای صدا ، یک دهم ثانیه (تعداد نمونه ها بستگی به میزان نمونه شما دارد) کافی است اما بدانید که میانگین های طولانی تر بهتر کار می کنند. در تصویر اول می توانید نمونه ای از محاسبه بایاس DC واقعی با میانگین عملکرد با 64 عنصر در نرخ نمونه 1 کیلوهرتز را مشاهده کنید (کمتر از آنچه من توصیه کردم اما همچنان کار می کند).
مرحله 3: محاسبه
می توانید متوسط دویدن را به عنوان میانگین وزن افراد در اتاق انتظار پزشک تصور کنید. پزشک معاینه یک بیمار را به پایان می رساند و همزمان یک بیمار جدید وارد اتاق انتظار می شود.
برای اطلاع از وزن متوسط همه بیماران منتظر در اتاق انتظار ، پرستار می تواند از هر بیمار در مورد وزن آنها بپرسد ، این اعداد را جمع کرده و بر تعداد بیماران تقسیم کند. هر بار که پزشک بیمار جدیدی می پذیرفت ، پرستار کل مراحل را تکرار می کرد.
ممکن است به این فکر کنید: "این خیلی کارآمد به نظر نمی رسد … باید راه بهتری برای این کار وجود داشته باشد." و حق با شماست
برای بهینه سازی این فرایند ، پرستار می تواند رکورد وزن کل گروه فعلی بیماران را ثبت کند. هنگامی که پزشک بیمار جدید را فرا می خواند ، پرستار از او در مورد وزن خود می پرسد و از مجموع گروه کم می کند و او را رها می کند. سپس پرستار از بیمارانی که تازه وارد اتاق انتظار شدند وزن خود را می پرسد و آن را به کل اضافه می کند. میانگین وزن بیماران پس از هر نوبت ، مجموع وزنها بر تعداد بیماران تقسیم می شود (بله ، مانند قبل اما در حال حاضر پرستار به جای همه آنها از دو نفر در مورد وزن آنها پرسید). متوجه هستم که این پاراگراف ممکن است کمی گیج کننده باشد بنابراین لطفاً برای وضوح بیشتر به تصویر بالا مراجعه کنید (یا سوالات خود را در نظرات مطرح کنید).
اما حتی اگر پاراگراف آخر را گیج کننده نمی دانید ، ممکن است س questionsالاتی از قبیل آنچه در ابتدا باید در انباشته باشد وجود داشته باشد ، چگونه می توانم آنچه را که تازه خوانده ام در یک کد C واقعی قرار دهم؟ در مرحله بعد ، که در آن شما همچنین کد منبع من را دریافت خواهید کرد.
مرحله 4: کد
برای محاسبه میانگین در حال اجرا ، ابتدا به راهی برای ذخیره آخرین مقادیر N نیاز دارید. شما می توانید یک آرایه با عناصر N داشته باشید و هر بار که یک عنصر را اضافه می کنید کل محتوا را یک جا منتقل کنید (لطفاً این کار را نکنید) ، یا می توانید یک عنصر قدیمی را بازنویسی کرده و اشاره گر را به عنصر بعدی تنظیم کنید تا بیرون بیاید (لطفا این کار را انجام دهید:)
انباشت کننده باید مقداردهی اولیه آن 0 باشد ، در مورد همه عناصر خط تأخیر نیز همینطور است. در موارد دیگر ، میانگین دویدن شما همیشه اشتباه خواهد بود. خواهید دید که delayLine_init مراقب مقداردهی اولیه خط تأخیر است ، شما باید خودتان از انباشته کننده مراقبت کنید.
افزودن یک عنصر به خط تأخیر به آسانی می تواند شاخص جدیدترین عنصر را به میزان 1 کاهش دهد ، اطمینان حاصل کنید که طرف خط آرایه تأخیر را مشخص نمی کند. پس از کاهش شاخص هنگامی که 0 است ، به 255 حلقه می زند (زیرا یک عدد صحیح بدون علامت 8 بیتی است). عملگر Modulo (٪) با اندازه آرایه خط تأخیر اطمینان می دهد که شاخص به یک عنصر معتبر اشاره می کند.
اگر از قیاس من در مرحله قبل پیروی کرده اید ، محاسبه میانگین در حال اجرا آسان است. قدیمی ترین عنصر را از جمع کننده کم کنید ، جدیدترین مقدار را به باتری اضافه کنید ، جدیدترین مقدار را به خط تأخیر وارد کنید ، تجمع دهنده را بر تعداد عناصر تقسیم کنید.
آسان ، درست است؟
لطفاً با استفاده از کد پیوست آزمایش کنید تا نحوه عملکرد همه اینها را بهتر درک کنید. همانطور که در حال حاضر وجود دارد ، arduino مقدار آنالوگ را روی پین آنالوگ A0 می خواند و "[مقدار ADC] ، [میانگین در حال اجرا]" را روی پورت سریال با سرعت 115200 باد چاپ می کند. اگر پلاتر سریال arduino را بر روی نرخ baud صحیح باز کنید ، دو خط را مشاهده خواهید کرد: مقدار ADC (آبی) و مقدار صاف (قرمز).
مرحله 5: موارد اضافی
چند نکته وجود دارد که لزوماً نیازی به دانستن آنها برای استفاده از میانگین در حال اجرا در پروژه خود ندارید.
تأخیر: من با صحبت در مورد تصویرسازی این مرحله شروع می کنم. متوجه خواهید شد که اجرای میانگین عناصر بیشتر تأخیر بیشتری را ایجاد می کند. اگر زمان پاسخ شما برای تغییر ارزش بسیار مهم است ، ممکن است بخواهید از میانگین کوتاهتر استفاده کنید یا نرخ نمونه را افزایش دهید (بیشتر اندازه گیری کنید).
ادامه دادن.
مقداردهی اولیه: هنگامی که من در مورد راه اندازی عناصر جمع کننده و تأخیر صحبت کردم ، گفتم باید همه آنها را 0 تنظیم کنید. متناوباً می توانید خط تأخیر را برای هر چیزی که دوست دارید مقداردهی کنید ، اما انباشت کننده باید به عنوان مجموع جدیدترین عناصر N در خط تأخیر شروع شود (جایی که N تعداد عناصر در میانگین در حال اجرا است). اگر انباشت کننده با هر مقدار دیگر شروع به کار کند ، میانگین محاسبه شده اشتباه خواهد بود - یا خیلی کم یا خیلی زیاد ، همیشه با همان مقدار (با فرض شرایط اولیه یکسان). پیشنهاد می کنم با استفاده از "شبیه سازی قلم و کاغذ" علت این امر را بیاموزید.
اندازه انباشت کننده: همچنین باید توجه داشته باشید که انباشت کننده باید به اندازه کافی بزرگ باشد تا بتواند مجموع همه عناصر را در خط تاخیر ذخیره کند ، اگر همه آنها حداکثر یا منفی باشند. عملاً این بدان معناست که جمع کننده باید یک نوع داده بزرگتر از عناصر خط تأخیر باشد و در صورت امضای عناصر خط تأخیر ، امضا شود.
ترفند: خطوط تاخیری طولانی حافظه زیادی را اشغال می کند. این می تواند به سرعت به یک مشکل تبدیل شود. اگر از نظر حافظه بسیار محدود هستید و به دقت دقت زیادی ندارید ، می توانید میانگین دویدن را با حذف کامل تاخیر و انجام این کار به طور تقریبی تخمین بزنید: باتری 1/N * را از باتری کم کنید و مقدار جدیدی اضافه کنید (به عنوان مثال 8 میانگین طولانی مدت: انباشته کننده = انباشته * 7/8 + newValue). این روش نتایج غلطی را ارائه می دهد ، اما روش مناسبی برای محاسبه میانگین دوندگی در هنگام کمبود حافظه است.
زبان شناسی: "میانگین در حال اجرا/میانگین" معمولاً هنگام اشاره به میانگین زمان واقعی استفاده می شود در حالی که "میانگین متحرک/میانگین" معمولاً به این معنی است که الگوریتم بر روی مجموعه داده های ایستا مانند صفحه گسترده Excel اجرا می شود.
مرحله 6: نتیجه گیری
امیدوارم درک این دستورالعمل به اندازه کافی آسان بوده باشد و در پروژه های آینده شما به شما کمک کند. لطفاً در صورت وجود موارد مبهم ، سوالات خود را در نظرات زیر ارسال کنید.
توصیه شده:
LED های رنگین کمان برای پروژه های شما: 4 مرحله (همراه با تصاویر)
LED های رنگین کمان برای پروژه های شما: سلام به همه! من از این LED ها برای بسیاری از پروژه های تزئینی استفاده می کنم و نتیجه همیشه شگفت انگیز است ، بنابراین می خواهم تجربیات خود را با شما به اشتراک بگذارم ، دیدم بسیاری از مردم کنترلرهای نوار LED RGB را خریداری کرده و از 3 یا 5 استفاده می کنند تغییر حالت حالت فقط به
پیکربندی بیت های فیوز میکروکنترلر AVR. ایجاد و بارگذاری در فلش مموری میکروکنترلر برنامه چشمک زن LED: 5 مرحله
پیکربندی بیت های فیوز میکروکنترلر AVR. ایجاد و بارگذاری در فلش مموری میکروکنترلر برنامه چشمک زن LED: در این حالت ما یک برنامه ساده در کد C ایجاد کرده و آن را در حافظه میکروکنترلر می سوزانیم. ما برنامه خود را می نویسیم و فایل hex را با استفاده از Atmel Studio به عنوان پلت فرم توسعه یکپارچه کامپایل می کنیم. ما fuse bi را پیکربندی می کنیم
دارنده باتری چریکی برای پروژه های Breadboard / Arduino شما: 3 مرحله
دارنده باتری چریکی برای پروژه های Breadboard / Arduino شما: من با DS1307 و Arduino آزمایش می کنم ، باید راهی برای اتصال باتری CR1212 پیدا کنم. به جعبه اتصالاتم سر زدم و چیزی پیدا نکردم که بتواند کمک کند. سپس ، eur & ecirc؛ ka! من یک روشنایی داشتم
پروژه های قدرت از رایانه شما: 5 مرحله
پروژه های قدرتمند از رایانه شما: می توانید برخی از قسمتهایی را که احتمالاً در آن قرار گرفته اید کابل کنید که به شما امکان می دهد پروژه های الکترونیکی را از طریق کامپیوتر تغذیه کنید. من در ابتدا این مقاله را در وب سایت خود در uC Hobby انجام دادم ، اما فکر کردم که آن را امتحان می کنم به عنوان اولین دستورالعمل من خبرم کن
لیست ** کارخانه رایگان ** برای پروژه های شما: 8 مرحله
لیست ** STUFF رایگان ** برای پروژه های شما: این لیستی از مکانهایی است که می توانید از آنها چیزهای رایگان دریافت کنید ، می توانید از آنها در پروژه های خود استفاده کنید … رایگان است و اقلام رایگان ارسال می شود بنابراین بله امیدوارم دوست داشته باشید لیست! خوب ، بنابراین من این محصول را بر اساس نوع محصول سازماندهی کردم. اگر سایتی دارید به من پیام دهید