ураа! Склад!!!

Внимание! это учебный материал. и прибор тоже учебный. если нужно не учиться, а просто получить работающий прибор, то вам вот сюда "простой металлоискатель". 

Следующее устройство которое мы соберем - будет простой металлоискатель. На примере этой игрушки мы рассмотрим еще одно интересное устройство - компаратор. Он может сравнивать два аналоговых сигнала. Если речь идет о синусоидальном сигнале, то мы можем вычислить период данного сигнала.

 

 


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

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

Кроме того в конструкции есть чувствительный элемент - это колебательный контур на элементах L1-C1. Внимание! работа прибора напрямую зависит от добротности этого контура, по этому даже не вздумайте ставить электролитический конденсатор! лучше всего использовать КМ-5 или аналогичные импортные.

Рассмотрим теперь принцип работы "миноискателя".

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

То есть перед нами стоит 2 задачи, а именно: возбудить в контуре  электромагнитные колебания, и измерить их частоту (период).

Как уже говорили выше - с измерением периода синусоидального сигнала отлично справляется компаратор. по этому, не мудрствуя лукаво подключаем выводы компаратора (AIN.1 и AIN.2) к выходам нашего резонансного контура. теперь каждый период будет сопровождаться переключением компаратора.

Для возбуждения колебаний достаточно на короткое время подать электрический импульс на контур. (как для того чтобы заставить качели качаться - необходимо просто пнуть их разок). роль такого "пинка" исполняет ток, текущий через конденсатор C2 при изменении логического уровня на выходе  PD.4

При включении логического ноля - конденсатор С1 заряжается через конденсатор С2 от источника питания. при включении логической единицы конденсатор С2 оказывается коротко замкнут на контур, и  разряжается через С1.

ниже приведена осциллограмма сигналов: вверху - меандр который подается с  выхода 8 (PD.4) микросхемы. внизу - сигнал с колебательного контура L1C1

Таким образом для работы металлоискателя достаточно просто подать на С2 - сигнал с 50% скважностью, и считав показания частоты колебаний с контура сравнить их с предыдущими данными измерений. расхождение вывести на дисплей. вот и все.

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

в первую очередь - наматываем катушку... никаких изысков, просто наматываем катушку диаметром 100мм, около 50 витков практически любого провода.. желательно не слишком тонкого. эдак 0.25-0.8 мм в диаметре.. резонансный конденсатор можно повесить прямо на катушку. выводы сделать гибким многожильным кабелем. саму катушку хорошенько замотать изолентой. но с другой стороны, если делать компактное устройство - то можно катушку припаять к плате  безо всяких там переходных кабелей. тут широкий простор для творчества. лично я собрал схему на макетной плате.. 

теперь осталось запрограммировать логику работы чипа.

в начале работы программа должна проинициализировать порты и "новое" устройство - компаратор.

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

по прошествии некоторого количества полупериодов необходимо снова "накачать" энергией контур. это делается путем инвертирования уровня на выходе  PD.4

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


;==========================================================
;Autor:        MadMayDay 2008    
;Project:    StepByStep
;Name:        MetDet-LED
;==========================================================
.device       ATtiny2313
.include      "tn2313def.inc"
.def          st0=R20
.def          st1=R19
.def          st2=R21
.def          st3=R22
.def          st5=R24
.def          SlopReg=R16
.def          DelayReg=R17
.def          ViewReg=R18
.def          outReg=R25
.def          summRegh=R27
.def          summRegl=R26
.def          difReg=R28


;==========================================================
Start: rjmp   Init;

       ;-------------------------------------------------
       ;устанавливаем часть ног микросхемы в состояние "выход",
       ;и часть в состояние "вход"
       ;обратить внимание - выводы используемые для компаратора необходимо
       ;перевести в отключенное состояние - т-е входы без "подтяжки"
