Товары из Китая

Самодельный миллиомметр, построенный на недорогом АЦП MCP3421


  • Цена: 137р
  • Всем привет. Сегодня я хотел бы рассказать о достаточно дешёвой реализации самодельного миллиомметра, с использованием древнего, не сильно быстрого, но зато доступного по цене и достаточно популярного АЦП MCP3421, а так же микроконтроллера, в моём случае использован Arduino Nano (ATmega168), для работы с АЦП по шине I2C.

    Кроме собственно АЦП и микроконтроллера, понадобится ещё ряд компонентов, от которых будет сильно зависеть точность измерений.

    И конечно же, огромным плюсом было бы наличие точных сопротивлений, для возможности проверки и калибровки показаний самодельного миллиомметра.

    Миллиомметр понадобился мне для проверки сопротивления полевых транзисторов, при заказе их с Ali, что бы хоть как то сразу понять палёные они или нет (оригиналы конечно встречается крайне редко, но есть б/у варианты оригиналов, либо чисто китайские транзюки), ведь корректно измерить такие малые сопротивления на обычном мультиметре, не получится. Мультиметром, с функцией измерения ёмкостей, можно лишь измерить ёмкость затвора, на соответствие заявленному значению из даташита.

    Так как, обычно такие транзисторы, в полностью открытом состоянии, имеют сопротивление сток-исток более 10мОм (>0.01Ом), то высокая точность измерителя, в целом не требуется, но по возможности хотелось бы выжать всё что возможно.

    За основу, при построении миллиомметра, была взята данная статья: ссылка, от неё я отталкивался, с целью экономии времени на создание и настройку измерителя. Благодарю автора данной статьи.

    Компоненты миллиомметра

    Дополнительно, кроме самого АЦП и контроллера к нему, понадобятся следующие компоненты:

    1) Специальные зажимы Кельвина, в кол-ве 2-х штук: ссылка

    2) Достаточно толстый провод. Нужно будет 4 коротких куска, для соединения зажимов со входами АЦП (два провода) и цепью состоящей с эталонным резистором (два оставшихся провода).

    3) Линейный стабилизатор напряжения на 3.3В. Я применил AMS1117, заказав их сразу много штук: ссылка

    От него питается как цепь с эталонным резистором, так и сам АЦП. Входное напряжение берётся с платы Arduino Nano (пин «5V», тока с USB порта хватит и на питание контроллера и на остальные компоненты миллиомметра).

    4) Точный резистор из манганина или константана, примерно на 100Ом, или то что есть под рукой, максимально хорошее по точности.

    5) Дисплей для вывода информации. Я применил дисплей LCD1602A, который покупал ещё кажется в 2012 году, и с тех пор он мне всё не пригождался, и вот его час настал. Если будете покупать этот экран в 2022 году, то берите его с переходником под интерфейс I2C, хотя наверное сейчас без него и не найти этот дисплей.

    Мой дисплей без такого переходника, подключен россыпью проводов, с применением немного другой библиотеки дисплея, нежели в статье.

    Дисплей питается напряжением 5В и 3.3В (токи потребления небольшие), всё берётся с платы Arduino Nano.

    Так же, можно вообще забить на экран, ведь данные так же будут выводится в консоль через последовательный порт, при подключении на ПК, что чуть менее удобно, чем вывод на экран, без него мы теряем автономность и независимость устройства.

    В упрощенном виде, у меня получился такой вариант схемы:

    Самодельный миллиомметр, построенный на недорогом АЦП MCP3421

    Здесь показан немного другой линейный стабилизатор, аналог AMS1117 (проверяйте номера ног по даташиту), и не показана запитка самого АЦП. Входное напряжение 5В поступающее на стабилизатор, идёт с платы Arduino Nano.

    R1 это эталонный резистор в цепи, RX — измеряемое сопротивление.

    Так же, на схеме не показан дисплей.

    В качестве эталонного резистора, я применил составной резистор (3-и маломощных резистора с 1% точностью, соединенные в параллель), с итоговым сопротивлением ~110Ом, согласно более-менее точных показаний мультиметра Aneng AN8008.

    В статье, которую я брал за основу, автор применяет эталонное сопротивление из манганина, значение которого не убежит от нагрева. При этом, сам резистор должен быть максимально точным по разбросу реального значения с указанным.

    Я решил соединить три резистора в параллель, вместо применения одного резистора на 110Ом, что бы минимизировать нагрев, а значит и изменение сопротивления, ввиду того что у меня есть только «обычные» резисторы, и при этом маломощные, из набора заказанного на Ali.

    Но, конечно лучше так не делать (ведь между группой резисторов как не крути есть разброс), и греться они всё равно будут (пусть и не так сильно, ведь через них пойдёт ток около 30мА, при 3.3В), толку от этого не сильно много по отношению к варианту с одним резистором, но для ряда задач, когда нужно собрать бюджетное устройство из легко доступных и недорогих компонентов, при не сильно большой точности, такой вариант имеет место быть.

    Самый точный резистор имеющийся у меня, производства СССР, имеет относительно высокое сопротивление 1КОм и точность 0.1%. Он хоть и точный, но не из манганина или константана.

    Изначально, я хотел использовать его в качестве эталона в схеме миллиомметра, но позже, уже при тесте устройства понял, что из-за такого большого сопротивления, АЦП не сможет корректно произвести измерение напряжения, при тестировании сопротивления с миллиоммным значением. Найти похожий резистор но на 100Ом (или около того), поштучно, весьма проблематично, но можно поспрашивать на авито у локальных торгашей, но лучше конечно искать сразу из манганина или константана, как можно более точные по номиналу (либо «забить» на точность, если есть возможность измерить сопротивление высокоточным поверенным омметром, с учётом сопротивления применённых проводов).

    Если свободной платы Arduino Nano сейчас нет под рукой, то придётся покупать её по завышенной цене (даже плата на 168-ой атмеге стоит не дёшево), или рассмотреть возможность работы например с использованием платы на ESP8266, которые сейчас намного дешевле, но могут быть нюансы с ПО.

    АЦП

    АЦП требует минимум обвязки, и на Ali продаётся уже в виде готового модуля.

    Я не смог найти в своих закромах керамические конденсаторы на 100нФ (0.1мкФ), которые указаны на приведённой в статье схеме, хотя у меня где валялся пакетик таких конденсаторов, поэтому спаял всё без их использования.

    Сам АЦП MCP3421 одноканальный, разрядность измерений до 18бит в дифференциальном режиме, и до 17бит в обычном режиме. При разрядности 18 бит, АЦП делает около 3.75 измерений в секунду, что очень медленно, но для нашей задачи достаточно и этого.

    АЦП имеет в своём составе встроенный источник опорного напряжения (ИОН), поэтому внешний ИОН ему не нужен, но питание всё равно должно подаваться нормальное, с минимальными шумами.

    Нормальным вариантом, для бюджетной конструкции, будет являться применение линейного стабилизатора AMS1117, на 3.3В, имеющего достаточно хорошую точность выходного напряжения, и достаточно большой возможный выходной ток.

    Либо, более жирный вариант качественного питания — использование редкой микросхемы REF193. REF193 на Ali найти за не дорого не удалось, хотя тех же 5-и вольтовых REF195 (и вроде бы даже не поддельных), там много, за вполне разумные деньги.

    Максимальный ток REF193 всего 30мА, как и потребляемый ток у самой измеряемой схемы, состоящей из эталонного и измеряемого резисторов.

    В принципе сам АЦП кушает очень мало, и если подобрать чуть большее эталонное сопротивление, то в целом должно получиться запитать всё целиком от этого опорника, или запитать только саму тестовую часть схемы, где точность подаваемого напряжения для цепи состоящей из эталонного и тестового резисторов важнее, чем в случае с самим АЦП, имеющим встроенный ИОН.

    Если необходимо, то АЦП MCP3421 можно заменить так же достаточно популярным АЦП ADS1115, который способен обеспечить разрядность измерений до 16бит, и имеет большее количество каналов, и немного большую стоимость, есть аналогичные примеры миллиомметров на его основе.

    Итоговая конструкция, тестирование

    В моём случае, у меня нет возможности произвести калибровку миллиомметра на точных сопротивлениях, поэтому её я не проводил. Эталонный резистор так же не особо подходящий, но попробуем поработать с тем что есть.

    Скетч.

    Скетч достаточно прост и понятен, и отредактирован мною под мой дисплей, не имеющий поддержки соединения по I2C, как было у автора.

    
    
    #include <Wire.h> // SDA и SCL (А4 и А5)
    #include <MCP3421.h> // https://github.com/liman324/MCP3421.git
    #include <LiquidCrystal.h>
    const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
    LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

    MCP3421 mcp;

    unsigned long dig,dig_sum;
    float u,r;
    const float u3300 = 3.292; // опорное напряжение (V)
    const float r_ogr = 109.88;// эталонное сопротивление (Om)
    const float r_0 = 0.0010; // погрешность нуля (Om)
    int i,n=0,m;

    void setup() {
    Serial.begin(115200);
    Wire.begin();
    lcd.begin(16, 2);
    mcp.setConfig(3,3);// 12 14 16 18 bit - 0-3 // 1x 2x 4x 8x gain - 0-3
    //lcd.init();
    //lcd.backlight();
    }

    void loop() {
    /// авто переключение диапазонов /////////
    dig = mcp.readWire();
    if(dig>131070&&n==0){mcp.setConfig(3,2);delay(50);n=1;}
    if(dig>131070&&n==1){mcp.setConfig(3,1);delay(50);n=2;}
    if(dig>131070&&n==2){mcp.setConfig(3,0);delay(50);n=3;}
    if(dig<65000&&n==1){mcp.setConfig(3,3);delay(50);n=0;}
    if(dig<65000&&n==2){mcp.setConfig(3,2);delay(50);n=1;}
    if(dig<65000&&n==3){mcp.setConfig(3,1);delay(50);n=2;}

    // калибровка диапазонов //
    dig = mcp.readWire();
    if(n==0){u = dig * 0.2569 /131071;}// n0 8 Om
    if(n==1){u = dig * 0.5156 /131071;}// n1 18 Om
    if(n==2){u = dig * 1.0270 /131071;}// n2 38 Om
    if(n==3){u = dig * 2.0510 /131071;}// n3 170 Om

    /// измерение ///////////////////////////
    while(i<20){i++;
    dig = mcp.readWire();
    dig_sum = dig_sum+dig;
    delay(50);}
    i=0;
    dig=dig_sum/20;
    dig_sum=0;

    /// монитор порта ////////////////////////
    Serial.print(dig);
    Serial.print(" u=");
    Serial.print(u,6);
    Serial.print(" r=");
    Serial.print(((r_ogr*u)/(u3300-u))-r_0,4-n);
    Serial.print(" n=");
    Serial.println(n);

    switch(n){
    case 0: m=4;break;
    case 1: m=3;break;
    case 2: m=3;break;
    case 3: m=2;break;
    }
    r = ((r_ogr*u)/(u3300-u))-r_0;
    if(r>172){lcd.setCursor(0, 0);
    lcd.print(" R > 172.00 Om ");}
    else{lcd.setCursor(0, 0);
    lcd.print(" R = ");
    lcd.print(r,m);
    lcd.print(" Om ");}
    lcd.setCursor(0, 1);
    lcd.print(" N ");
    lcd.print(n);
    if(r>172){lcd.setCursor(5, 1);
    lcd.print(" 0.000");
    lcd.print(" mA");}
    else{lcd.setCursor(5, 1);
    lcd.print(" ");
    lcd.print((u3300/(r+r_ogr))*1000);
    lcd.print(" mA");}
    }

    В скетче присутствуют следующие задаваемые величины:

    const float u3300 = 3.292 — опорное напряжение, В. В моём случае это напряжение с выхода AMS1117, подающееся в цепь R1-Rх, от точности его установки и поддержания в процессе измерения, зависит точность итогового измерения АЦП того напряжения, которое упадёт на исследуемом резисторе. Напряжение измерено мультиметром Aneng AN8008.

    const float r_ogr = 109.88 — значение эталонного сопротивления, Ом. Сопротивление измерено мультиметром Aneng AN8008.

    const float r_0 = 0.0010 — погрешность нуля, Ом. Определяется при замыкании щупов между собой.

    Миллиометр измеряет сопротивления в диапазоне от 0,0000Ом до 172.00Ом, в 4-х диапазонах.

    В качестве настроек АЦП, выбрано усиление 8x, и максимально доступная разрядность измеряемых значений, равная 18 бит.

    В качестве «известного» сопротивления, применю шунт с заявленным сопротивлением 10мОм, купленный в кол-ве 10шт здесь: ссылка

    Насколько точно значение сопротивления шунта по отношению к заявленному, сказать сложно, предполагаю что погрешность значения находится в районе 1%-5%, но это не точно. Плохо что у меня нет эталонного высокоточного измерителя, или точного резистора для точной оценки.

    Произвожу измерение сопротивления двух шунтов, из 10 штук.

    Первый шунт:

    Самодельный миллиомметр, построенный на недорогом АЦП MCP3421

    Показания немного плавают при длительности измерения более 1-ой минуты.

    Самодельный миллиомметр, построенный на недорогом АЦП MCP3421

    Второй шунт. Тут измеренные значения немного иные, и очень близки к 10мОм (0.01Ом):

    Самодельный миллиомметр, построенный на недорогом АЦП MCP3421

    Самодельный миллиомметр, построенный на недорогом АЦП MCP3421

    Кстати, зажимы не очень жёстко фиксировали тонкий шунт, но контакт вроде был нормальный.

    В целом, точность достаточная для проверки сопротивления полевика. Единственное, с проверкой сопротивления на полевых транзисторах надо быть аккуратней, ведь для полного открытия нужно подать на его затвор напряжение около 12В.

    Я при проверке сопротивления одного из полевиков, в последствии оказавшегося пробитым, повредил один АЦП, пришлось заказывать новый и ждать ещё месяц. Хотя повреждённый АЦП вроде бы и частично работал, показывая сопротивление (при измерении резистора на десятки Ом) с большой погрешностью, и для измерений уже не годился.

    О том как я собирал данный миллиомметр, разбирался с работоспособностью дисплея, а так же сжёг первый АЦП, расскажу на видео (получилось затянутым, но быть может поможет начинающим, не уверенным в своих силах по сборке такого миллиомметра, хотя сложного по сути ничего нет):

    Проверю полевой транзистор IRF520N, купленный на Ali в кол-ве 10 штук с год назад, за недорого, в качестве транзистора который не жалко случайно спалить.

    Самодельный миллиомметр, построенный на недорогом АЦП MCP3421

    Сравню со вторым экземпляром:

    Самодельный миллиомметр, построенный на недорогом АЦП MCP3421

    Получаем сопротивление сток-исток около 70мОм, а по даташиту там должно быть 200мОм, транзистор рассчитан на достаточно большое напряжение сток-исток, и в данном случае, он скорее всего быстро сгорит, при достижении напряжения близкого к 100В, и при наличии более менее протекающего тока.

    Измерил так же мультиметром ёмкость заствор-исток, получил 1.5нФ, что соответствует ёмкости 1500пФ, а по даташиту всего 330пФ.

    Самодельный миллиомметр, построенный на недорогом АЦП MCP3421

    Получается что перед нами явно не оригинальные транзисторы.

    Вот скриншот из даташита:

    Самодельный миллиомметр, построенный на недорогом АЦП MCP3421

    На самом деле, достаточно даже присмотреться к маркировке, она не кажется оригинальной, и намекает нам на то что и транзистор тоже подделка.

    Самодельный миллиомметр, построенный на недорогом АЦП MCP3421

    Измерение сопротивления открытого IRF520N на видео:

    Выводы

    Даже в моей, плохенькой реализации, на не очень хороших компонентах, на навесном монтаже, без калибровки, такой миллиомметр способен определить значения сопротивления сток-исток, и этих данных должно быть достаточно для определения оригинальный транзистор или нет.

    По идее, с показаниями данного измерителя, можно даже попробовать выйграть спор на aliexpress (правда там не всегда возвращают деньги даже по выйгранному спору или отменённому заказу), при условии что вы берёте транзисторы под видом оригинальных, и платите за них не 3 копейки, т.е. вас нагло кидают китайские продавцы.

    Другой вариант, как в случае с моими IRF520N, где я знал что беру подделку, но мне они нужны были для тестов (небольшие напряжения и токи), так как в случае чего, их не жалко и спалить.

    Ну и наконец, можно достаточно точно измерить данным миллиомметром сопротивление резисторов и шунтов, когда оно имеет крайне низкое значение, уже не доступное для корректного измерения мультиметром.


СМОТРИ ТАКЖЕ

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *