SURF  MASTER  SUPER  MICRO

 

  Еще более упрощенная версия металлоискателя  SURF MASTER MICRO PI

 Главная страница              Ст

С целью максимального упрощения схемы большинство функций возложено на микроконтроллер,

точнее на микроконтроллерную плату Maple Mini  с микроконтроллером  STM32  на борту.

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

Схема:

 

 

фото:

 

 

Ключи убраны внутрь контроллера, точнее в программу.
Вот ПО:




// PI metal detector Surf_PI_Super_Micro version__3_U_55 весьма упрощенная ( very simple)
int m = 0;
int k = 0;
int tresh = 180; // порог
int s0_array[255];
int s_array[255];
int s_rasnost_array[255];
int s0_rasnost_array[255];
int s_summa_rasnost_array = 0;
int s0_summa_rasnost_array = 0;
byte input_read_PIN = 8;
byte sound_PIN = 10;
byte num_read_sample_1 = 5; // каждая выборка - из 5 циклов чтения
byte turn_on_IGBT = 22;
byte onboard_LED = 33;
byte delay_spread = 32; // между выборками 32 циклa чтения 32х7,5=240 микросекунд
byte delay_begin = 3; // задержка - 3 цикла чтения 3х7,5=22 микросекунды
unsigned int pulse_width = 100; // ширина импульса в микросекундах
unsigned int pause_width = 3000; // ширина паузы между импульсами в микросекундах

void setup()
{ pinMode(sound_PIN, OUTPUT);
pinMode(turn_on_IGBT, OUTPUT);
pinMode(onboard_LED, OUTPUT);
pinMode(input_read_PIN, INPUT_ANALOG);
digitalWrite(turn_on_IGBT ,1); // закрывааем ключ
for (k = 0; k < 640; k++) // прогрев / heating
{
digitalWrite(turn_on_IGBT,0);// открывая т.о. ключ (turn on)
delayMicroseconds(pulse_width); // wait
digitalWrite(turn_on_IGBT,1); // закрывааем ключ (turn off )
delayMicroseconds(pause_width);
}
digitalWrite(turn_on_IGBT,0);// открывая т.о. ключ (turn on)
delayMicroseconds(pulse_width); // wait
digitalWrite(turn_on_IGBT,1); // закрывааем ключ (turn off )
for (m=0; m < 127; m++ ) //калибровка / calibration
{
s0_array[m] = analogRead(input_read_PIN);
}
s0_summa_rasnost_array = 0;
for ( m = delay_begin; m <= delay_begin + num_read_sample_1; m++ )
{
s0_rasnost_array[m] = s0_array[m] - s0_array[m + delay_spread];
s0_summa_rasnost_array = s0_summa_rasnost_array + s0_rasnost_array[m];
}
}
void loop()
{
digitalWrite(turn_on_IGBT,0);// открывая т.о. ключ (turn on)
delayMicroseconds(pulse_width); // wait
digitalWrite(turn_on_IGBT,1); // закрывааем ключ (turn off )
for (m=0; m < 127; m++ )
{
s_array[m] = analogRead(input_read_PIN);
}
s_summa_rasnost_array = 0;
for ( m = delay_begin; m <= delay_begin + num_read_sample_1; m++ )
{ s_rasnost_array[m] = s_array[m] - s_array[m + delay_spread];
s_summa_rasnost_array = s_summa_rasnost_array + s_rasnost_array[m];
}
m = s_summa_rasnost_array - s0_summa_rasnost_array;
if ( m > tresh)
{
if (m < 100) { m = 100;}
if (m > 500) { m = 500;}
k = 0;
while(k < pause_width)
{
digitalWrite(onboard_LED,1);
digitalWrite(sound_PIN,1);
delayMicroseconds(m);
digitalWrite(onboard_LED,0);
digitalWrite(sound_PIN,0);
delayMicroseconds(m);
k = k + m + m;
}
}
else
{
delayMicroseconds(pause_width);
}

}





Это тоже  вполне себе работоспособный проект, но чувствительность, конечно, хужее - 18...20 см на пятак,
но тут есть еще над чем поработать как схемотехнически, так и программно...

 


 

январь 2017г.

Потом решил еще упростить SurfMaster Micro:

К сожалению, источник питания +5/-5V спалил, пришлось использовать +15/-15V и добавить соответчтвенно резисторный делитель:

 

 

Проверил в железе, схема работоспособная.
В программе использовал функции низкоуровневого доступа для АЦП:

