Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Работа с датчиком скорости авто (AVR)
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Athlon128
Хочу сделать цифровой спидометр для машины, добавить всяких функций вроде измерения времени разгона до 100 или времени прохождения 402 м, учесть погрешность, например, при смене колёс с R13 на R14 biggrin.gif biggrin.gif ну и т.д. и вообще хочу иметь постоянно работающий перед глазами цифровой спидометр.
На начальном этапе стоит задача измерения частоты импульсов с датчика скорости (таз 21099i). Датчик выдаёт 6004 импульса на 1 км пути, т.е. 6 импульсов на 1 м. Частота импульсов прямопропорциональна скорости авто.

Начал делать на Кодевижене. Алгоритм такой: в main стартует таймер0, контроллер постоянно обновляет lcd дисплей из переменной. По прерыванию с ноги: останавливаю таймер0, ссчитываю его значение в переменную, обнуляю его, стартую таймер.

ATmega8515, 4МГц, в качестве ДС At90S2313, который формирует прямоугольные импульсы длиной 10мс, время между импульсами 10мс.

По началу использовал 8-битный таймер, при делителе частоты таймера 1024, в счётчике было значение 0-1, при делителе 1 в счётчике 69-70, хотя должно быть несколько тысяч. Я так понимаю он несколько раз успевает переполниться?

Нашёл в нете исходник на C маршрутного компьютера, который умеет мерять скорость с ДС. В нём используется 16-битный таймер1:
Код
void IRQ_Speedometer_Lable(void) interrupt 0
{
  // Считываем значение интервала между метками скорости в числе 0.5 мксек.
  union LONG_INT
    {
      unsigned long int Long;
      unsigned char Byte[4];
    };
  union LONG_INT Interval;
  unsigned int Tmp;

  TR1=0;
  Interval.Byte[3]=TL1; Interval.Byte[2]=TH1;
  Interval.Byte[1]=Speed_Interval; Interval.Byte[0]=0;
  TH1=TL1=0;
  Speed_Interval=0;
  TR1=1;

  // Вычисляем текущую скорость движения.
  Tmp=((16666666/Interval.Long)*72)/100;
  Speed=Tmp/10;
  if((Tmp%10) >= 5) Speed++;

  // Смотрим, разрешен ли подсчет параметров маршрута.
  if((Trip_Params.State&0x01) != 0)
    {
      // Инкрементируем счетчик пройденного расстояния.
      Trip_Params.Passed_Distance++;
    }

  return;
}

Так и не понял что за переменная speed_interval, ну это не столь важно.

Попробовал переделать свою прогу под таймер1, но никогда им не пользовался, напортачил, в таймере всегда 0. Посмотрите плиз:
Код
#include <mega8515.h>
#include <stdio.h>
#include <delay.h>

// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x15;PORTC
#endasm
#include <lcd.h>

char lcd_buffer[33];

// Процедуры
void init(void);
void imp(void);        
unsigned char k;

  union LONG_INT
    {
      unsigned long int Long;
      unsigned char Byte[4];
    }Interval;

unsigned int Tmp;

interrupt [2] comp(void){imp();}


//---------------------------------------- Инициализация -----------------------------------------------

void init(void)
{lcd_init(16);

TCCR1B=0x81;

GICR|=0x40;
MCUCR=0x00;
EMCUCR=0x00;
GIFR=0x40;

DDRD=0x00;
PORTD=0xff;
lcd_init(16);

#asm("sei")
k=0;
}

//------------------------------------- Процедура вызываемая по Int0 ------------------------------------------

void imp(void)
{  unsigned char Speed_Interval;
Speed_Interval=0; // ???

TCCR1B=0x00;
  Interval.Byte[3]=TCNT1L; Interval.Byte[2]=TCNT1H;
  Interval.Byte[1]=Speed_Interval; Interval.Byte[0]=0;
  TCNT1H=TCNT1L=0;
  Speed_Interval=0;
TCCR1B=0x81;

  // Вычисляем текущую скорость движения.
  Tmp=((16666666/Interval.Long)*72)/100;
  k=Tmp/10;
  if((Tmp%10) >= 5) k++;

   sprintf(lcd_buffer,"Скорость: %d",k);
  return;
}

//----------------------------------- Главная процедура -----------------------------------------------
void main(void)
{
init();
#pragma ruslcd+
while (1)
{

lcd_clear();

lcd_puts(lcd_buffer);
delay_ms(100);
}
#pragma ruslcd-
}


