Съдържание:

Импулсен детектор на базата на Arduino - флип бобина: 5 стъпки (със снимки)
Импулсен детектор на базата на Arduino - флип бобина: 5 стъпки (със снимки)

Видео: Импулсен детектор на базата на Arduino - флип бобина: 5 стъпки (със снимки)

Видео: Импулсен детектор на базата на Arduino - флип бобина: 5 стъпки (със снимки)
Видео: Димо Деспов - Транзистори 2024, Ноември
Anonim
Импулсен детектор на базата на Arduino - флип бобина
Импулсен детектор на базата на Arduino - флип бобина
Импулсен детектор на базата на Arduino - флип бобина
Импулсен детектор на базата на Arduino - флип бобина

Идеята

Създавайки в миналото някои металотърсачи с различни резултати, исках да проуча възможностите на Arduino в тази посока.

Има някои добри примери за това как да се правят металотърсачи с Arduino, някои тук като инструкции. Но когато ги гледаме, те обикновено изискват или доста външни компоненти за обработката на аналоговия сигнал, или чувствителността е доста ниска.

Когато мислите за металотърсачи, основната тема е как да усетите леките промени на напрежението в сигналите, свързани с търсещата бобина. Обикновено тези промени са много малки. Най -очевидният подход би бил използването на аналоговите входове на ATmega328. Но разглеждайки спецификациите, има два основни проблема: те (често) се забавят и разделителната способност (в повечето случаи) е ниска.

От друга страна, Arduino работи на 16MHz и има доста възможности за синхронизиране i. д. разделителна способност 0,0625µS, ако използвате тактова честота. Така че вместо да използвате аналоговия вход за откриване, най -простият начин за усещане на малки динамични промени в напрежението е да сравните промяната в спада на напрежението във времето при фиксирано референтно напрежение.

За тази цел ATmega328 има чистата характеристика на вътрешен сравнител между D6 и D7. Този компаратор може да задейства прекъсване, което позволява прецизно обработване на събития. Оставяйки покрай добре кодираните процедури за синхронизиране като millis () и micos () и влизайки във вътрешния таймер на ATmega328 с много по -висока разделителна способност, Arduino е чудесна основа за подходи за откриване на метал.

Така че от изходния код изглед, добро начало би било да се програмира вътрешния сравнител за „промяна“в полярността на входовете и да се използва вътрешен брояч с възможно най -висока скорост за промяна във времето на промените.

Общият код в Arduido за постигане на това е:

// Определяне на всички необходими предварителни променливи и т.н. и настройка на регистрите

unsigned char clockSelectBits = _BV (CS10); // без предварителна скала, пълна настройка на xtal void () {pinMode (6, INPUT); // + на компаратора - като ги зададете като INPUT, те са // настроени на висок импеданс pinMode (7, INPUT); // - на компаратора - като ги зададете като INPUT, те са // настроени на висок импеданс cli (); // спиране прекъсва TCCR1A = 0; // задаваме целия регистър на TCCR1A на 0 TCCR1B = 0; // същото за TCCR1B -> нормален режимTCNT1 = 0; // инициализира стойността на брояча на 0; TCCR1B | = clockSelectBits; // задава предусилвател и стартира часовника TIMSK1 = _BV (TOIE1); // задава разрешаване на прекъсване на таймера за разрешаване на бита sei (); // разрешавам прекъсвания ACSR = (0 << ACD) | // Аналогов компаратор: Разрешено (0 << ACBG) | // Аналогов компаратор Bandgap Select: AIN0 се прилага към положителния вход (0 << ACO) | // Изход за аналогов компаратор: Изключен (1 << ACI) | // Флаг на прекъсване на аналоговия компаратор: Изчистване на висящо прекъсване (1 << ACIE) | // Прекъсване на аналоговия компаратор: Разрешено (0 << ACIC) | // Захващане на входа на аналоговия компаратор: Деактивирано (0 << ACIS1 | 0 << ACIS0 // прекъсване при превключване на изхода // (0 << ACIS1 | 1 << ACIS0 // запазено // (1 << ACIS1 | 0 << ACIS0 // прекъсване при падащ изходен ръб // (1 << ACIS1 | 1 << ACIS0 // прекъсване при нарастващ входен ръб;}

