فشار، وزن و جریان

آموزش ACS712 با ESP32 و آردوینو؛ اندازه‌گیری جریان DC و کاهش نویز

اندازه‌گیری جریان DC با ماژول ACS712 پنج‌آمپر، کالیبراسیون صفر، تقسیم ولتاژ خروجی برای ESP32، کاهش نویز و لینک خرید دقیق ایران.

فهرست مطالب

آزمایشگاه سنسورها • ۳۰ شهریور ۱۴۰۵

چرا ACS712 در بی‌باری هم جریان نشان می‌دهد؟

در این پروژه، جریان DC یک بار کوچک را با ماژول ۵ آمپر ACS712، برد ESP32 کلاسیک یا Arduino Uno R3 و یک منبع آزمایشگاهیِ محدودکنندهٔ جریان می‌خوانیم. از خروجی خام شروع می‌کنیم، نقطهٔ صفر را بدون جریان ثبت می‌کنیم و سپس نویز و خطای ADC را از هم جدا می‌کنیم.

این آموزش صرفاً برای مدار کم‌ولتاژِ آزمایشگاهی است: نه برق شهر، نه باتری پرانرژی و نه حفاظت اضافه‌جریان. هیچ آزمایش فیزیکی روی قطعه انجام نشده است.

عکس واقعی برد قرمز اسپارک‌فان با تراشهٔ مشکی ACS712-05B و چهار پد VCC، VOUT، FILT و GND
عکس برد نمونهٔ ACS712-05B، © SparkFun / Wikimedia Commons، CC BY 2.0. تغییر: کوچک‌سازی متناسب، حاشیه و WebP. این برد قرمز، ماژول پیچ‌دار فروشگاه‌های زیر نیست؛ پیش از سیم‌کشی برچسب‌های محصول خود را بخوانید.

۱. هدف و کاربرد واقعی پروژه

برای پایش آزمایشی جریان یک موتور DC کوچک یا بار مقاومتی روی میز کار، ACS712 ولتاژی متناسب با جریان عبوری از مسیر هادی تولید می‌کند. نتیجهٔ این مثال تنها یک برآورد DC روی سریال مانیتور است. این اندازه‌گیری با یک بار ۱۲ ولت یا کمتر و سقف جریان ۱ آمپرِ تنظیم‌شده در منبع آزمایشگاهی انجام می‌شود؛ این سقفِ آزمایش ماست، نه مشخصات نامی سنسور.

پیش‌زمینهٔ اندازه‌گیری را در دورهٔ سنسورها در ۷ قدم و موضوعات مرتبط را در هاب فشار، وزن و جریان ببینید.

۲. خواندن دیتاشیت: x05B با ۲۰ و ۳۰ آمپر فرق دارد

در دیتاشیت رسمی Allegro برای گرید x05B، محدودهٔ بهینهٔ اندازه‌گیری از منفی ۵ تا مثبت ۵ آمپر و حساسیت نمونه‌وار در ۵ ولت، ۱۸۵ میلی‌ولت بر آمپر است. گریدهای x20A و x30A حساسیت متفاوت دارند؛ عدد ۱۸۵ را برای آن‌ها استفاده نکنید. تغذیهٔ تراشه ۴٫۵ تا ۵٫۵ ولت است؛ در این مثال ۵ ولت تنظیم‌شده به ماژول می‌دهیم.

در صفر آمپر، خروجی تقریباً نصف VCC است، یعنی در تغذیهٔ اسمی ۵ ولت حدود ۲٫۵ ولت. دیتاشیت تراشه، مشخصات چاپ، ترمینال و فاصله‌های ایمنی هر ماژول متفرقهٔ آماده را تضمین نمی‌کند. حتی اگر تراشه عدد ایزولاسیون دارد، از آن برای اتصال این بردها به برق شهر نتیجه نگیرید.

۳. از ولتاژ تا آمپر