Буду благодарен любой помощи wink.gif
MMP
Если проблема только в таймере, то советую инициализацию таймеров делать через ImageCraft, там это намного удобнее.
Есть там такая примочка >Tools>Application builder

Я не силен в Кодевижн, но зачем два lcd_init(16) ? и где само прерывание по ноге?
Athlon128
Попробовал использовать 8-битный таймер0, поставив прерывание по переполнению и считать эти переполнения, умножать на 256 и прибавлять значение из TCNT0. Всё по прежнему. Кол-во переполнений всегда = 0. При частоте таймера 3,9 кГц TCNT0 колеблется между 0 и 1, если частота таймера 4 мГц, то TCNT0=69-70.
Эмуляцию датчика скорости проверил осциллографом, всё как и писал выше: 10мс длительность импульса и 10мс время между импульсами.

Мой код в аттаче.
На дисплее в итоге
0+0*256=0
1+0*256=1

help.gif
Proton
У тебя условие внешнего прерывания настроено на низкий уровень и вполне возможно прерывания возникают слишком часто. Попробуй назначить внешнее прерывание по спадающему или нарастающему фронту.
Athlon128
Цитата(Proton @ Apr 29 2006, 16:15) *
У тебя условие внешнего прерывания настроено на низкий уровень и вполне возможно прерывания возникают слишком часто. Попробуй назначить внешнее прерывание по спадающему или нарастающему фронту.


Охренеть, заработало!! Спасибо!
Таймер насчитывает 75, хотя по расчётам должно быть 78, но это приемлемо

ЗЫ: Про согласование уровней с датчиком можете что нибудь подсказать?
Athlon128
Убрал формулу вычисления скорости из периода, когда таймер отключен. Теперь таймер отсчитывает 78 как и положено по рассчётам a14.gif cheers.gif cheers.gif cheers.gif

В схеме бортового компьютера такое подключение датчика:


Что скажете? Собрать такую же или поменять что-то?
Athlon128
Убрал КР1533ТЛ2 и диоды, транзистор взял BC547. Проверил на машине. Всё работает, показания совпадают со спидометром счётмашевского бортового компа. В общем я доволен.
sseett
Убрал КР1533ТЛ2 и диоды
Цитата
Убрал КР1533ТЛ2 и диоды

ТШ и так встроен во вход AVR. А вот на диодах я бы советовал не экономить. Борт-сеть однако! Импульсы в сотни вольт вполне вероятны. Да и керамический кондерчик (для ослабления ВЧ) между входом (AVR) и общим проводом не повредит.
Удачи!
Athlon128
ок, принято, спасибо
Karl
Тоже баловался года 4 назад. Сделал МК, который измерял скорость, пройденный путь, расход топлива. Расход тоже импульсами можно мерять. Бортовой компьютер выдает на один из выводов сколько - то импульсов на литр. Точно не помню уже сколько.
BVU
Цитата(Karl @ May 2 2006, 10:24) *
...
Расход тоже импульсами можно мерять. Бортовой компьютер выдает на один из выводов сколько - то импульсов на литр. Точно не помню уже сколько.

А вот с этого места поподробней пожалуйста с описанием 'ентого' датчика по расходу топлива!
HBB
Датчик расхода топлива на карбюраторных машинах выдает 16000 импульсов на 1 литр, на инжекторах не знаю. Выход датчика по моему OK
kalinka16
Цитата(HBB @ May 2 2006, 10:42) *
Датчик расхода топлива на карбюраторных машинах выдает 16000 импульсов на 1 литр, на инжекторах не знаю. Выход датчика по моему OK



А где его там искать??? (ВАЗ 08,09,099)????????
HBB
Искать в магазине, продаются обычно где маршрутниками торгуют, цена вопроса проимерно 400р.
Если найдешь - дефицит однако. smile.gif
m16
Цитата(kalinka16 @ May 2 2006, 11:49) *
А где его там искать??? (ВАЗ 08,09,099)????????



Предназначен для учета топлива потребляемого двигателем (объемом до 2,8 л.) и передачи информации в виде импульсов на маршрутный компьютер.
делают здесь http://www.schetmash.ru/prod/avto~prod~now.html
Karl
Про карбюраторные ничем помочь не могу - работал с инжекторными. В инжекторном автомобиле импульсы ввыдаются с блока управления.

