آزمایشگاه سنسورها • ۳۰ شهریور ۱۴۰۵
چرا ACS712 در بیباری هم جریان نشان میدهد؟
در این پروژه، جریان DC یک بار کوچک را با ماژول ۵ آمپر ACS712، برد ESP32 کلاسیک یا Arduino Uno R3 و یک منبع آزمایشگاهیِ محدودکنندهٔ جریان میخوانیم. از خروجی خام شروع میکنیم، نقطهٔ صفر را بدون جریان ثبت میکنیم و سپس نویز و خطای ADC را از هم جدا میکنیم.
این آموزش صرفاً برای مدار کمولتاژِ آزمایشگاهی است: نه برق شهر، نه باتری پرانرژی و نه حفاظت اضافهجریان. هیچ آزمایش فیزیکی روی قطعه انجام نشده است.

۱. هدف و کاربرد واقعی پروژه
برای پایش آزمایشی جریان یک موتور 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 | پیش از اتصال ولتاژ را اندازه بگیرید |
| خازن ۱۰۰ nF | GPIO34 به 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 یا توان را محاسبه نمیکند.
۸. آزمایش گامبهگام با مرجع
- ابتدا مدل ۵ آمپر روی برد و مسیر دو ترمینال جریان را شناسایی کنید. با برق قطعشده، اتصال سری بار را ببندید.
- منبع آزمایشگاهی را روی ولتاژ DC موردنیاز بار، حداکثر ۱۲ ولت، و محدودیت جریان حداکثر ۱ آمپر تنظیم کنید.
- در بیباری، VCC و VOUT را با مولتیمتر بسنجید. برای ESP32، بعد از تقسیم مقاومتی، ولتاژ GPIO34 را هم پیش از اتصال به برد اندازه بگیرید.
- با بدون جریانبودن مسیر حس، برد را روشن کنید تا صفر ثبت شود. سپس بار را بهآرامی فعال کنید.
- در چند مقدار جریان پایدار، عدد برنامه را با آمپرمتر مرجع مقایسه و اختلاف را ثبت کنید. جهت جریان ممکن است علامت خروجی را عوض کند.
اگر برد گرم شد، بوی غیرعادی داشت یا نتیجه خارج از انتظار بود، منبع را خاموش کنید. برای سیمکشی برق شهر از این راهنما استفاده نکنید.
۹. کاهش نویز؛ اول علت را پیدا کنید
حساسیت ۱۸۵ میلیولت/آمپر در ۵ ولت است؛ پس نویز میلیولتی میتواند در قرائت جریان دیده شود. کابل بلند، زمین نامناسب، منبع ناپایدار و میدان مغناطیسی خارجی را جداگانه بررسی کنید. میانگین ۳۲ نمونه نوسان را کمتر میکند ولی خطای ثابت، اشباع یا اشکال مدار را اصلاح نمیکند.
پایهٔ 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 کمولتاژ است. ایزولاسیون تراشه، ایمنی برد آماده یا مجوز اتصال به برق شهر نیست.
آیا میانگینگیری، دستگاه را به ابزار حفاظتی تبدیل میکند؟
خیر؛ میانگینگیری فقط بخشی از نوسان را کم میکند. حفاظت اضافهجریان باید مستقل طراحی و روی سختافزار واقعی آزمون شود.
۱۴. منابع رسمی و جمعبندی
- Allegro — دیتاشیت ACS712: گرید x05B، حساسیت، صفر، تغذیه و محدودیتها.
- Espressif — Arduino ESP32 ADC API: خواندن میلیولت و attenuation.
- Arduino — analogRead و analogReference: خواندن ADC در Uno.
گام بعدی، جدولکردن دادههای واقعی ولتاژ و جریان مرجع خودتان است؛ تا آن زمان از ادعای دقت یا کاربرد حفاظتی خودداری کنید.