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

 
 
> Работа с датчиком скорости авто (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
 
Start new topic
Ответов
Proton
сообщение Apr 29 2006, 10:15
Сообщение #2


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

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



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


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


Участник
*

Группа: Участник
Сообщений: 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   Работа с датчиком скорости авто (AVR)   Apr 28 2006, 16:41
- - MMP   Если проблема только в таймере, то советую инициал...   Apr 29 2006, 04:22
- - Athlon128   Попробовал использовать 8-битный таймер0, поставив...   Apr 29 2006, 08:30
- - Athlon128   Убрал формулу вычисления скорости из периода, когд...   Apr 29 2006, 11:15
- - Athlon128   Убрал КР1533ТЛ2 и диоды, транзистор взял BC547. Пр...   Apr 30 2006, 13:53
- - sseett   Убрал КР1533ТЛ2 и диодыЦитатаУбрал КР1533ТЛ2 и дио...   May 2 2006, 00:04
- - Athlon128   ок, принято, спасибо   May 2 2006, 00:20
|- - Karl   Тоже баловался года 4 назад. Сделал МК, который из...   May 2 2006, 06:24
|- - BVU   Цитата(Karl @ May 2 2006, 10:24) ... Расх...   May 2 2006, 06:32
|- - Karl   Про карбюраторные ничем помочь не могу - работал с...   May 3 2006, 11:30
- - HBB   Датчик расхода топлива на карбюраторных машинах вы...   May 2 2006, 07:42
|- - kalinka16   Цитата(HBB @ May 2 2006, 10:42) Датчик ра...   May 2 2006, 07:49
- - HBB   Искать в магазине, продаются обычно где маршрутник...   May 2 2006, 07:54
- - m16   Цитата(kalinka16 @ May 2 2006, 11:49) А г...   May 2 2006, 08:25
- - Athlon128   Черт, у меня уже таймеров не осталось, таймер0 для...   May 3 2006, 16:49
|- - Karl   Цитата(Athlon128 @ May 3 2006, 22:49) Чер...   May 4 2006, 03:24
- - VladislavS   На тахометр приборной доски идет специальный прово...   May 4 2006, 11:48
- - VladimirZ   Протокол обмена KWP2000 можно найти на www.almisof...   May 5 2006, 14:38
|- - Karl   Цитата(VladimirZ @ May 5 2006, 20:38) Про...   May 6 2006, 03:50
- - VladislavS   Машина не лучшее место для обучения программирован...   May 6 2006, 05:39


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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 21:43
Рейтинг@Mail.ru


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