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.
Далее , с целью повышения чувствительности, стабильности, решил несколько доработать этот МД:
Главная страница Страница Всякое-разное