برای گرید ۵ آمپر در ۵ ولت، رابطهٔ نمونه‌وار I ≈ (Vout - Vzero) / 0.185 است؛ ولتاژها بر حسب ولت‌اند. اما Vzero را از دادهٔ واقعیِ همان ماژول و همان تغذیه، در حالت بدون جریان، به دست می‌آوریم. مثال محاسباتی، نه آزمایش ما: اگر Vzero برابر ۲٫۵۰۰ ولت و Vout برابر ۲٫۶۸۵ ولت باشد، جریان حدود ۱ آمپر می‌شود.

خروجی تراشه با تغذیه تغییر می‌کند؛ در ESP32 ولتاژ ۵ ولت سنسور را زیر بار معمول با مولتی‌متر اندازه بگیرید و در کد وارد کنید. این رابطه یک نقطهٔ شروع آموزشی است؛ دقت نهایی را فقط با آمپرمتر مرجع در چند جریان مشخص می‌توان سنجید.

۴. قطعات و ابزار

  • ماژول ACS712 نسخهٔ ۵ آمپر، نه آی‌سی خام یا ماژول ۲۰/۳۰ آمپر.
  • ESP32 کلاسیک یا Uno R3، کابل USB، منبع DC آزمایشگاهی با محدودکنندهٔ جریان و بار کم‌ولتاژ.
  • مولتی‌متر برای کنترل ۵ ولت، خروجی سنسور و ورودی ADC؛ آمپرمتر مرجع برای مقایسه.
  • برای ESP32 دو مقاومت ۱۰ کیلو و ۱۵ کیلو اهم، و خازن ۱۰۰ نانوفاراد در سمت ورودی ADC.

نام‌گذاری ترمینال‌های بار در بردهای آماده یکسان نیست. راه‌اندازی را از چاپ روی همان برد و مسیر هادی آن آغاز کنید؛ عکس مقاله نقشهٔ سیم‌بندی محصول خریداری‌شده نیست.

۵. سیم‌کشی کم‌ولتاژ و محدودسازی خروجی برای ESP32

ماژول را خاموش و بدون بار سیم‌کشی کنید. VCC آن به ۵ ولت تنظیم‌شده و GND به زمین مشترک وصل می‌شود. مسیر جریانِ بار باید به‌صورت سری از ترمینال‌های جریان همان برد بگذرد. ابتدا با مولتی‌متر بررسی کنید VOUT در بی‌باری نزدیک نصف تغذیه است؛ بدون این بررسی، خروجی ۵ ولتی را مستقیم به ESP32 نزنید.

اتصالESP32 کلاسیکUno R3نکته
VCC ماژول۵ ولت تنظیم‌شدهبا مولتی‌متر زیر بار معمول کنترل کنید
GND ماژولزمین مشترکمسیر سیگنال و توان را اشتباه نگیرید
VOUT ماژول۱۰ kΩ سری تا GPIO34؛ ۱۵ kΩ از GPIO34 به GNDمستقیم به A0پیش از اتصال ولتاژ را اندازه بگیرید
خازن ۱۰۰ nFGPIO34 به GND، نزدیک برددر این نمونه لازم نیستاین خازن در سمت ADC است، نه پایهٔ FILTER تراشه
مسیر بارسری در مدار DC حفاظت‌شدهبرچسب‌های ترمینال محصول را بررسی کنید

تقسیم ۱۰k/۱۵k ولتاژ خروجی را به ۰٫۶ برابر می‌رساند؛ برای خروجی معمول x05B در محدودهٔ اسمی، ورودی ESP32 از بازهٔ ADC انتخاب‌شده خارج نمی‌شود. این شبکه حفاظت در برابر خطای سیم‌بندی یا اتصال ولتاژهای ناشناخته نیست. قبل از هر تغییر سیم، منبع بار و USB را قطع کنید.

۶. چرا مقدار خام ESP32 را مستقیم به ولتاژ تبدیل نکنیم؟