// PI metal detector Surf_PI_Super_Puper_Micro version_1ADC_fast_ver3
#include "adc.h" 
unsigned int m = 0;
unsigned int k = 0;
int tresh = 900; // порог 
int s0_array[255];
int s_array[255];
int s_rasnost_array[255];
int s0_rasnost_array[255];
int s_summa_rasnost_array = 0;
int s0_summa_rasnost_array = 0;
unsigned int input_read_PIN = 8;
byte sound_PIN = 10;
byte num_read_sample_1 = 16; // каждая выборка - из 16 циклов чтения 16x2.5=40 мкс
byte turn_on_IGBT = 22;
byte onboard_LED = 33;
byte delay_spread = 80; // между выборками 80 циклов чтения 80х2,5=200 микросекунд
byte delay_begin = 16; // задержка - 16 циклов чтения 16х2,5=40 микросекунд
unsigned int pulse_width = 100; // ширина импульса в микросекундах
unsigned int pause_width = 3000; // ширина паузы между импульсами в микросекундах

void setup()
{
pinMode(sound_PIN, OUTPUT);
pinMode(turn_on_IGBT, OUTPUT);
pinMode(onboard_LED, OUTPUT);
pinMode(input_read_PIN, INPUT_ANALOG); 
digitalWrite(turn_on_IGBT ,1); // закрывааем ключ


adc_init(ADC1);
adc_enable(ADC1);
adc_calibrate(ADC1);
adc_set_sample_rate(ADC1, ADC_SMPR_13_5);
adc_set_extsel(ADC1, ADC_ADC12_SWSTART);
adc_set_reg_seqlen(ADC1, 1);
adc_set_exttrig(ADC1, 1);

for(m =0; m < 200; m++){ 
digitalWrite(onboard_LED,1);
digitalWrite(sound_PIN,1);
delayMicroseconds(500);
digitalWrite(onboard_LED,0);
digitalWrite(sound_PIN,0);
delayMicroseconds(500);
}

for (k = 0; k < 640; k++) // прогрев / heating 
{

digitalWrite(turn_on_IGBT,0);// открывая т.о. ключ (turn on)
delayMicroseconds(pulse_width); // wait 
digitalWrite(turn_on_IGBT,1); // закрывааем ключ (turn off )
delayMicroseconds(pause_width);
}

s0_summa_rasnost_array = 0;

for (k = 0; k < 256; k++) 
{
digitalWrite(turn_on_IGBT,0);// открывая т.о. ключ (turn on)
delayMicroseconds(pulse_width); // wait 
digitalWrite(turn_on_IGBT,1); // закрывааем ключ (turn off )

for (m=0; m < 255; m++ ) //калибровка / calibration 
{
s0_array[m] = adc_read( ADC1, 3); // analogRead(input_read_PIN); 
}

for ( m = delay_begin; m <= delay_begin + num_read_sample_1; m++ )
{
s0_rasnost_array[m] = s0_array[m] - s0_array[m + delay_spread]; // вычисляем разницу...
s0_summa_rasnost_array = s0_summa_rasnost_array + s0_rasnost_array[m]; // ... и интегрируем
}
delayMicroseconds(pause_width); 
}
s0_summa_rasnost_array = s0_summa_rasnost_array / 256; //вычисляем среднее
}

void loop()
{
digitalWrite(turn_on_IGBT,0);// открывая т.о. ключ (turn on)
delayMicroseconds(pulse_width); // wait 
digitalWrite(turn_on_IGBT,1); // закрывааем ключ (turn off )

for (m=0; m < 255; m++ )
{
s_array[m] = adc_read( ADC1, 3); //analogRead(input_read_PIN); 
}

s_summa_rasnost_array = 0;

for ( m = delay_begin; m <= delay_begin + num_read_sample_1; m++ )
{
s_rasnost_array[m] = s_array[m] - s_array[m + delay_spread];
s_summa_rasnost_array = s_summa_rasnost_array + s_rasnost_array[m];
}
m = s_summa_rasnost_array - s0_summa_rasnost_array;
if ( m > tresh) 
{
if (m < 100) { m = 100;}
if (m > 500) { m = 500;}
k = 0;
while(k < pause_width)
{ 
digitalWrite(onboard_LED,1);
digitalWrite(sound_PIN,1);
delayMicroseconds(m);
digitalWrite(onboard_LED,0);
digitalWrite(sound_PIN,0);
delayMicroseconds(m);
k = k + m + m;
} 
} 
else 
{
delayMicroseconds(pause_width); 
}

}

 

 

 

 

Март 2017.

Далее , с целью повышения чувствительности, стабильности, решил несколько доработать этот МД:

 

                                                 

Главная страница                 Страница Всякое-разное                                       

 

Hosted by uCoz