реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Работа с датчиком скорости авто (AVR)
Athlon128
сообщение Apr 28 2006, 16:41
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 18-04-06
Пользователь №: 16 238



Хочу сделать цифровой спидометр для машины, добавить всяких функций вроде измерения времени разгона до 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
Go to the top of the page
 
+Quote Post
MMP
сообщение Apr 29 2006, 04:22
Сообщение #2


Участник
*

Группа: Новичок
Сообщений: 43
Регистрация: 7-07-05
Из: г.Магнитогорск
Пользователь №: 6 618



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

Я не силен в Кодевижн, но зачем два lcd_init(16) ? и где само прерывание по ноге?
Go to the top of the page
 
+Quote Post
Athlon128
сообщение Apr 29 2006, 08:30
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 18-04-06
Пользователь №: 16 238



Попробовал использовать 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
Прикрепленные файлы
Прикрепленный файл  111.txt ( 1.22 килобайт ) Кол-во скачиваний: 134
 
Go to the top of the page
 
+Quote Post
Proton
сообщение Apr 29 2006, 10:15
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 185
Регистрация: 3-08-05
Из: Новосибирск
Пользователь №: 7 334



У тебя условие внешнего прерывания настроено на низкий уровень и вполне возможно прерывания возникают слишком часто. Попробуй назначить внешнее прерывание по спадающему или нарастающему фронту.


--------------------
Всяк хорошая мысля к нам приходит опосля.
Go to the top of the page
 
+Quote Post
Athlon128
сообщение Apr 29 2006, 10:28
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 18-04-06
Пользователь №: 16 238



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


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

ЗЫ: Про согласование уровней с датчиком можете что нибудь подсказать?

Сообщение отредактировал Athlon128 - Apr 29 2006, 10:31
Go to the top of the page
 
+Quote Post
Athlon128
сообщение Apr 29 2006, 11:15
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 18-04-06
Пользователь №: 16 238



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

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


Что скажете? Собрать такую же или поменять что-то?
Go to the top of the page
 
+Quote Post
Athlon128
сообщение Apr 30 2006, 13:53
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 18-04-06
Пользователь №: 16 238



Убрал КР1533ТЛ2 и диоды, транзистор взял BC547. Проверил на машине. Всё работает, показания совпадают со спидометром счётмашевского бортового компа. В общем я доволен.
Go to the top of the page
 
+Quote Post
sseett
сообщение May 2 2006, 00:04
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 165
Регистрация: 14-01-05
Из: РФ Приморский край (рег.25)
Пользователь №: 1 939



Убрал КР1533ТЛ2 и диоды
Цитата
Убрал КР1533ТЛ2 и диоды

ТШ и так встроен во вход AVR. А вот на диодах я бы советовал не экономить. Борт-сеть однако! Импульсы в сотни вольт вполне вероятны. Да и керамический кондерчик (для ослабления ВЧ) между входом (AVR) и общим проводом не повредит.
Удачи!
Go to the top of the page
 
+Quote Post
Athlon128
сообщение May 2 2006, 00:20
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 18-04-06
Пользователь №: 16 238



ок, принято, спасибо
Go to the top of the page
 
+Quote Post
Karl
сообщение May 2 2006, 06:24
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 4-02-05
Пользователь №: 2 429



Тоже баловался года 4 назад. Сделал МК, который измерял скорость, пройденный путь, расход топлива. Расход тоже импульсами можно мерять. Бортовой компьютер выдает на один из выводов сколько - то импульсов на литр. Точно не помню уже сколько.
Go to the top of the page
 
+Quote Post
BVU
сообщение May 2 2006, 06:32
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264



Цитата(Karl @ May 2 2006, 10:24) *
...
Расход тоже импульсами можно мерять. Бортовой компьютер выдает на один из выводов сколько - то импульсов на литр. Точно не помню уже сколько.

А вот с этого места поподробней пожалуйста с описанием 'ентого' датчика по расходу топлива!


--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
Go to the top of the page
 
+Quote Post
HBB
сообщение May 2 2006, 07:42
Сообщение #12





Группа: Новичок
Сообщений: 2
Регистрация: 30-08-05
Пользователь №: 8 076



Датчик расхода топлива на карбюраторных машинах выдает 16000 импульсов на 1 литр, на инжекторах не знаю. Выход датчика по моему OK
Go to the top of the page
 
+Quote Post
kalinka16
сообщение May 2 2006, 07:49
Сообщение #13


Участник
*

Группа: Новичок
Сообщений: 42
Регистрация: 30-06-05
Пользователь №: 6 414



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



А где его там искать??? (ВАЗ 08,09,099)????????
Go to the top of the page
 
+Quote Post
HBB
сообщение May 2 2006, 07:54
Сообщение #14





Группа: Новичок
Сообщений: 2
Регистрация: 30-08-05
Пользователь №: 8 076



Искать в магазине, продаются обычно где маршрутниками торгуют, цена вопроса проимерно 400р.
Если найдешь - дефицит однако. smile.gif
Go to the top of the page
 
+Quote Post
m16
сообщение May 2 2006, 08:25
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 242
Регистрация: 27-01-05
Пользователь №: 2 225



Цитата(kalinka16 @ May 2 2006, 11:49) *
А где его там искать??? (ВАЗ 08,09,099)????????



Предназначен для учета топлива потребляемого двигателем (объемом до 2,8 л.) и передачи информации в виде импульсов на маршрутный компьютер.
делают здесь http://www.schetmash.ru/prod/avto~prod~now.html
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 15th July 2025 - 19:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.01485 секунд с 7
ELECTRONIX ©2004-2016