مستندات Espressif میان analogRead خام و analogReadMilliVolts کالیبره‌شده تفاوت می‌گذارد. برای ESP32 کلاسیک، تنظیم ADC_11db بازهٔ مستند حدود ۱۵۰ تا ۳۱۰۰ میلی‌ولت دارد. برنامه همین تنظیم را روی GPIO34 استفاده می‌کند؛ ADC مدل‌های S3 یا C3 الزاماً همین رفتار و پین را ندارند.

در Uno با مرجع پیش‌فرض و تغذیهٔ مشترک ۵ ولت برای سنسور، بخش زیادی از تغییر تغذیه به‌صورت نسبتی در خواندن ADC خنثی می‌شود. همچنان صفرکردن و مقایسه با آمپرمتر لازم است. عددِ چند اعشار روی سریال به معنی دقت واقعی چند اعشار نیست.

۷. کد اندازه‌گیری DC و کالیبراسیون صفر

در لحظهٔ روشن‌شدن، جریانِ مسیر سنسور باید واقعاً صفر باشد. برنامه پس از سه ثانیه، ۳۲ نمونه را میانگین می‌گیرد و آن را نقطهٔ صفر قرار می‌دهد. برای ESP32، ابتدا مقدار SENSOR_SUPPLY_MV را از صفر به مقدار اندازه‌گیری‌شدهٔ تغذیه بر حسب میلی‌ولت تغییر دهید؛ صفر عمداً خروجی آمپر را غیرفعال می‌کند. از بستهٔ دو کد و راهنمای سیم‌کشی استفاده کنید؛ نرخ سریال ۱۱۵۲۰۰ است.

#include <Arduino.h>
#include "acs712_math.h"

#if defined(ARDUINO_ARCH_ESP32) && defined(CONFIG_IDF_TARGET_ESP32)
constexpr uint8_t SENSOR_PIN = 34; // Classic ESP32 ADC1.
// Measure the actual sensor supply with a meter under normal load, then set mV.
constexpr float SENSOR_SUPPLY_MV = 0.0f; // 0 deliberately disables current output.
#elif defined(ARDUINO_AVR_UNO)
constexpr uint8_t SENSOR_PIN = A0;
#else
#error "Use classic ESP32 or Arduino Uno R3; other ADCs need a fresh design."
#endif

constexpr int SAMPLE_COUNT = 32;
int32_t zeroReading = 0;
uint32_t lastReport = 0;

int32_t averagedInput() {
  uint32_t total = 0;
  for (int i = 0; i < SAMPLE_COUNT; ++i) {
#if defined(ARDUINO_ARCH_ESP32)
    total += analogReadMilliVolts(SENSOR_PIN);
#else
    total += analogRead(SENSOR_PIN);
#endif
    delay(4);
  }
  return (total + SAMPLE_COUNT / 2) / SAMPLE_COUNT;
}

void setup() {
  Serial.begin(115200);
#if defined(ARDUINO_ARCH_ESP32)
  analogReadResolution(12);
  analogSetPinAttenuation(SENSOR_PIN, ADC_11db);
#else
  analogReference(DEFAULT); // Uno ADC reference and sensor VCC must share 5 V.
#endif
  Serial.println(F("Remove primary current first; zero calibration starts in 3 s."));
  delay(3000);
  zeroReading = averagedInput();
  Serial.print(F("zero_ADC=")); Serial.println(zeroReading);
  Serial.println(F("DC low-voltage educational measurement only; no mains or protection use."));
}

