я вот тоже третью уже неделю изобретаю этот же велосипед.
Делаю компьютер для скутера (мопед) со следующими возможностями:
-измерение оборотов
-измерение температуры масла
-измерение скорости
-измерение уровня топлива
ну и еще в процессе добавлю др функции, главное с этими разобраться.
С электротехникой я на Вы с МК также, но потихоньку начал знакомиться. С МК (я использую ATMEGA168) разобрался быстро, благо книги хорошие попались. Программировать я могу, ибо студент МатФака, два семестра учил Яву, до этого другие языки. Но это так, вступление.
Я в своем проекте (громкое слово!) использую помимо вышеназванного МК, еще 16х2 LCD дисплей, ну и кучку др. деталек, как резисторы, диоды, транзисторы и пр. Впоследствии в устройстве будет стоять дисплей от сотового (Nokia 3310 или Siemens A55), с обоими разобрался, подключал к Контроллеру, проблем нет.
Хотелбы сначала дать пару советов автору:
программировать лучше на С (для новичка во всяком случае, так ИМХО проще, сама программа получается удобочитаемой и короткой, хотя я с асмом дел много не имел, так что пардон, коли неправ)
в CVAVR есть замечательная функция при создании проекта CodeWisardAvr - большинство настроек задаешь галочками, выбором меню и т.д., есть возможность выбора LCD, там и распиновка уже написана будет сразу, и т.д.
нормальная книга: Шпак Ю.А. Программирование на языке С для AVR и PIC микроконтроллеров. МК-Пресс, Киев, 2006, в инете есть.
Там в примерах уже и тахометр простенький есть.
Что уже реализовано:
программная часть на 80 процентов. В принципе за вечер можно дописать до 100, с этим проблем нет. Температура, напряжение, уровень топлива - не проблема.
А вот с тахометром я намучался.
Реализация такая: запускаем 16 битный счетчик T/C1. Разрешаем прерывания по захвату и переполнению. При переполнении просто увеличиваем счетчик переполнений, он нам будет нужен для вычисления времени, прошедшего между прерываниями по захвату.
В обработке прерывания по захвату вычисляем количество тактов счетчика, короче, чтобы долго не писать, вот вся функция:
Код: Выделить всё
// Timer 1 input capture interrupt service routine
interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
unsigned long CurrentTime,T;
//тут вычисляем колво тактов с прошлого прерывания (T-колво тактов с прошлого сигнала от датчика холла)
CurrentTime=((unsigned long int)256*(unsigned long int)ICR1H)+(unsigned long int)ICR1L;
if(overflow==0) T=CurrentTime-PreviousTime;
else T=0xFFFF*overflow-CurrentTime+PreviousTime;
overflow=0;
PreviousTime=CurrentTime;
}потом все это дело пересчитываем в обороты (в зависимости от частоты счетчика) и выводим на дисплей. Ну конечно делаем там усреднение, и т.д., чтобы показания сильно не плавали.
Тестировал дома: за неимением генератора, просто подключал выход T/C1 к ATTINY2313, в котором делал вывод сигнала с одной ноги через определенные промежутки, опять же с использованием таймера. Вроде работает.
Тестировал на мопеде:(вот тут и проблема) до 2500 об/мин показывает нормально, выше - не хочет.
вывод с коммутатора подсоединял через резистор к транзистору, который работал как ключ.
В электротехнике как я уже говорил, не силен. Думаю, что проблема в том, что импульсы с коммутатора идут слишком плотно и МК уже не может их как следует друг от друга отделить или же причина в "дребезге контактов", хотя там никаких контактов нет, импульс идет с катушечного датчика.
Смотрел схемы для авто (http://telesys.ru/electronics/projects/proj104/main.pdf у меня также как здесь, только нет конденсаторов и диода на входе с катушки. Может быть в этом дело?)
Сейчас буду делать формирователь импульсов по фронту сигнала на дифференцирующих RC цепях (вроде правильно написал!?), посмотрим, как с ним будет работать (детальки заказал, думаю послезавтра будут, как придут - протестирую)
Поэтому Господа Электронщики, прошу вашей помощи. А именно: как подать импульс с датчика на ногу МК. Верны ли мои догадки?
Вот технические данные: макс. напряжение с датчика 2,5В , макс. обороты двигла: 10000 об/мин
ЗЫ: по поводу темы тахометра перерыл весь русскоязычний и немецкоязычный интернет, нашел несколько описаний, если надо, могу дать ссылки.
gonzales06, предлагаю объедениться.