Металлоисатели и все, что с этим связано

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Ср май 12, 2010 05:53:45

Сообщение Васнецов Аркадий »

:shock: Здравствуйте, посроил металлоискатель на ATmega16 с испоьзованием LCD 8x2 на основе частотомера, (исползовал ne555), но с прошивкой большие проблемы, работаю с сodevision AVR. Частоту считывает, а на LCD не выводит. Помогите пожалуйста. Суть работы металлодетактора в том, чтобы на вход T0 поступил сигнал, и после чего сигнал (его частота была выведена на LCD).
Реклама
Потрогал лапой паяльник
Сообщения: 390
Зарегистрирован: Чт сен 24, 2009 17:22:51
Откуда: UK

Сообщение FUZZY_ »

Схемку бы.
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 43
Зарегистрирован: Пт апр 09, 2010 12:54:00
Откуда: Санкт-Петербург

Сообщение Maxxon »

А хоть что-нибудь выводит на LCD? Может просто с коннектом проблема?
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Ср май 12, 2010 05:53:45

Сообщение Васнецов Аркадий »

Вот схема питание 5 вольт. Используется таймер T0, ne555 питается от микроконтроллера
Вложения
ClipBoard-1.jpg
Вот схема
(71.48 КБ) 461 скачивание
Реклама
Эиком - электронные компоненты и радиодетали
Открыл глаза
Аватара пользователя
Сообщения: 43
Зарегистрирован: Пт апр 09, 2010 12:54:00
Откуда: Санкт-Петербург

Сообщение Maxxon »

Так что с индикатором с принципе? 3 нога индикатора должна идти на движок переменного резистора, а крайние ноги резистора - на землю и питание соответственно. Это ведь регулировка яркости LCD. Если коротнуть на питание или землю то яркость или будет такая, что все знакоместа выплывут, либо чистый экран будет. Какой индикатор? Если WH1602, то у него первая нога не на питание, а на землю, в отличии от LM016, а вторая - это питание.
И не пишите "-5V" - у вас нет двуполярного питания, насколько понимаю.

Начните с того, что создайте проект в CVR, например, сгенерите код для инициализации LCD и скиньте туда текст, скажем, через lcd_puts(); Если работает, то только после этого идти ко всему остальному. Кстати, а как вы узнали что частоту считывает?
Реклама
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Ср май 12, 2010 05:53:45

Сообщение Васнецов Аркадий »

:shock: Я, действительно, забыл сказать, что использовал переменный резистор на 10K, то что схема работает я проверял так: прошивал микроконтроллер прошивкой для частотомера(прошивка на основе примера для ATMEGA 8535, перелопатил половину кода и получил частотомер, но вот как из него сделать метеллодетектор незнаю).
:idea: И еще один вопрос: как сделать так чтобы кнопки постоянно опрашивались и при нажатии на одну из них выводились разные надписи (для каждой кнопки свои, вчера пробовал, но безуспешно. Можно использовать любые выходы микроконтроллера, подключение обычное, одим вывод кнопки к МК, другой к земле.
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 43
Зарегистрирован: Пт апр 09, 2010 12:54:00
Откуда: Санкт-Петербург

Сообщение Maxxon »

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

Есть более извращенный способ, которым можно с некой долей вероятности оценить размер, тип, глубину металла. Для этого надо накопить базу знаний (статистику) опытным путем и чем она будет больше, тем надежнее будет результат. Также он будет зависеть от скорости изменения частоты контура. По накопленной статистике после калибровки можно построить вероятностный прогноз для выбранных групп. Сложно, но осуществимо. Возможно, кто-то уже такое делал. Больше с подобной конструкцией прибора, наверное, не добиться.

Кнопки? Вариантов много, в интернете, да и здесь тоже, есть кучи примеров опроса клавиатурной матрицы. Основные виды - тупой перебор входов, использование прерывания таймера по переполнению, использование АЦП и др.

вот, к примеру, для случая с таймером

Код: Выделить всё


// определяем где кнопка висит
#define BT_PORT PORTD
#define BT_DDR DDRD
#define BT_PIN PIND
#define BTN 3

// пишем обработчик прерывания для таймера 0
ISR(TIMER0_OVF_vect)
{
	if (bit_is_clear(BT_PIN, BTN))
	{
           // делаем что нужно при нажатии кнопки
	}

}

// далее в цикле main()

// инициализируем таймер0 (согласно значениям по даташиту на выбранный контроллер)
TCCR0=...;
TCNT0=...;
OCR0=...;

// инициализируем прерывания для таймера 0 (согласно значениям по даташиту на выбранный контроллер)
TIMSK=...;

// конфигурируем ногу порта, где висит кнопка
BT_PORT|=1<<BTN;   //подтягиваем ногу порта
BT_DDR &=~(0<<BTN);   //конфигурируем ногу порта как вход

// после инициализации всех регистров не забываем разрешить прерывания
sei();

Это пример для WinAVR (для CVAVR все сделает мастер, только обработчик прерывания добавить), использую этот механизм для своих девайсов для количества кнопок <=5. Для большего количества целесообразнее использовать матрицу для экономия ног портов.
Открыл глаза
Сообщения: 41
Зарегистрирован: Пн дек 21, 2009 15:16:31

Сообщение ujin »

Васнецов Аркадий писал(а)::shock: Я, действительно, забыл сказать, что использовал переменный резистор на 10K, то что схема работает я проверял так: прошивал микроконтроллер прошивкой для частотомера(прошивка на основе примера для ATMEGA 8535, перелопатил половину кода и получил частотомер, но вот как из него сделать метеллодетектор незнаю).
:idea: И еще один вопрос: как сделать так чтобы кнопки постоянно опрашивались и при нажатии на одну из них выводились разные надписи (для каждой кнопки свои, вчера пробовал, но безуспешно. Можно использовать любые выходы микроконтроллера, подключение обычное, одим вывод кнопки к МК, другой к земле.

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

можно например сделать так

#define MODE PINC.1
опредедили собственно кнопку и её свойство
естественно в инициализации указываете что это будет вход и с подтяжкой к питанию.

в теле основной программы пишем собственно вот такую конструкцию
;////////////////////////////////собственно эта конструкция устанавливает факт изменения состояния входа
if (MODE==0); если состояние стало ноль тоесть нажали кнопку и замкнули вход на массу то выполняем
{delay_ms(6); то что в скобках делаем задержку на 6 мсек
if (MODE==0) после задержки опять проверяем что вход всё ещё сидит на массе
{flag_MODE=1;}; то установим флаг старт
;//////////////////////////////////ну это конструкция опрашивает и кнопку на пример её отпускания и
if (flag_MODE&MODE==1) ;если флаг старт у нас в единице и вход тоже в единице то
{flag_MODE=0; выполняем прогамму обработки предварительно сбросив flag_MODE
<сдесь программа обработки события срабатывания>
;};

этот примерчик ещё плюс исползьует одну переменную flag_MODE....её тоже необходимо объявить например char flag_MODE=0 вот так, или в глобальных переменных объявить bit flag_MODE=0. Это сделано для того что бы зафиксировать срабатывание и патом его сравнить с состоянием того же входа и запускать программу обработки нажатия кнопки толькo после тoго как кнопка будет отпущена пользователем...
..этот код не претендует на красивый ....но он вполне рабочий....и в угоду простоте вполне понятный.
...
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»