void loop() {
  if (millis() - lastReport < 250) return;
  lastReport = millis();
  const int32_t reading = averagedInput();
  float amps;
#if defined(ARDUINO_ARCH_ESP32)
  if (SENSOR_SUPPLY_MV == 0.0f) {
    Serial.println(F("CONFIG_REQUIRED: measure 5 V sensor supply and set SENSOR_SUPPLY_MV."));
    return;
  }
  amps = currentFromAdcMv(reading, zeroReading, SENSOR_SUPPLY_MV);
  Serial.print(F("ADC_mV=")); Serial.print(reading);
#else
  // Both ACS712 output and Uno DEFAULT ADC reference track the same 5 V rail.
  // At nominal 5 V, x05B slope is 185 mV/A; ADC is 10-bit, 1024 levels.
  amps = (reading - zeroReading) * (5.0f / (1024.0f * 0.185f));
  Serial.print(F("raw=")); Serial.print(reading);
#endif
  if (!isfinite(amps)) {
    Serial.println(F(" supply/configuration invalid"));
    return;
  }
  Serial.print(F(" DC_A_approx=")); Serial.println(amps, 3);
}

نمونهٔ RAW جداگانه دادهٔ خام را نشان می‌دهد تا مشکل سیم‌بندی را از تبدیل ولتاژ به جریان جدا کنید. در ESP32 عدد خام و میلی‌ولتِ آن از دو تبدیل جدا می‌آیند. خروجی کد برای DC تقریبی است؛ RMS جریان AC یا توان را محاسبه نمی‌کند.

۸. آزمایش گام‌به‌گام با مرجع

  1. ابتدا مدل ۵ آمپر روی برد و مسیر دو ترمینال جریان را شناسایی کنید. با برق قطع‌شده، اتصال سری بار را ببندید.
  2. منبع آزمایشگاهی را روی ولتاژ DC موردنیاز بار، حداکثر ۱۲ ولت، و محدودیت جریان حداکثر ۱ آمپر تنظیم کنید.
  3. در بی‌باری، VCC و VOUT را با مولتی‌متر بسنجید. برای ESP32، بعد از تقسیم مقاومتی، ولتاژ GPIO34 را هم پیش از اتصال به برد اندازه بگیرید.
  4. با بدون جریان‌بودن مسیر حس، برد را روشن کنید تا صفر ثبت شود. سپس بار را به‌آرامی فعال کنید.
  5. در چند مقدار جریان پایدار، عدد برنامه را با آمپرمتر مرجع مقایسه و اختلاف را ثبت کنید. جهت جریان ممکن است علامت خروجی را عوض کند.

اگر برد گرم شد، بوی غیرعادی داشت یا نتیجه خارج از انتظار بود، منبع را خاموش کنید. برای سیم‌کشی برق شهر از این راهنما استفاده نکنید.

۹. کاهش نویز؛ اول علت را پیدا کنید

حساسیت ۱۸۵ میلی‌ولت/آمپر در ۵ ولت است؛ پس نویز میلی‌ولتی می‌تواند در قرائت جریان دیده شود. کابل بلند، زمین نامناسب، منبع ناپایدار و میدان مغناطیسی خارجی را جداگانه بررسی کنید. میانگین ۳۲ نمونه نوسان را کمتر می‌کند ولی خطای ثابت، اشباع یا اشکال مدار را اصلاح نمی‌کند.

پایهٔ FILTER تراشه در دیتاشیت برای تنظیم پهنای باند است، اما مقدار و اتصال آن روی ماژول آماده را بدون شماتیک همان محصول حدس نزنید. خازن ۱۰۰ نانوفاراد این پروژه کنار ADC، جایگزین تغییر فیلتر داخلی ماژول نیست. برای اندازه‌گیری سریع پالس یا RMS AC به طراحی و نمونه‌برداری دیگری نیاز دارید.

۱۰. عیب‌یابی عددهای نامعقول

نشانهبررسینتیجه‌گیری مجاز
در صفر جریان، عدد غیرصفرجریان واقعاً صفر بود؟ دما و تغذیه عوض شد؟صفر را در شرایط پایدار دوباره ثبت کنید
در همهٔ جریان‌ها اختلاف نسبینسخهٔ ۵ آمپر یا ۲۰/۳۰ آمپر؟ VCC واقعی و مقاومت‌ها؟حساسیت اشتباه را روی کد تحمیل نکنید
خواندن اشباع یا پرنوسانولتاژ GPIO34، زمین، مسیر بار و تنظیم ADCاز عدد چاپ‌شده به‌تنهایی خرابی سنسور را نتیجه نگیرید
علامت جریان برعکسجهت عبور از مسیر هادیِ همان ماژولعلامت، جهت مرجع را نشان می‌دهد
CONFIG_REQUIREDمقدار SENSOR_SUPPLY_MVتغذیه را اندازه بگیرید و سپس تنظیم کنید