Описание выводов контроллера Январь 5.х.х.
Номер вывода Описание
1 Выход. Зажигание 1-4 цилиндра. МЗ/1-4
.
.
.
54 Выход. Сигнал расхода топлива. СРТ
55 Вход/Выход К-линия диагностики. К-ЛИНИЯ

Кажется 16000 импульсов на литр. Точно не помню.

К сожалению, не сохранилось никакой документации в электронном виде. Но всю информацию брал из интренета + книжка по системе впрыска.
Удачи smile.gif
Athlon128
Черт, у меня уже таймеров не осталось, таймер0 для измерения скорости, таймер1 - счётчик времени для замера времени разгона 0-100 км/ч и 402 м. glare.gif

Ну раз такая тема с датчиком расхода топлива blink.gif , придётся освободить таймер1, все равно поиграюсь с этими замерами времени разгона и надоест smile.gif

ЗЫ: хотя 16000 импульсов на литр - довольно большая частота получается, может без таймера попробовать обойтись, как считаете?
И ещё по поводу тахометра, никто не в курсе где и какие импульсы брать?
Или уж проще по k-line связываться, вся ж эта инфа у контроллера естьsmile.gif.....
Karl
Цитата(Athlon128 @ May 3 2006, 22:49) *
Черт, у меня уже таймеров не осталось, таймер0 для измерения скорости, таймер1 - счётчик времени для замера времени разгона 0-100 км/ч и 402 м. glare.gif

Ну раз такая тема с датчиком расхода топлива blink.gif , придётся освободить таймер1, все равно поиграюсь с этими замерами времени разгона и надоест smile.gif

ЗЫ: хотя 16000 импульсов на литр - довольно большая частота получается, может без таймера попробовать обойтись, как считаете?
И ещё по поводу тахометра, никто не в курсе где и какие импульсы брать?
Или уж проще по k-line связываться, вся ж эта инфа у контроллера естьsmile.gif.....



По поводу тахометра - сигнал с датчика положения коленвала можно брать, наверное. Но сам я не пробовал. Еще с блока управления на тахометр какой - то сигнал идет... но о нем тоже сказать ничего не могу.
По связи по k-line. Этим я тоже баловался. У меня есть документ Keyword Protokol 2000 - спецификация канала связи между контроллерами системы управления двигателем Motronic 1.5.4 или Январь-5 и диагностическим оборудованием. Этот документ сохранился, к сожалению, только в печатном виде. Может найдете в интернет.
VladislavS
На тахометр приборной доски идет специальный провод от контроллера двигателя. Импульсы равны оборотам.

А вообще, не занимайтесь ерундой. На инжекторную зубилу давно придуман Comfort X15. За то время что ты тратишь можно на 10 таких заработать.
VladimirZ
Протокол обмена KWP2000 можно найти на www.almisoft.ru/doc.htm. Там же и схемку контроллера можно поискать и посмотреть например интерфейс ДС.
При обмене опо K-Line всё же таймер понадобится таймауты и др. Измерение расхода по длительности импульса впрыска большой точности не даст, как и использование датчика расхода там в описании погрешность от 7-ми до 30-ти %.
Karl
Цитата(VladimirZ @ May 5 2006, 20:38) *
Протокол обмена KWP2000 можно найти на www.almisoft.ru/doc.htm. Там же и схемку контроллера можно поискать и посмотреть например интерфейс ДС.
При обмене опо K-Line всё же таймер понадобится таймауты и др. Измерение расхода по длительности импульса впрыска большой точности не даст, как и использование датчика расхода там в описании погрешность от 7-ми до 30-ти %.


Блок управления двигателем измеряет расход только по длительности импульсов впрыска. И точность вполне птреемлемая.

Цитата(VladislavS @ May 4 2006, 17:48) *
А вообще, не занимайтесь ерундой. На инжекторную зубилу давно придуман Comfort X15. За то время что ты тратишь можно на 10 таких заработать.


Согласен, преобрести МК проблем нет. Но Цель тех, кто этим занимается, вовсе не сэкономить денек на покупку. Сейчас бы я за эту работу не взялся. А когда только начинал программировать, было очень интересно и преобрел много опыта. Еще узнал, что спалить БУД очень сложно smile.gif
VladislavS
Машина не лучшее место для обучения программированию. Ведь от этого зависит ваша и окружающих жизнь. Подумайте над этим.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.