|
Работа с датчиком скорости авто (AVR) |
|
|
|
Apr 28 2006, 16:41
|
Участник

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

|
Хочу сделать цифровой спидометр для машины, добавить всяких функций вроде измерения времени разгона до 100 или времени прохождения 402 м, учесть погрешность, например, при смене колёс с R13 на R14  ну и т.д. и вообще хочу иметь постоянно работающий перед глазами цифровой спидометр. На начальном этапе стоит задача измерения частоты импульсов с датчика скорости (таз 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- } Буду благодарен любой помощи
|
|
|
|
|
Apr 29 2006, 04:22
|
Участник

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

|
Если проблема только в таймере, то советую инициализацию таймеров делать через ImageCraft, там это намного удобнее. Есть там такая примочка >Tools>Application builder
Я не силен в Кодевижн, но зачем два lcd_init(16) ? и где само прерывание по ноге?
|
|
|
|
|
Apr 29 2006, 08:30
|
Участник

Группа: Участник
Сообщений: 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
Прикрепленные файлы
111.txt ( 1.22 килобайт )
Кол-во скачиваний: 134
|
|
|
|
|
Apr 29 2006, 10:28
|
Участник

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

|
Цитата(Proton @ Apr 29 2006, 16:15)  У тебя условие внешнего прерывания настроено на низкий уровень и вполне возможно прерывания возникают слишком часто. Попробуй назначить внешнее прерывание по спадающему или нарастающему фронту. Охренеть, заработало!! Спасибо! Таймер насчитывает 75, хотя по расчётам должно быть 78, но это приемлемо ЗЫ: Про согласование уровней с датчиком можете что нибудь подсказать?
Сообщение отредактировал Athlon128 - Apr 29 2006, 10:31
|
|
|
|
|
Apr 30 2006, 13:53
|
Участник

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

|
Убрал КР1533ТЛ2 и диоды, транзистор взял BC547. Проверил на машине. Всё работает, показания совпадают со спидометром счётмашевского бортового компа. В общем я доволен.
|
|
|
|
|
May 2 2006, 00:04
|
Частый гость
 
Группа: Участник
Сообщений: 165
Регистрация: 14-01-05
Из: РФ Приморский край (рег.25)
Пользователь №: 1 939

|
Убрал КР1533ТЛ2 и диоды Цитата Убрал КР1533ТЛ2 и диоды ТШ и так встроен во вход AVR. А вот на диодах я бы советовал не экономить. Борт-сеть однако! Импульсы в сотни вольт вполне вероятны. Да и керамический кондерчик (для ослабления ВЧ) между входом (AVR) и общим проводом не повредит. Удачи!
|
|
|
|
|
May 2 2006, 00:20
|
Участник

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

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

|
Датчик расхода топлива на карбюраторных машинах выдает 16000 импульсов на 1 литр, на инжекторах не знаю. Выход датчика по моему OK
|
|
|
|
|
May 2 2006, 07:49
|
Участник

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

|
Цитата(HBB @ May 2 2006, 10:42)  Датчик расхода топлива на карбюраторных машинах выдает 16000 импульсов на 1 литр, на инжекторах не знаю. Выход датчика по моему OK А где его там искать??? (ВАЗ 08,09,099)????????
|
|
|
|
|
May 2 2006, 07:54
|
Группа: Новичок
Сообщений: 2
Регистрация: 30-08-05
Пользователь №: 8 076

|
Искать в магазине, продаются обычно где маршрутниками торгуют, цена вопроса проимерно 400р. Если найдешь - дефицит однако.
|
|
|
|
|
May 2 2006, 08:25
|
Местный
  
Группа: Свой
Сообщений: 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
|
|
|
|
|
May 3 2006, 11:30
|
Частый гость
 
Группа: Свой
Сообщений: 179
Регистрация: 4-02-05
Пользователь №: 2 429

|
Про карбюраторные ничем помочь не могу - работал с инжекторными. В инжекторном автомобиле импульсы ввыдаются с блока управления. Описание выводов контроллера Январь 5.х.х. Номер вывода Описание 1 Выход. Зажигание 1-4 цилиндра. МЗ/1-4 . . . 54 Выход. Сигнал расхода топлива. СРТ 55 Вход/Выход К-линия диагностики. К-ЛИНИЯ Кажется 16000 импульсов на литр. Точно не помню. К сожалению, не сохранилось никакой документации в электронном виде. Но всю информацию брал из интренета + книжка по системе впрыска. Удачи
|
|
|
|
|
May 3 2006, 16:49
|
Участник

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

|
Черт, у меня уже таймеров не осталось, таймер0 для измерения скорости, таймер1 - счётчик времени для замера времени разгона 0-100 км/ч и 402 м. Ну раз такая тема с датчиком расхода топлива  , придётся освободить таймер1, все равно поиграюсь с этими замерами времени разгона и надоест  ЗЫ: хотя 16000 импульсов на литр - довольно большая частота получается, может без таймера попробовать обойтись, как считаете? И ещё по поводу тахометра, никто не в курсе где и какие импульсы брать? Или уж проще по k-line связываться, вся ж эта инфа у контроллера есть  .....
Сообщение отредактировал Athlon128 - May 3 2006, 16:57
|
|
|
|
|
May 4 2006, 03:24
|
Частый гость
 
Группа: Свой
Сообщений: 179
Регистрация: 4-02-05
Пользователь №: 2 429

|
Цитата(Athlon128 @ May 3 2006, 22:49)  Черт, у меня уже таймеров не осталось, таймер0 для измерения скорости, таймер1 - счётчик времени для замера времени разгона 0-100 км/ч и 402 м. Ну раз такая тема с датчиком расхода топлива  , придётся освободить таймер1, все равно поиграюсь с этими замерами времени разгона и надоест  ЗЫ: хотя 16000 импульсов на литр - довольно большая частота получается, может без таймера попробовать обойтись, как считаете? И ещё по поводу тахометра, никто не в курсе где и какие импульсы брать? Или уж проще по k-line связываться, вся ж эта инфа у контроллера есть  ..... По поводу тахометра - сигнал с датчика положения коленвала можно брать, наверное. Но сам я не пробовал. Еще с блока управления на тахометр какой - то сигнал идет... но о нем тоже сказать ничего не могу. По связи по k-line. Этим я тоже баловался. У меня есть документ Keyword Protokol 2000 - спецификация канала связи между контроллерами системы управления двигателем Motronic 1.5.4 или Январь-5 и диагностическим оборудованием. Этот документ сохранился, к сожалению, только в печатном виде. Может найдете в интернет.
|
|
|
|
|
May 5 2006, 14:38
|
Участник

Группа: Участник
Сообщений: 72
Регистрация: 8-02-05
Из: Харьков
Пользователь №: 2 496

|
Протокол обмена KWP2000 можно найти на www.almisoft.ru/doc.htm. Там же и схемку контроллера можно поискать и посмотреть например интерфейс ДС. При обмене опо K-Line всё же таймер понадобится таймауты и др. Измерение расхода по длительности импульса впрыска большой точности не даст, как и использование датчика расхода там в описании погрешность от 7-ми до 30-ти %.
|
|
|
|
|
May 6 2006, 03:50
|
Частый гость
 
Группа: Свой
Сообщений: 179
Регистрация: 4-02-05
Пользователь №: 2 429

|
Цитата(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 таких заработать. Согласен, преобрести МК проблем нет. Но Цель тех, кто этим занимается, вовсе не сэкономить денек на покупку. Сейчас бы я за эту работу не взялся. А когда только начинал программировать, было очень интересно и преобрел много опыта. Еще узнал, что спалить БУД очень сложно
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|