۱۲. خرید در ایران؛ مدل دقیق و موجودی در تاریخ بررسی

بررسی مستقیم صفحات محصول در ۳۰ شهریور ۱۴۰۵، برابر با ۲۰۲۶/۰۹/۲۱ انجام شد. موضوع هر دو پیوند، ماژول ACS712 نسخهٔ ۵ آمپر است، نه تراشهٔ SMD خام یا نسخهٔ ۲۰/۳۰ آمپر. پرسش‌ها و دیدگاه‌های کاربردی خریداران در ECA نشانهٔ کاربرد عملی‌اند، نه آمار فروش یا تضمین مشتری. هیچ قیمت ثابتی درج نشده چون ممکن است تغییر کند.

صفحهٔ محصول دقیقنوعموجودی در زمان بررسی
ماژول سنسور جریان ۵ آمپر ACS712 در ECAماژول آماده؛ کد 3011007029موجود
ماژول سنسور جریان ۵ آمپر ACS712 در آفتاب‌رایانهماژول آمادهٔ ۵ آمپرناموجود

پیش از سفارش، شکل برد، پایه‌های ماژول، گرید حک‌شده روی تراشه و توان ترمینال را از فروشنده بررسی کنید. دیتاشیت Allegro مشخصات تراشه را می‌گوید، نه کیفیت ساخت یا اصالت ماژول فروشگاهی را.

۱۳. پرسش‌های رایج

آیا خروجی ACS712 را مستقیم به ESP32 وصل کنیم؟

در این طرح خیر؛ ماژول با ۵ ولت کار می‌کند و خروجی ممکن است برای GPIO بالا باشد. تقسیم مقاومتی و اندازه‌گیری ولتاژ پیش از اتصال لازم است.

چرا در بی‌باری حدود ۲٫۵ ولت می‌بینیم؟

در گرید دوجهته، خروجیِ جریان صفر در تغذیهٔ اسمی ۵ ولت نزدیک نصف تغذیه است. این ولتاژ به معنی ۲٫۵ آمپر نیست.

آیا مدل ۲۰ آمپر را با همین کد بخوانیم؟

خیر؛ حساسیت نسخهٔ ۲۰ آمپر با ۵ آمپر فرق دارد. مدل تراشه را بخوانید و از دیتاشیت همان گرید استفاده کنید.

آیا عدد خروجی برای جریان AC یا برق شهر معتبر است؟

خیر؛ کد فقط برآورد جریان DC کم‌ولتاژ است. ایزولاسیون تراشه، ایمنی برد آماده یا مجوز اتصال به برق شهر نیست.

آیا میانگین‌گیری، دستگاه را به ابزار حفاظتی تبدیل می‌کند؟

خیر؛ میانگین‌گیری فقط بخشی از نوسان را کم می‌کند. حفاظت اضافه‌جریان باید مستقل طراحی و روی سخت‌افزار واقعی آزمون شود.

۱۴. منابع رسمی و جمع‌بندی

گام بعدی، جدول‌کردن داده‌های واقعی ولتاژ و جریان مرجع خودتان است؛ تا آن زمان از ادعای دقت یا کاربرد حفاظتی خودداری کنید.

پرسش و پاسخ مقاله

سوال فنی خود را مطرح کنید

پرسش‌ها و پاسخ‌ها پس از بررسی مدیر منتشر می‌شوند. نویسنده، پیش‌نویس در انتظار بررسی را می‌بیند.

هنوز پرسش تاییدشده‌ای برای این مقاله ثبت نشده است.