تقریباً هیچ سنسوری در دنیای واقعی دادهای کاملاً دقیق و بدون خطا تولید نمیکند. سیگنالهای اندازهگیری شده همواره تحت تأثیر نویزهای الکتریکی، مکانیکی، محیطی و خطاهای اندازهگیری قرار دارند. اگر این نویزها حذف یا کاهش داده نشوند، سیستم کنترل ممکن است تصمیمهای اشتباه بگیرد و عملکرد دستگاه با افت کیفیت، نوسان یا حتی خرابی مواجه شود.
در محیطهای صنعتی منابع مختلفی باعث ایجاد نویز میشوند؛ از جمله اینورترها، موتورهای الکتریکی، تجهیزات جوشکاری، میدانهای الکترومغناطیسی، کابلهای طولانی، لرزش مکانیکی و حتی خطای مبدلهای آنالوگ به دیجیتال (ADC). بنابراین استفاده از فیلترهای مناسب یکی از مهمترین بخشهای طراحی Firmware و سیستمهای کنترل صنعتی محسوب میشود.
فرض کنید سرعت یک موتور توسط انکودر اندازهگیری میشود. اگر مقدار اندازهگیری شده مستقیماً وارد کنترلکننده PID شود، نویز موجود باعث تغییرات مداوم خروجی کنترلر خواهد شد. نتیجه این وضعیت، لرزش موتور، افزایش استهلاک تجهیزات و کاهش دقت سیستم است.
به همین دلیل تقریباً در تمام سیستمهای صنعتی، قبل از استفاده از دادههای سنسورها، از یک یا چند فیلتر دیجیتال استفاده میشود. انتخاب نوع فیلتر به سرعت پاسخ موردنیاز، دقت، توان پردازشی کنترلر و نوع نویز بستگی دارد.
فیلتر پایینگذر یا Low Pass Filter یکی از پرکاربردترین فیلترهای دیجیتال در سیستمهای Embedded و اتوماسیون صنعتی است. وظیفه این فیلتر عبور دادن سیگنالهای با فرکانس پایین و حذف نویزهای با فرکانس بالا است.
به بیان ساده، این فیلتر تغییرات سریع و ناگهانی را حذف کرده و تنها روند اصلی سیگنال را حفظ میکند. به همین دلیل تقریباً در تمام Firmwareهای صنعتی، PLCها، CNCها و سیستمهای کنترلی از آن استفاده میشود.
در هر نمونهبرداری، مقدار جدید سیگنال با مقدار قبلی ترکیب میشود. به این ترتیب تغییرات ناگهانی حذف شده و خروجی نرمتر خواهد شد.
رابطه ریاضی فیلتر پایینگذر به صورت زیر است:
Filtered = α × Input + (1 − α) × Previous
در این رابطه ضریب α عددی بین صفر و یک است.
float alpha = 0.15;
filtered = alpha * sensorValue
+ (1-alpha) * filtered;
این کد روی Arduino، STM32، ESP32 و تقریباً تمام میکروکنترلرها قابل استفاده است.
برخلاف Low Pass، فیلتر High Pass تغییرات سریع را عبور داده و تغییرات آهسته را حذف میکند.
این فیلتر بیشتر برای تشخیص تغییرات ناگهانی، ضربه، لرزش و ارتعاش استفاده میشود.
فیلتر Band Pass تنها یک بازه مشخص از فرکانسها را عبور میدهد و سایر فرکانسها را حذف میکند.
این فیلتر در سیستمهای اندازهگیری، تجهیزات پزشکی، مخابرات، پردازش صوت و همچنین تحلیل ارتعاش ماشینآلات کاربرد فراوانی دارد.
گاهی تنها یک فرکانس خاص باعث ایجاد مشکل میشود. برای مثال نویز 50Hz یا 60Hz ناشی از شبکه برق.
در این شرایط بهترین گزینه استفاده از فیلتر Notch است که تنها همان فرکانس مزاحم را حذف کرده و سایر اطلاعات سیگنال را حفظ میکند.
یکی از سادهترین و پرکاربردترین فیلترهای دیجیتال، فیلتر میانگین متحرک یا Moving Average است. در این روش، به جای استفاده از آخرین مقدار اندازهگیری شده، میانگین چند نمونه اخیر محاسبه میشود. این کار باعث کاهش نویزهای تصادفی و افزایش پایداری سیگنال خواهد شد.
هرچه تعداد نمونههای مورد استفاده بیشتر باشد، خروجی نرمتر خواهد شد؛ اما در مقابل سرعت پاسخ سیستم کاهش مییابد.
Output = (X1 + X2 + X3 + ... + Xn) / n
const int N = 10; float buffer[N]; float sum = 0; int index = 0; sum -= buffer[index]; buffer[index] = sensor; sum += sensor; index++; if(index>=N) index=0; filtered = sum / N;
این روش برای حذف نویزهای تصادفی بسیار مناسب است اما در سیگنالهایی که تغییرات سریع دارند باعث ایجاد تأخیر خواهد شد.
در فیلتر میانگین وزنی، تمامی نمونهها وزن یکسان ندارند. نمونههای جدید اهمیت بیشتری نسبت به دادههای قدیمی خواهند داشت و به همین دلیل خروجی سریعتر به تغییرات پاسخ میدهد.
به عنوان مثال میتوان وزنهای زیر را در نظر گرفت:
40% 30% 20% 10%
در این حالت آخرین اندازهگیری بیشترین تأثیر را در خروجی خواهد داشت.
EMA یکی از محبوبترین فیلترهای Firmware است زیرا علاوه بر حذف نویز، حافظه بسیار کمی نیاز دارد و تنها از آخرین مقدار خروجی استفاده میکند.
در بسیاری از پروژههای STM32، ESP32 و Arduino از همین فیلتر به عنوان Low Pass Filter نیز استفاده میشود.
Filtered = α × Input + (1-α) × Previous
در واقع همان رابطهای است که در بخش Low Pass مشاهده شد.
یکی از مشکلات رایج در سنسورها، ایجاد نویزهای لحظهای یا Spike است. این نویزها ممکن است تنها در یک نمونه ظاهر شوند اما مقدار بسیار بزرگی داشته باشند.
در چنین شرایطی استفاده از Moving Average چندان مناسب نیست زیرا مقدار غیرعادی وارد میانگین خواهد شد.
Median Filter با مرتبسازی نمونهها، مقدار میانی را به عنوان خروجی انتخاب میکند.
20 21 20 22 350 20 21 19 20
میانگین این دادهها به شدت تحت تأثیر عدد 350 قرار میگیرد، اما مقدار Median برابر 20 خواهد بود که بسیار نزدیکتر به مقدار واقعی است.
انتخاب فیلتر مناسب به نوع سیگنال، سرعت پاسخ موردنیاز، توان پردازشی کنترلر و نوع نویز بستگی دارد. برای مثال، سنسور دما معمولاً با یک فیلتر Low Pass یا Moving Average عملکرد مناسبی دارد، در حالی که دادههای IMU یا GPS در رباتها و پهپادها اغلب به فیلتر کالمن نیاز دارند. در بخش بعدی، با فیلتر کالمن و نحوه عملکرد آن آشنا میشویم و تفاوت آن را با سایر فیلترهای دیجیتال بررسی خواهیم کرد.
فیلتر کالمن (Kalman Filter) یکی از قدرتمندترین الگوریتمهای تخمین حالت (State Estimation) در مهندسی کنترل، رباتیک، هوافضا و سیستمهای Embedded است. این الگوریتم در سال 1960 توسط رودلف کالمن (Rudolf E. Kalman) معرفی شد و امروزه در هزاران سیستم صنعتی مورد استفاده قرار میگیرد.
برخلاف فیلترهای ساده مانند Low Pass یا Moving Average که تنها نویز را کاهش میدهند، فیلتر کالمن علاوه بر حذف نویز، مقدار واقعی متغیر را نیز تخمین میزند. به همین دلیل در بسیاری از کاربردها حتی اگر دادههای سنسورها دارای خطا باشند، خروجی فیلتر به مقدار واقعی بسیار نزدیک خواهد بود.
فرض کنید سرعت یک موتور توسط انکودر اندازهگیری میشود. مقدار واقعی سرعت برابر 1000 دور بر دقیقه است، اما اندازهگیریها به صورت زیر ثبت میشوند:
998 1005 1002 995 1008 997 1001
استفاده از دادههای خام باعث نوسان کنترلکننده خواهد شد. در حالی که فیلتر کالمن با ترکیب مدل ریاضی سیستم و دادههای اندازهگیری، مقدار واقعی را تخمین میزند.
در هر سیکل اجرای برنامه، فیلتر کالمن دو مرحله اصلی را انجام میدهد.
در این مرحله، با استفاده از مدل ریاضی سیستم، مقدار بعدی پیشبینی میشود.
Current State ↓ System Model ↓ Predicted State
اگر هیچ اندازهگیری جدیدی وجود نداشته باشد، سیستم تنها بر اساس مدل خود به کار ادامه میدهد.
پس از دریافت داده جدید از سنسور، مقدار پیشبینی شده با مقدار اندازهگیری شده مقایسه میشود و بهترین تخمین محاسبه خواهد شد.
Prediction + Sensor Measurement ↓ Kalman Gain ↓ Corrected State
یکی از مهمترین پارامترهای این الگوریتم، Kalman Gain است. این ضریب مشخص میکند که سیستم تا چه اندازه به مدل ریاضی یا به اندازهگیری سنسور اعتماد کند.
در تجهیزات صنعتی، معمولاً دادههای اندازهگیری دارای نویز هستند و مستقیماً قابل استفاده نیستند. فیلتر کالمن در بسیاری از این کاربردها استفاده میشود:
float estimate = 0;
float errorEstimate = 1;
float errorMeasure = 2;
float q = 0.01;
float measurement;
float kalmanGain;
errorEstimate += q;
kalmanGain = errorEstimate /
(errorEstimate + errorMeasure);
estimate = estimate +
kalmanGain *
(measurement - estimate);
errorEstimate =
(1-kalmanGain) *
errorEstimate;
این نمونه، یک پیادهسازی ساده از Kalman Filter تکبعدی است و برای سنسورهایی مانند دما، فشار، فاصله و سرعت مناسب است. در پروژههای پیچیدهتر مانند ناوبری رباتها یا پهپادها معمولاً از نسخههای توسعهیافته این الگوریتم استفاده میشود.
در بسیاری از سیستمهای واقعی، مدل ریاضی خطی نیست. برای مثال در رباتهای متحرک، پهپادها یا سیستمهای GPS، روابط بین متغیرها غیرخطی هستند. در این شرایط از Extended Kalman Filter یا EKF استفاده میشود.
EKF ابتدا مدل غیرخطی را در اطراف نقطه کاری خطیسازی کرده و سپس مراحل پیشبینی و تصحیح را مشابه Kalman Filter انجام میدهد.
در پروژههایی که توان پردازشی میکروکنترلر محدود است، استفاده از Complementary Filter انتخاب مناسبی خواهد بود. این فیلتر معمولاً دادههای ژیروسکوپ و شتابسنج را با یکدیگر ترکیب میکند و نسبت به Kalman Filter بسیار سادهتر است.
| فیلتر | سرعت اجرا | دقت | مصرف پردازنده | کاربرد |
|---|---|---|---|---|
| Low Pass | ★★★★★ | ★★★☆☆ | بسیار کم | دما، فشار، جریان |
| Moving Average | ★★★★☆ | ★★★★☆ | کم | لودسل، وزن، سطح |
| Median | ★★★☆☆ | ★★★★★ | متوسط | اولتراسونیک، لیزر |
| Kalman | ★★★☆☆ | ★★★★★ | زیاد | GPS، IMU، Servo |
| Complementary | ★★★★★ | ★★★★☆ | بسیار کم | پهپاد، ربات |
تقریباً تمام تجهیزات اتوماسیون صنعتی، ماشینآلات CNC، خطوط تولید، سیستمهای رباتیک و تجهیزات اندازهگیری از یک یا چند نوع فیلتر دیجیتال استفاده میکنند. انتخاب صحیح فیلتر علاوه بر افزایش دقت اندازهگیری، موجب افزایش پایداری سیستم کنترل و کاهش استهلاک تجهیزات نیز میشود.
در بیشتر کاربردهای صنعتی، فیلتر Low Pass یا Moving Average انتخاب مناسبی است زیرا تغییرات دما معمولاً آهسته بوده و نیازی به الگوریتمهای پیچیده وجود ندارد.
خیر. اگرچه Kalman Filter دقت بالایی دارد، اما پیادهسازی آن پیچیدهتر است و به توان پردازشی بیشتری نیاز دارد. برای بسیاری از کاربردهای ساده، فیلترهای Low Pass یا Moving Average عملکرد کاملاً مناسبی دارند.
بله. نسخههای ساده Kalman Filter روی Arduino Uno و Nano نیز قابل اجرا هستند، اما برای الگوریتمهای پیشرفته مانند EKF یا UKF بهتر است از میکروکنترلرهای قدرتمندتری مانند STM32 یا ESP32 استفاده شود.
زمانی که دادههای سنسور دارای نویزهای لحظهای یا مقادیر غیرعادی (Outlier) باشند، Median Filter یکی از بهترین گزینهها است.
در کنترل محورهای CNC معمولاً ترکیبی از فیلترهای Low Pass، Kalman Filter و الگوریتمهای کنترلی Servo برای افزایش دقت و کاهش ارتعاش استفاده میشود.