Электроника средств транспорта Ремонт и разработка дополнительного автооборудования. Бортовые компьютеры и многое другое. |
04.07.2012, 17:46
|
|
Прописка
Регистрация: 03.06.2012
Сообщений: 159
Сказал спасибо: 8
Сказали Спасибо 10 раз(а) в 10 сообщении(ях)
|
Re: Самодельный круиз-контроль
Да, очень хочется, чтобы заработало у всех!
И даже с такими кривыми датчиками, как у нас ).
Был еще вариант - активировать prescaler у счетчика импульсов ICP и считать по 4..16 импульсов. Но тогда для минимальной скорости наши измерения займут явно больше чем 100мс с нашими немногоимпульсными датчиками...
Посему - вижу единственный способ - считать кол-во импульсов за какой-то большой период (300..500мс), и считать точное время от фронта до фронта. Два таймера - счетный и основной, даже с периодом 100мс, а так же прерывание по ICP (которое надо включать только для двух фронтов - первого, и последнего) - решат эту проблему. Единственное - надо правильно это реализовать.
Если б проект был написан на С - я бы с удовольствием присоединился к разработке софта. Но увы, пока могу помочь только идеей.
gnomon72, можете сказать какие таймеры для каких целей задействованы и как считают?
|
|
|
|
04.07.2012, 20:40
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.06.2010
Сообщений: 1,223
Сказал спасибо: 13
Сказали Спасибо 176 раз(а) в 123 сообщении(ях)
|
Re: Самодельный круиз-контроль
Да какие там могут быть таймеры, кроме единственного 16-разрядного Timer1.
Как в штатном драйвере считает примерно понятно, т.к. других вариантов нет.
1. Поднимаем флаг запуска прерывания по ICP
2. Выбираем примерную базу замера. Например 100 мсек. И запускаем ей отсчет.
2. Ждем первый фронт
3. Получили 1-й фронт в прерывании и обнуляем Timer1 - начинаем замерять интервал до 2-го фронта.
4. Получили 2-й фронт. Считали аппаратно захваченное прерыванием значение Timer1. Это и есть период между двумя импульсами в тактах с учетом прескалера. Сохранили период. Обнулили Timer1.
5. Получили 3-й фронт. Считали аппаратно захваченное прерыванием значение Timer1. Прибавили его к предыдущему и сохранили. Обнулили Timer1.
....
И т.д. и т.п. продолжаем складывать периоды пока база замера не закончилась. Точность её отсчета никакой роли не играет. Естественно ещё и считаем количество полученных периодов.
Делим сумму периодов на их количество и получаем средний период за базу замера.
Если база короткая, то на низких скоростях вообще ничерта не получаем, т.к. для замера нужна минимум пара импульсов в базе., т.е. для 100 мсек это минимум надо 20 Герц на входе иметь.
Поскольку штатный драйвер умудряется замерить скорость вплоть до 1,8 км/ч, то полагаю, что он реально меряет непрерывно, а базу использует, чтобы в её рамках получать только последние импульсы, если же их не хватает, то берет период ближайших импульсов за пределами базы.
Я самопальный драйвер написал. На 6-импульсном меряет с точностью до 0,02 км/ч с генератора на частоте 50 Гц.
Анди там спрашивал нафига точность нужна. Для скорости такая особо не нужна, зато нужна для получения точного ускорения, что очень важно.
Например с дискретным замерам по количеству импульсов пусть дискрета будет 0,4 км/ч.
Пример:
Скорость реальная 60 км/ч, дискретная замеренная скорость 60 км/ч, периодически замеренная скорость 60 км/ч
Через 1 секунду.
Скорость реальная 60,1 км/ч, дискретная замеренная скорость 60,4 км/ч (переход на шаг дискреты 0,4), периодически замеренная скорость 60,1 км/ч
Реальное ускорение 0,1 км/ч*с, ускорение по дискретному замеру 0,4 км/ч*с, по периодическому 0,1 км/ч*с.
Отличие ускорений в методиках замера получается в 4 раза, хотя разница в скоростях всего 0,4%. Адекватно корректировать дроссель на упреждение по ускорению уже не получится.
Последний раз редактировалось gnomon72; 04.07.2012 в 23:49.
|
|
|
|
04.07.2012, 22:20
|
|
Временная регистрация
Регистрация: 07.04.2012
Адрес: Москва
Сообщений: 97
Сказал спасибо: 12
Сказали Спасибо 24 раз(а) в 21 сообщении(ях)
|
Re: Самодельный круиз-контроль
Сообщение от gep
|
1) У меня нет АБС
2) АБС относится к системам безопастности - знаю что можно, но стремно туда лезть
3) разнообразие сигналов у разных людей повторяющих схему резко возрастет ИМХО
|
1.Смотря какая машина.На многих авто сейчас,да и раньше впрочем, узлы унифицированы,АБС может и не быть,а вот зубчатые диски в колесах могут стоять,да и место под датчик в ступице тоже будет при этом.Если иномарка,то снимите колесо,тормозной диск и поглядите ,что там.
2.Безопасность конечно безопасность,но АБС от глюков защищена,если что,то просто она отключится и загорится лампочка,просто будет авто без АБС,тормозить она сама не умеет.Как уже сказали -высокоомный вход решает проблему глюка.Кстати датчик АБС мощный,они индуктивные как привило ,он способен зажечь даже лампочку накаливания от фонаря ,3.5 вольта ![Улыбка](images/smilies/icon_smile.gif)
3.Тут только будет разница в количестве импульсов на метр,датчики то везде индуктивные практически.
ЗЫ: я буду делать на АБС ,благо оно есть и провод с заднего колеса проходит прямо у блока КК,тут же там и разъем переходной имеется,к нему и подпаяюсь.Правда придется тестить на прошивке для 2.55 импульса,ибо перепрошить нет пока никакой возможности.
|
|
|
|
04.07.2012, 22:54
|
|
Вид на жительство
Регистрация: 06.07.2006
Адрес: zp.ua
Сообщений: 393
Сказал спасибо: 2
Сказали Спасибо 21 раз(а) в 18 сообщении(ях)
|
Re: Самодельный круиз-контроль
Пока ведутся дебаты по ДС решил выложить мою версию индикатора. Прошивка расчитана на вывод текстовой версии посылок от КК, т.е. ту, которую обычно подключают для снятия логов на комп. Удобно - не надо перепрошивать для индикатора и логов.
Начну со схемы:
Как видно всё просто. На дисплей выводится в таком формате:
![](https://kazus.ru/forums/attachment.php?attachmentid=36467&stc=1&d=1341427376)
Первая строка:
On|Off - Круиз включен или выключен,
K|N|D - таблица (Комфорт, Норма, Динамик)
f 0.0 - зафиксированная скорость, если ›99.9, то "1" выводится на месте "f"
s 0.0 - текущая скорость, с сотнями также - замещается "s"
Вторая строка:
_ - падающая палка. Каждая принятая посылка опускает палку на один пиксель вниз, потом начинается опять сверху. Хорошо видно, работает ли КК и сыплются ли данные.
00 - Ошибка. Первый символ - прямо из строки, второй сохраняется в памяти и выводится до появления следующей ошибки.
d 0.0 - Перемещение привода в %.
u60.0 - Пользовательская скорость, сотни отображаются так же, как в "f" и "f".
Прошивка писана в CodeVisionAVR v2.05.3, расписаны все параметры, передаваемые в строке, но не все выводятся, можно подкорректировать - там всё просто.
Во вложении HEX и исходник.
На всякий случай повторю формат посылок:
Код:
|
// текстовый формат ***********************************
// Формат буфера текст, 55 байт. Разделитель данных ";" двоеточие.
// Индекс, целое без знака - 5 байт
// Режим работы КК (0/1), целое без знака - 1 байт
// Текущая таблица (1-2-3), целое без знака - 1 байт
// Текущая скорость стабилизации в км/ч, один разряд после запятой без знака - 5 байт
// Текущая скорость в км/ч, один разряд после запятой без знака - 5 байт
// Ошибка скорости в км/ч, один разряд после запятой со знаком - 6 байт
// Ошибка скорости в см/с, целое со знаком - 5 байт
// Ускорение в см/c^2, целое со знаком - 5 байт
// Перемещение привода в %, один разряд после запятой со знаком - 5 байт
// Скорость пользователя в км/ч, один разряд после запятой без знака - 5 байт
// Флаг состояния - 1 байт, целое без знака:
// 0 - Всё OK
// 1 - Power-on Reset Flag
// 2 - External Reset Flag
// 3 - Brown-out Reset Flag
// 4 - Watchdog Reset Flag
// 5 - JTAG Reset Flag
// 6 - Предельное время работы привода
// 7 - Выход за пределы разрешенного диапазона скоростей |
выглядят они так:
Код:
|
3516;0;2; 0.0; 0.0; 0.0; 0; 0; 0.0; 60.0;0;
3517;0;2; 0.0; 0.0; 0.0; 0; 0; 0.0; 60.0;0;
3518;0;2; 0.0; 0.0; 0.0; 0; 0; 0.0; 60.0;0;
3519;0;2; 0.0; 0.0; 0.0; 0; 0; 0.0; 60.0;0;
3520;0;2; 0.0; 0.0; 0.0; 0; 0; 0.0; 60.0;0;
3521;0;2; 0.0; 0.0; 0.0; 0; 0; 0.0; 60.0;0;
3522;0;2; 0.0; 0.0; 0.0; 0; 0; 0.0; 60.0;0; |
Последний раз редактировалось hardlock; 04.07.2012 в 22:57.
|
|
|
|
05.07.2012, 00:02
|
|
Прописка
Регистрация: 03.06.2012
Сообщений: 159
Сказал спасибо: 8
Сказали Спасибо 10 раз(а) в 10 сообщении(ях)
|
Re: Самодельный круиз-контроль
gnomon72, Алгоритм выглядит красиво. Только смысла обнулять таймер при каждом импульсе я не вижу ).
Таймер не должен переполниться в течение интервала замера. Или же по прерыванию о переполнении таймера мы можем считать количество переполнений. А лучше - самим таймером 1 считать интервал замера. Тогда получается:
1. Поднимаем флаг запуска прерывания по ICP
2. Выбираем примерную базу замера. Например 100 мсек.
2. Ждем первый фронт
3. Получили 1-й фронт и в прерывании обнуляем таймер1 и запускаем его. Тут же считаем значение таймера для базы замера и записываем это значение в ловушку таймера1. Обнуляем счетчик импульсов.
4. Получили 2-й фронт. Ничего не делаем с таймером, просто инкрементируем счетчик импульсов.
5. Получили 3-й фронт. Ничего не делаем с таймером, просто инкрементируем счетчик импульсов.
....
И т.д. и т.п. продолжаем считать периоды пока база замера не закончилась. Как только значение таймера1 сравнялось со значением в ловушке - получаем прерывание. Но таймер еще не трогаем.
6. Смотрим кол-во периодов. Если 0 - то импульсов не было, измерение не валидно. Если больше - разрешаем прерывание по ICP.
7. Получаем прерывание - последний фронт. Сохраняем значение таймера. Делим его на количество импульсов. Результат - и есть искомый средний период.
Так гораздо меньше ресурсов проца пользуется, но точность наоборот - выше, потому что таймер1 считает сам по себе, без нашего вмешательства.
|
|
|
|
05.07.2012, 00:02
|
|
Прописка
Регистрация: 03.06.2012
Сообщений: 159
Сказал спасибо: 8
Сказали Спасибо 10 раз(а) в 10 сообщении(ях)
|
Re: Самодельный круиз-контроль
hardlock, Браво! Хорошая работа!!!
|
|
|
|
05.07.2012, 00:57
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.06.2010
Сообщений: 1,223
Сказал спасибо: 13
Сказали Спасибо 176 раз(а) в 123 сообщении(ях)
|
Re: Самодельный круиз-контроль
Сообщение от Alex_Sss
|
gnomon72, Алгоритм выглядит красиво. Только смысла обнулять таймер при каждом импульсе я не вижу )...
Так гораздо меньше ресурсов проца пользуется, но точность наоборот - выше, потому что таймер1 считает сам по себе, без нашего вмешательства.
|
Я описал предполагаемый алгоритм работы штатной процедуры замера периодов, которая скорее всего работает непрерывно и чтобы не получать регулярно прерывание по переполнению таймера имеет резон обнулять его при каждом импульсе, а переполнение получает только, если импульсов долго нет, т.е. замер вышел за пределы нижней границы измерений. Удобно, чтобы выдать ошибку. Как пришло переполнение, значит частота не измеряемая.
У меня по другому сделано.
Я собираю фиксированное количество периодов от начала базы замера не в сумму, а каждый отдельно для дальнейшего их анализа на предмет сильного отклонения периодов отдельных импульсов, чтобы выкидывать заведомо бракованные из последующего усреднения. Соответственно обнулять таймер приходится по каждому фронту, хотя можно просто вычитать из нового значения таймера старое. Но это требует сохранения старого значения и операции двухбайтного вычитания, что получается дольше, чем просто обнулить таймер.
Последний раз редактировалось gnomon72; 05.07.2012 в 01:12.
|
|
|
|
05.07.2012, 01:13
|
|
Прописка
Регистрация: 03.06.2012
Сообщений: 159
Сказал спасибо: 8
Сказали Спасибо 10 раз(а) в 10 сообщении(ях)
|
Re: Самодельный круиз-контроль
Сообщение от gnomon72
|
У меня по другому сделано.
Я собираю фиксированное количество периодов от начала базы замера не в сумму, а каждый отдельно для дальнейшего их анализа на предмет сильного отклонения периодов отдельных импульсов, чтобы выкидывать заведомо бракованные из последующего усреднения. Соответственно обнулять таймер приходится по каждому фронту, хотя можно просто вычитать из нового значения таймера старое. Но это требует сохранения старого значения и операции двухбайтного вычитания, что получается дольше, чем просто обнулить таймер.
|
А нужно ли делать сложнее, если можно сделать просто и точно?
|
|
|
|
05.07.2012, 01:15
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.06.2010
Сообщений: 1,223
Сказал спасибо: 13
Сказали Спасибо 176 раз(а) в 123 сообщении(ях)
|
Re: Самодельный круиз-контроль
Сообщение от Alex_Sss
|
А нужно ли делать сложнее, если можно сделать просто и точно?
|
Так ведь проблема то не в том, чтобы померить средний период импульсов за какое то время, а в том, чтобы удалить бракованные периоды от корявых ДС.
Иначе бы и смысла дергаться не было, т.к. штатный замер работает идеально.
|
|
|
|
05.07.2012, 01:18
|
|
Прописка
Регистрация: 03.06.2012
Сообщений: 159
Сказал спасибо: 8
Сказали Спасибо 10 раз(а) в 10 сообщении(ях)
|
Re: Самодельный круиз-контроль
gnomon72, У меня есть ощущение, что штатный замер измеряет лишь один период. Поэтому так и скачет.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:36.
|
|