Init:  ldi    SlopReg,0b11111100  ; грузим признак выхода
       out    DDRB,SlopReg        ; в регистр управления
       out    PortB,SlopReg       ; портом "В"
                            
       ;один вывод надо сконфигурировать как вход
       ldi    SlopReg,0b11101111  ; грузим признак выхода
       out    DDRD,SlopReg        ; в регистр упр. портом "D"
       ldi    SlopReg,0b00010000  ; грузим признак "активности"
       out    PortD,SlopReg       ; в регистр  входа


       ldi    ViewReg,0b11111100  ; формируем начальное состояние и
       out    PortB,ViewReg       ; отображаем его на «экране»
                 
       ;-------------------------------------------------
       ;устанавливаем самый простой режим работы компаратора
       ;в этом режиме он просто изменяет значение бита в зависимости от
       ;напряжения на входах.
       ldi    slopreg,0
       out    ACSR,slopreg
       ldi    slopreg,03
       out    DiDr,slopreg

       ;загружаем константы.
       ldi    ViewReg,0b011100000
       ldi    SlopReg,0
       ldi    St2,0
       ldi    St3,0
       ldi    outreg,0b00010000
       ldi    summregl,0
 
       ;-------------------------------------------------
       ;основной цикл ожидания.
nochange:    
       inc    st2                 ;прибавляем счетчик        
       in     St0,ACSR            ;проверяем состояние компаратора
       cp     St1,St0             ;если НЕ изменилось
       breq   nochange            ;переходим на начало цикла.
                                  ;если Изменилось то
       mov    st1,st0             ;запоминаем состояние компаратора
                            
       ;проверяем сколько было полупериодов
       cpi    slopreg,11          ;если число циклов меньше заданного
       brne   next                ;то ничего не предпринимаем
                                  ;иначе
       ldi    SlopReg,0           ;обнуляем счетчик полупериодов

       bst    st0,5               ;изменяем состояние "задающего"
       bld    outreg,5            ;выхода на противоположное
       out    portD,outreg        ;обеспечивая накачку энергии в контур.

       ;для измерения берем только периоды когда задающий выход в "нулевом" состоянии.
       brts   donosing;           ;если цикл с 1 - ничего не делать.
    
       ;если требуется - устанавливаем значение "ноля"
       in     st5,pinD            ;проверяем не нажата ли кнопка установки ноля
       bst    st5,4
       brts   nosetZero           ;если нет - ничего не делаем
       mov    summregl,st2;       ;если - да, то в "ноль" записываем текущее значение.
       ldi    st3,0               ;и в "фильтр" ноль.
      
nosetzero:                        ;обрабатываем результаты  
       sub    st2,summregl        ;получаем модуль разницы в сигнале
       brpl   plus        
       neg    st2        
       clt
plus:        
       ;фильтруем полученное значение - убираем случайные выбросы
       ;простенький фильтр со скользящим средним.
       add    st2,st3
       lsr    st2        
       mov    st3,st2    
    
       ;отображаем на экране из 5 светодиодов.
       ;каждый светодиод имеет свой порог зажигания    
       ldi    ViewReg,0b11111100
        
       cpi    st2,2
       brlo   display
       lsl    Viewreg

       cpi    st2,3
       brlo   display
       lsl    Viewreg

       cpi    st2,6
       brlo   display
       lsl    Viewreg
    
       cpi    st2,11
       brlo   display
       lsl    Viewreg
    
       cpi    st2,17
       brlo   display
       lsl    Viewreg

display:                          ;показываем знак разницы между нолем и сигналом
       bld    Viewreg,7           ;за знак отвечает крайний диод.
       out    portB,Viewreg       ;выводим полученное на экран.
            
donosing:
       ldi    St2,0               ;обнуляем счетчик для нового измерения.  
next:  inc    slopreg             ;дрибавляем счетчик полупериодов
                                  ;уходим на следующий цикл
       rjmp   nochange            ;и снова здгаствуйте.
End:
;==========================================================

Прошивка и исходный текст металлоискателя лежат здесь.

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

ОДНАКО чуток модернезировав  схему и программу можно получить уже вполне стабильный и рабочий прибор. Как это сделать показанно в сатье "простой металлоискатель". однако обсуждение этой статьи выходит за рамки учебного курса. 

 Далее --->