// тази рутина се извиква всеки път, когато компараторът създава прекъсване

ISR (ANALOG_COMP_vect) {oldSREG = SREG; cli (); времева маркировка = TCNT1; SREG = oldSREG; }

// тази рутина се извиква всеки път, когато има препълване във вътрешен брояч

ISR (TIMER1_OVF_vect) {timer1_overflow_count ++; }

// тази рутина се използва за нулиране на таймера на 0

void resetTimer (void) {oldSREG = SREG; cli (); // Деактивиране на прекъсвания TCNT1 = 0; // инициализира стойността на брояча на 0 SREG = oldSREG; // Възстановяване на регистър на състоянието TCCR1B | = clockSelectBits; // задава предварително дебитомер и стартира часовника timer1_overflow_count = 0; // нулира брояча за препълване}

Разбира се, тази идея не е съвсем нова. Основната част от този код може да се намери другаде. Добра реализация такъв подход за микроконтролер, открит на началната страница на TPIMD - Tiny Pulse Induction Metal Detector.

www.miymd.com/index.php/projects/tpimd/ (за съжаление тази страница вече не е онлайн, в момента има резервно копие на сайта на www.basic4mcu.com, потърсете „TPIMD“).

Стъпка 1: Идея за импулсна индукция на Arduino - Flip Coil

Идея за пулсова индукция на Arduino - флип бобина
Идея за пулсова индукция на Arduino - флип бобина
Идея за пулсова индукция на Arduino - флип бобина
Идея за пулсова индукция на Arduino - флип бобина

Идеята е да се използва Arduino като детектор за пулсова индукция, както в TPIMD, тъй като идеята за време на кривата на разпадане изглежда работи доста добре. Проблемът с детекторите с пулсова индукция е, че те обикновено се нуждаят от различно напрежение, за да работят. Едно напрежение за захранване на бобината и отделно напрежение за справяне с кривата на разпадане. Тези два източника на напрежение правят импулсно -индукционните детектори винаги малко сложни.

Разглеждайки напрежението на бобината в PI детектор, получената крива може да бъде разделена на два различни етапа. Първият етап е самият импулс, който захранва намотката и изгражда магнитното поле (1). Вторият етап е кривата на спадане на напрежението, започвайки с пик на напрежение, след което бързо се настройва до напрежението "без захранване" на бобината (2). Проблемът е, че бобината променя полярността си след импулса. Дали импулсът е положителен (Var 1. на приложената снимка) кривата на затихване е отрицателна. Дали импулсът е отрицателен, кривата на затихване ще бъде положителна (Var 2. на приложената снимка)

За да се реши този основен проблем, бобината трябва да се „преобърне“по електронен път след импулса. В този случай импулсът може да бъде положителен и кривата на затихване също може да бъде положителна.

За да се постигне това, бобината трябва да бъде изолирана от Vcc и GND след импулса. В този момент през демпфиращ резистор тече само ток. Тази изолирана система от бобина и демпфиращ резистор може да бъде „ориентирана“към каквото и да е референтно напрежение. Това на теория ще създаде комбинираната положителна крива (дъното на чертежа)

Тази положителна крива може след това да се използва чрез сравнителя за откриване на момента, в който разпадащото напрежение „пресича“референтното напрежение. В случай на съкровища близо до намотката, кривата на разпадане се променя и моментът, пресичащ референтното напрежение, се променя. Тази промяна може да бъде открита.

След известно експериментиране следната схема се оказа работеща.

Веригата се състои от модул Arduino Nano. Този модул задвижва два MOSFET транзистора, захранващи бобината (при SV3) чрез D10. Когато импулсът при D10 приключи, и двата MOSFET изолират бобината от 12V и GND. Спестената енергия в намотката изтича през R2 (220 ома). В същото време R1 (560 ома) свързва предишната положителна страна на бобината GND. Това променя отрицателната крива на разпадане при R5 (330 ома) до положителна крива. Диодите защитават входния щифт на Arduino.

R7 е делител на напрежение при около 0.04V. В момента кривата на затихване при D7 става по -отрицателна от 0,04 при D6, се задейства прекъсване и се запазва продължителността след края на импулса.

В случай на метал близо до бобината, кривата на разпадане продължава по -дълго, а времето между края на импулса и прекъсването се удължава.

Стъпка 2: Изграждане на детектора (Брендборд)

Изграждане на детектора (Breadboard)
Изграждане на детектора (Breadboard)
Изграждане на детектора (Breadboard)
Изграждане на детектора (Breadboard)
Изграждане на детектора (Breadboard)
Изграждане на детектора (Breadboard)

Изграждането на детектора е доста лесно. Това може да стане или на макет (придържайки се към оригиналната схема), или чрез запояване на частите върху печатна платка.

Светодиодът D13 на дъската Arduino Nano се използва като индикация за метал

Премахването на макет е най -бързият път към работещия детектор. Необходимо е доста окабеляване, но това може да се направи с малка дъска. На снимките това е показано в 3 стъпки, тъй като Arduino и MOSFET крият някои от проводниците. При тестването изключих диодите по някакъв начин, без първо да забележа. Това няма отрицателен ефект върху поведението на детектора. Във версията на печатната платка ги оставих напълно.

На снимките не са показани връзките към 0,96 OLED дисплей. Този дисплей е свързан:

Vcc - 5V (на щифта Arduino, а не на захранващото напрежение !!!)

GND - GND

SCL - A5

SDA - A4

Този OLED дисплей е необходим за първоначално калибриране на детектора. Това става чрез задаване на правилното напрежение в PIN6 на Arduino. Това напрежение трябва да бъде около 0.04V. Дисплеят помага да се настрои правилното напрежение.

Версията на макет работи доста добре, въпреки че вероятно не е подходяща за навлизане в природата.

Стъпка 3: Преминаване към печатна платка

Преминаване към печатни платки
Преминаване към печатни платки
Преминаване към печатни платки
Преминаване към печатни платки
Преминаване към печатни платки
Преминаване към печатни платки
Преминаване към печатни платки
Преминаване към печатни платки

Що се отнася до запояването, аз всъщност не харесвам двустранна високотехнологична печатна платка, затова модифицирах веригата, за да се побере на двустранна печатна платка.

Направени са следните модификации:

1. диодите бяха пропуснати.

2. портите на MOSFET има резистор от 10 ома

3. захранващото напрежение за делителя на напрежение при D6 се дава от сигнал за ВИСОКО ниво при D8

4. ПИН драйвер за MOSFETs е променен.

По този начин може да се създаде едностранна печатна платка, която може да бъде запоена върху универсални печатни платки. Използвайки тази схема, ще имате работещ PI детектор само с 8-10 външни компонента (в зависимост дали се използва OLED дисплей и/или високоговорител).

Стъпка 4: Настройка и използване на детектора

Настройка и използване на детектора
Настройка и използване на детектора
Настройка и използване на детектора
Настройка и използване на детектора
Настройка и използване на детектора
Настройка и използване на детектора

Ако детекторът е изграден правилно и програмата е написана на Arduino, най -лесният (ако не и единственият) начин за настройка на устройството е да използвате OLED дисплей. Дисплеят е прикрепен към 5V, GND, A4, A5. Дисплеят трябва да показва „калибриране“след включване на устройството. След няколко секунди трябва да пише „калибрирането е извършено“и на дисплея трябва да се покажат три числа.

Първото число е „референтната стойност“, идентифицирана по време на калибрирането. Втората стойност е последната измерена стойност, а третата стойност е средна стойност от последните 32 измервания.

Тези три стойности трябва да са горе-долу еднакви (в моите тестови случаи под 1000). Средната стойност трябва да бъде повече или по -малко стабилна.

За да започнете първоначалната настройка, не трябва да има метал близо до бобината.

Сега делителят на напрежението (потенциометър за подстригване) трябва да бъде подрязан, така че долните две стойности да бъдат зададени на максимум, като същевременно остават стабилни показания. Има критична настройка, при която средната стойност започва да дава странни показания. Върнете тримера обратно, за да получите отново стабилни стойности.

Възможно е дисплеят да замръзне. Просто натиснете бутона за нулиране и започнете отначало.

За моята настройка (бобина: 18 оборота при 20 см) стабилната стойност е около 630-650. След като настроите, натиснете бутона за нулиране, устройството се калибрира отново и всички стойности на дървото трябва да бъдат отново в същия диапазон. Ако сега металът се доведе до намотка, светодиодът на дъската на Arduino (D13) трябва да светне. Прикаченият високоговорител издава известни шумове при щракане (има място за подобряване на програмирането).

За да предотвратите високи очаквания:

Детекторът открива някои неща, но остава много прост и ограничен детектор.

За да създаде впечатление за възможностите, a направи някои референтни откривания с различни други детектори. Ако погледнем резултатите, той все още е доста впечатляващ за детектор само с 8 външни части, но не съвпадащ с професионални детектори.

Разглеждайки схемата и програмата, има много място за подобрения. Стойностите на резисторите бяха установени от опит, времето на импулса от 250 ms беше избрано на случаен принцип, параметрите на бобината също. Ако имате идеи за подобрения, ще се радвам да ги обсъдим.

Забавлявай се!

Стъпка 5: Актуализация1: Използване на 16x2 LCD

Update1: Използване на 16x2 LCD
Update1: Използване на 16x2 LCD
Update1: Използване на 16x2 LCD
Update1: Използване на 16x2 LCD
Update1: Използване на 16x2 LCD
Update1: Използване на 16x2 LCD

Подобрения

По време на по -нататъшното тестване разбрах, че библиотеката за I2C OLED дисплея изразходва значително време. Затова реших вместо това да използвам 16x2 дисплей с I2C конвертор.

Затова приех програмата към LCD дисплея, добавяйки някои полезни функции. Първият ред на дисплея сега показва силата на сигнала на възможна индикация. Вторият ред сега показва две стойности. Юмрукът показва текущото отклонение на сигнала в сравнение със стойността на калибриране. Тази стойност трябва да бъде "0". Ако тази стойност е постоянно отрицателна или положителна, детекторът трябва да се калибрира отново чрез натискане на бутона за нулиране. Положителните стойности показват метал близо до бобината.

Втората стойност показва действителната стойност на забавяне на кривата на затихване. Тази стойност обикновено не е толкова интересна, но е необходима за първоначалната настройка на детектора.

Програмата вече позволява множество импулсни продължителности в последователност (средства за експериментиране / подобряване на производителността). Не постигнах пробив. Така по подразбиране е зададена продължителност на един импулс.

Първоначална настройка на детектора

При настройка на детектора втората стойност на втория ред е от значение (първата може да бъде пренебрегната). Първоначално стойността може да бъде „нестабилна“(вижте снимката). Завъртете резистора за подстригване, докато стойността достигне стабилно отчитане. След това го завъртете, за да увеличите стойността до максимална стабилна стойност. Натиснете бутона за нулиране, за да калибрирате отново и детекторът е готов за употреба.

Останах с впечатлението, че чрез задаване на максимална стабилна стойност, загубих чувствителност към метали, които не са желязни. Така че може би си струва да експериментирате с настройките, за да имате добра чувствителност към неща, които не са желязни.

Бобини

Изграждам 3 намотки за по -нататъшно тестване

1 -> 18 завъртания при 200 мм

2 -> 25 завъртания при 100 мм

3 -> 48 завъртания при 100 мм

Интересното е, че всички бобини работиха доста добре, с почти еднаква производителност (20-каратна монета при 40-50 мм във въздуха). Това може да е доста субективно наблюдение.

Препоръчано: