Перейти к содержанию

Круиз-контроль для Mitsubishi Grandis Atmega8535


Гость еще один max

Рекомендуемые сообщения

почитал топик, сам одно время обдумывал круиз контроль, но остановился, безопасность на дороге важнее.

Как-то невнимательно Вы читали:

Итак, вопросы безопасности и морали беру на себя.

Повторю ставшее расхожим выражение: "Профессионалы построили Титаник, любитель построил Ноев ковчег". Езжу на своем девайсе 2 месяца, сбоев и неадеквата не наблюдалось. Далее - а что там японцы в ЭБУ напихали, знаете точно? И последнее - это мой экстравагантный способ получать адреналин, я ж не предлагаю его Вам ставить?

По схеме, по моему нет смысла устанавливать внешний ЦАП, ШИМа контроллера будет вполне достаточно, просто нужно пересчитать ФНЧ, сделать его более низкоомным (уменьшить номинал резистора раз в 100 и соответственно увеличить емкость, впрочем частоту среза фильтра необходимо уточнить) и увеличить порядок фильтра хотя бы до 4, по точности как ранее и предлагалось напряжение с фнч завести на свободный вход АЦП и соответственно корректировать выход ШИМа.

Ну давайте еще раз про ШИМ... Уменьшение номинала резистора приведет к падению напряжения на выходе ШИМа, и никакая ООС по еще одному каналу АЦП не спасет. Допустим, я выдаю туду все 5 В, т.е. FF пишу в регистр ШИМа. Напряжение немного падает, через АЦП мы это видим... А увеличивать куда? Это ж верхний предел!

Другой вариант - не FF, что-то другое. Падает U, читаем-корректируем, все равно падает, опять корректируем и так пока падение не превысит предела точности измерения, правильно? А время? Мало того, что ШИМ выводится за 255 тактов, так мы еще его меряем (АЦП тоже не мгновенный, в типовой функции еще и задержка есть!), и корректируем. Но у нас же 8 МГц, нам типа плевать! А остальное? Обработка логики, запись-чтение в реестры и память, чтение и запись в другие порты... И финал - водитель резко тормозит или наоборот, совершает резкий обгон (тапка-в-пол), а некоторое количество микросекунд контроллер там еще что-то проверяет, сравнивает... а уж потом выдает то, что от него хотят? Не, чем меньше время от чтения состояния педали до вывода данных в ЭБУ, тем лучше... для безопасности!

Приведу два фрагмента кода из моей прошивки:

Функция работы с внешним ЦАП:

void write_dac(unsigned char pedal)
{
PORTC=pedal;
PORTD.6=0;//Out A
PORTD.7=0;
PORTD.7=1;
PORTC=pedal-delta_pedal;
PORTD.6=1;//Out B
PORTD.7=0;
PORTD.7=1;
}

 

И фрагмент вывода при неактивном режиме поддержки скорости:

//Pedali
 pedal_cur=read_adc(1);
 pedal_cur_duble=read_adc(2);
		//Rejim rabota
  switch (rejim)
  {
	//Dublikacia
	case 0:	 
	case 1:
   write_dac(pedal_cur); 
	break;

 

У меня т.о. вывод на педаль от чтения датчика отделяет несколько десятков тактов при неактивном режиме и до сотни (это максимум) тактов при режиме поддержки.

Примененная мс AD7302 невероятно точна, в паре с Атмегой выдает на выход именно то, что приходит с педали без всякого контроля. Был у меня контроль, заводил на АЦП данные с нее. Потом бросил эту глупую затею - нечего там контролировать.

Да, разумеется, есть и минусы - с увеличением количества корпусов теоретически уменьшается надежность, увеличивается энергопотребление, увеличиваются размер платы и сложность сборки. С удовольствием применил бы мс, у которой есть встроенный ЦАП. Но не нашел такой за разумные деньги. А мой комплект дешев и сердит, особенно если есть возможность купить мс в больших специализированных магазинах типа Платана или Чип&Дипа. Даже с учетом того, что ADшку мне везли под заказ, я на тестовые заезды (на бензин) потратил уже в десять-пятнадцать раз больше, чем себестоимость устройства :smile:

Контроллер будет выдавать только то, что в него заложено. Конечно, никто не гарантирован от сбоев, "watchdog" не панацея, но все-таки способ защиты от зависания... Реле предлагали ставить, но отказоустойчивость реле меньше, чем у контроллера. И нафига тогда? Кстати, "сторожевой пес" пока не сработал ни разу кроме случаев, когда я специально писал тестовые прошивки с ошибкой - искусственно зацикливал прогу в режиме поддержания скорости. Умен, собака (я про контроллер)!

 

Женя, где помощь по коду? На тепловозе катаешься, небось? :smile:

Изменено пользователем еще один max
Ссылка на комментарий
Поделиться на другие сайты

  • Ответов 218
  • Создана
  • Последний ответ

Топ авторов темы

Топ авторов темы

Изображения в теме

Пришла пора начинать публикацию наработок... Если что будет меняться, то очень незначительно.

Схема:

post-1142-1282129850_thumb.jpg

Плата с элементами и шаблон

post-1142-1282130189_thumb.jpg post-1142-1282130199_thumb.jpg

Плата в Лайоуте:

cruise_lay.zip

Пояснения:

J1 - разъем подключения к проводке авто

J2-J3 - джамперы для выбора режимов работы (R2-R3 просто подтягивают входы к +)

Блок внизу справа (диод, 3 кондера и КРЕНка) - стабилизатор питания

С3, R1 и D1 - цепочка сброса при подаче питания

ICSP - разъем подключения программатора

R4-R5 - токоограничивающие резисторы на 2-х цветный светодиод

R6 - подтяжка к + датчика тормоза

R7 - устанавливающий резистор джойстика

Х1 и С1-С2 - задающий кварц с конденсаторами

Вроде все... Так все просто кажется, даже стыдно как-то, что с апреля с этим всем ковырялся :smile:

Далее ожидайте схему в авто (для понятия смысла работы) и прошивку на Си и в файле .hex

Хотя вряд ли кому понадобится...

Ссылка на комментарий
Поделиться на другие сайты

Схема подключения в автомобиле:

post-1142-1282199104_thumb.jpg

Стоит напомнить, что провода, подходящие к 114 и 107 ноге ЭБУ, разрезаются. То, что после разрезания идет в проводку, соединяются с 2 и 3 контактами разъема, это снятие данных с акселератора. То, что осталось присоединено к ЭБУ через разъемы самого ЭБУ, подключается к контактам 7 и 8 разъема контроллера. Не перепутайте ноги, иначе работать не будет!

Датчик скорости присоединяется без разрезания провода! Просто на 88 контакте на ЭБУ аккуратно снимается изоляция, и к нему присоединяется провод (припаивается или плотно скручивается) или изолируется. Я все, конечно, припаивал.

Контакт тормоза - это не основной контакт, который включает стоп-сигнал, а дополнительный. Обратите внимание - он не имеет электрического контакта с проводкой авто и нормально замкнут!

Т.к. масса контроллера и автомобиля соединены, все провода со значком "масса" достаточно прикрутить к ближайшей метталической детали, имеющей контакт с корпусом. Обеспечьте и проверьте хороший электрический контакт!

Пунктиром обведены блоки. Резисторы в блоке джойстика встроены с завода, ничего в него добавлять не надо. Мало того, какой куда контакт джойстика цеплять - не имеет значения, он просто выполняет функцию ступенчатого сопротивления.

Пока все. Прошивку и исходник выложу чуть позже, когда приедет джойстик и я его установлю всместе с концевиком тормоза.

Также сформирую общий файл по контроллеру, куда войдет все, от схемы и прошивки до инструкции по установки с фотографиями.

Ссылка на комментарий
Поделиться на другие сайты

макс привет!!!

сорри чуть папозжа...счаз в командировке вота...приеду всё будет)))!!!

Привет, Жека!

Я уже решил, вот смотри, просто вместо просчета разности скоростей ввел новую переменную:

// Declare your global variables here
signed char delta_speed;

 

Далее проверяю ее значение и обрезаю ненужные "хвосты":

delta_speed=speed_cur-speed_ecu;
if (delta_speed>=10) delta_speed=10;
if (delta_speed<=-10) delta_speed=-10;
pedal_ecu=0.45*speed_ecu+40-5*delta_speed;

 

Туповато, конечно, но логика прозрачна и понятна, и я гарантирован от переполнения переменной "pedal_ecu", т.к. приращение больше 50 не получится. Это еще и позволило мне применить коэфф. 5 вместо 4, так скорость более цепко держит. 6-7 должно быть еще лучше (более цепко), но так бросок скорости при восстановлении будет большой (из опыта). А вот 5 в самый раз.

Век живи, век учись... Долго читал Интернет по поводу преобразования данных между разными типами переменных в Си. Понял много чего:

- если есть возможность, надо преобразования избегать

- имеет значение форма записи констант в формуле, например "5" или "5,0" влияет на получаемый результат не только по значению, но и по виду получаемой переменной

- можно принудительно задавать тип получаемого значения

Мне все это, к сожалению, не пригодилось. Но в мозг отложил, чем больше копаюсь, тем больше Си нравится!

Ссылка на комментарий
Поделиться на другие сайты

Попались мне на грех статьи про UART...

Гуру, скажите - что, реально сделать так, чтобы контроллер общался с ПК? Допустим, через бутлоадер? Т.е. возможна такая ситуация: устройство стоит где-то внутри механизма (круиз-контроль внутри машины), в бардачек выведен USB-разъем, садишься в машину с ноутом, подключаешься по UART к контроллеру, даешь команду, бутлоадер принимает новую прошивку и заливает ее в контроллер? И после отключения ноута при подаче питания стартует уже с новой прошивкой?

А если в бутлоадере прописать ключ дешифрации, то прошивку можно будет заливать закодированной для того, чтобы не скомуниздили конкуренты-китаёзы?

Видимо, похожим образом прошивки в спутниковые ресиверы заливаются?

Как все здорово придумано...

В круиз-то добавлять такое бессмысленно, но при проектировании более сложного устройства все может быть... Можно прям на плату добавить контроллер UART-USB :smile:

Ссылка на комментарий
Поделиться на другие сайты

to max

"Ну давайте еще раз про ШИМ... Уменьшение номинала резистора приведет к падению напряжения на выходе ШИМа, и никакая ООС по еще одному каналу АЦП не спасет. Допустим, я выдаю туду все 5 В, т.е. FF пишу в регистр ШИМа. Напряжение немного падает, через АЦП мы это видим... А увеличивать куда? Это ж верхний предел!"

С чего вы взяли, что с уменьшением резистора в цепи фильтра до 1-2 ком существенно уменьшится выходное напряжение, 5в/1к=5ма, допустимый ток выхода 20 ма, так что ожидаемое падение не более нескольких десятков мВ, что вполне допустимо.

По корректировки выхода с помощью АЦП: данную процедуру можно оставить только при настройке системы, так что в работе драгоценное процессорное время отбираться не будет

Ссылка на комментарий
Поделиться на другие сайты

макс привеет...вижу что ты немного разобрался с типами данных...это хорошо...

теперь о преобразовании....когда преобразование идет в сторону большего типа данных то нарушение целосности данных не будет....например тип чар в тип интегер...и так далее...если посмотреть на твою формулу что мы сначало наблюдаем...?...мы видим что ты тип данных speed_ecu которое тип чар...сразу умножаешь на дробное число..а это значит что это число автоматичесски переходит в тип реал...каторое вместо 1 байта займет аж 32 но это не страшно...компил автоматичесски перед операцией над ним это число переводит в необходимый тип...но это так умеет си а вот паскаль например бы точно заругался....на несоответсвие типов данных...

и в самом последнем действии ,а это присвоение значения полученного при вычислении формулы(pedal_ecu) опять в число типа чар...тута много чего нехорошего мона схватить...а именно потеря данных...потому что будут обрезаны старшие разряды числа(если ано будет больше предела заданного типом данных) а останется толька младшие...дробь тоже отлетит..поэтому это надо четко понимать....

..так же по твоей формуле в результате вычисления возможно появление отрицательных чисел каторые ты просто отправляешь в цап....и если компилятор не выдает ошибки всё это спакойно уйдет на цап....а цап не понимает отрицательных чисел он только выдает взевешенное цифровому коду напряжение на выходе на основании опорного напряжения...

и что у тя тамо приходит в этот момент одному богу известно....это необходимо посматреть и проаниализировать...повнимательней..

....теперь вернемся опять к формуле по каторой ты выдаешь значение на цап....

...из неё видно что тамо производится вычисления со скоростью...текущей и заданнной....и плюс два коэффициента ...полученных тобой эмпиричесски....так что ж ты тогода на выходе из этой формулы получишь а?!! правильно ничего больше как какую то опять же скорость!!!....поистине у тя получился уникальный регулятор......

...смотри выход цапа тоесть его напряжение(в твоем случае) он связан со скоростью косвенно а не прямо....а именно он может быть связан отношением опорного напряжения цапа и цифровым кодом на его входе....

а что бы получить это отношение надо его "взесить"....это типа сколько прибавится "скорости на прямой"(это не точно потому что конечная скорость тоего авто имеет гораздо больше параметров..но для примера сайдет)если на вход прибавить 1 бит ...и так до последнего числа возможного разрядностью выбранного цапа в твоем случае числа 255 или фф...

...по этому строится график зависимости(тоесть ты знаешь что если цап выдаст 4.8 вольта то у тя скорость будет максимальная например 150 км....это и есть приращение числа к скорости..и так весь предел значений до нуля.. )

и после когда ты высчитал необходимую скорость уже подсовываешь ему необходимый код на цап, каторый соответсвует этой скорости согласно измеренному приращению.(строится график код на входе цапа и скорость при этом машины....)

...терь о скорости..этот параметр имеет много переменных по каторым он высчитывается...если смотреть со стороны регулятора каторый его и поддерживает....всё это изза того что меняется нагрузка на двигатель ввиде всемозможных горок и уклонов...когда часть его мощности расходуется на преодоление силы притяжения...катимся на спуске то двиглу легче.. ему еще и помагает эта сила что бы развить необходимую скорость, надо меньше мощности(а то и ващще ненада ввиду уже накопленной инерции)...когда в гору наобарот, необходимо дать газу и увеличить мощность двигателя пропорционально уклону для преодоления силы притяжения....

...терь о регуляторе....думаю что он сначало..вычисляет увеличение или уменьшение скорости .....дальше идет измерение на сколько произошло уменьшение или увеличение за единицу времени (высчитывается ускорение)..и по полученному ускорению идет оценка косвено дающая понять регулятору где двигается авто, на прямой ..на гору или на спуске +(какой величины будь то гора или спуск). и апосля выдает результирующее воздействие на выход.....это теория и я не знаю правильно или нет....может кто поправит....

...насчет бута...аврки имеют специательный битик при активации каторого при подачи на него питания...он попадает в область памяти программ каторая лежит в его хвосте...размер бута может варьироватся по моему от 256 байтов до килобайта....и по програмке при некотарых условиях (нажата кнопка сидящая на каком нить входе он переходит в режим прошивки памяти программ, данные каторые могут заливатся через спи. уарт)...мона нарыть в нете гатовые буты..

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

с уважением...

Ссылка на комментарий
Поделиться на другие сайты

С чего вы взяли, что с уменьшением резистора в цепи фильтра до 1-2 ком существенно уменьшится выходное напряжение

1. Из практических измерений. Поиграв номиналами, мне удалось поднять максимальное напряжение на выходе RC-фильтра только до 3,7В. Вы забываете, что имеет значение еще комплексное сопротивление нагрузки. Я не знаю, сколько оно у моего ЭБУ, и считать не хочу. Достаточно того, что оно "садит" выходной сигнал ШИМ настолько, что становится невозможно его применение.

2. Из книги Трамперта "Измерение, управление и регулирование с помощью AVR", прошу обратить внимание на стр.121

Кроме того, с уменьшением номинала резистора в RC-цепочке (и увеличением емкости) увеличивается постоянная времени, за которую устанавливается требуемое напряжение ШИМ на выходе фильтра. Может, это не критично для данного случая, но любое увеличение времени реакции контроллера надежности устройству не добавляет.

У того же Трамперта читаем, что кроме всего этого, полностью убрать пульсации RC-фильтром не получится, не получится также получить значения граничного диапазона, кроме того напряжение будет зависеть от физических свойств элементов, температуры, нагрузки и пр. (стр.121-122)

Для компенсации недостатков Трамперт предлагает применить активный фильтр Баттерворта 2-го порядка, т.е. операционный усилитель. Для себя я решил, раз уж добавлять корпус, то надо добавить ЦАП, а не трахаться с фильтрами ШИМ. На плате места заняло бы больше, требовало бы подбора элементов, работало бы медленее и менее надежно.

Не стоит забывать, что у меня 2 выходных канала, и ЭБУ проверяет еще и их взаимное соответсвие.

Т.е. ШИМ - супер-способ реализации ЦАП, когда не требуется высокая точность и быстродействие, например в блоках питания.

Все выше сказанное, кроме ссылок на Трамперта - ИМХО. Я уверен, что поставив цель, все-таки можно заставить работать мой конроллер круиза на ШИМ. Но цель у меня другая - сделать простое, надежное и легко повторяемое устройство, не требующее настройки. Как правило, такие вещи работают годами.

 

По корректировки выхода с помощью АЦП: данную процедуру можно оставить только при настройке системы, так что в работе драгоценное процессорное время отбираться не будет

А это вообще можно сделать точным мультиметром, нафиг тогда еще наворачивать функцию в устройстве, которая будет работать только при настройке? Коэффициенты коррекции получить? Ручками и глазками проще.

 

2nightmare Женя, не все так. На выходе из формулы я получаю значение, которое нужно посылать в ЦАП для достижения заданной скорости. Я прокатился по ровному асфальту в режиме "достиг скорости, не дергаюсь 3-5 сек, жму кнопу, в eeprom записывается пара "Скорость-Выводимое значение на ЦАП". Приехал, выковырял из eeprom пары значений, построил табличку, апроксимировал в функцию, наплевав на размерности. Этому, кстати, меня научил препод в ВУЗе по тяговым расчетам. Он на лекции написал на доске формулы, диковато выглядящие на первый взгляд: складывались в одну кучу несовместимые вещи - вес поезда, % на роликовых буксах (помнишь еще такие?), % 8- и 4-х осного пс и прочая, а слева получалось что-то, по размерностям вообще никак не лежавшее рядом. И сказал, что нехрен таращить глаза и задавать вопросы, т.к. тяговые расчеты достаточно сложны, и опытом выведены вот такие эмпирические формулы, с достаточной для практики точностью описывающие процессы при движении состава. И для примера одну из формул переписал в академическом виде. Рисовал он ее минуты три и занял полдоски.

Могу сказать, что формула моя описывает с замечательной точностью движение Грандиса, несколько раз катался и уточнял коэффициенты, уже достаточно.

По поводу реглирования дельты - именно так я и рассуждал. Только пропустил промежуточные результаты и сразу прибавляю в формулу знаковую дельту, увеличенную в 5 раз (тоже эмпирически подобрал). Мгновенная скорость - это показатель того, насколько правильно было выполнено регулирование в предыдущей итерации, верно? И ее разница с образцовой как раз дает знак поправочного коэффициента! А значение - уже дело наживное.

Самое интересное, что такая простая формула и работает замечательно. На выходных опять дочку в лагерь отвозил (она вожатой сейчас, раз в неделю выходные), опять на трассе попробовал. А в этот раз ехали рано утром, ей надо было к завтраку успеть. Трасса свободная, плучилось на разных скоростях и с горки и в горку проехать. ±3 км/ч судя по спидометру во всех режимах, на прямой держит просто без отклонений, как привязанная. Все, достаточно.

Компиллятор так и выдает предупреждение о возможном переполнении, но я-то диапазоны обрезал заранее.

По поводу попадания в ЦАП отрицательного значения - каюсь, об этом не думал. Но проверил на нижнем граничном диапазоне:

0,45*40+40=58, максимально отклонение дельта 50, получаем 8. Кстати, при 40 круиз не включится, и при падени до 40 выключится.

Далее, в программе есть ограничения на вывод максимальных значений в ЦАП(2 последние строки, изначально их влепил):

delta_speed=speed_cur-speed_ecu;
if (delta_speed>=10) delta_speed=10;
if (delta_speed<=-10) delta_speed=-10;
pedal_ecu=0.45*speed_ecu+40-5*delta_speed;
if ((speed_cur-speed_ecu)>5) pedal_ecu=55;
if (pedal_ecu<55) pedal_ecu=55; // ne nije holostogo hoda
if (pedal_ecu>220) pedal_ecu=220; // ne vishe 80% hoda

Т.е. меньше стандартного значения хх не будет. Последнюю я на всяк случ втулил, чтобы круиз-контроль тапку в пол не делал никогда, ибо это только прерогатива водителя.

На выходных протянул постоянную проводку от ЭБУ к тормозу, приготовил для индикации и джойстика:

post-1142-1282546059_thumb.jpg

Многожильные цветные провода, еще в монтажную гофру запустил...

Чую, эпопея близится к концу :smile:

Изменено пользователем еще один max
Ссылка на комментарий
Поделиться на другие сайты

ну макс...я же сказал тоесть писал что получился поистине уникальный регулятор.)))потому что вопреки как ты сказал классическому подходу создания регуляторов он действительно работает и причем очень неплохо...этот регулятор тоесть работу этой формулы я смоделировал в спец среде называемой CODESYS...(среда написания программ для промышленных контроллеров поддерживающих платформу Codesys)..в этой среде просто есть сразу эмулятор и можно за 5 мин набросать наглядно визуализацию в виде графика и все такое и тут же все это дело запустить и посмотреть....я как раз и глядел за чилами какие получаются на выходе регулятора...и если их соотносить со скоростью и необходимым значением в цап..то все происходит ровно....кроме возможной ситуации когда получались отрицательные числа...вот это меня насторожило......

..две последних строчки в программе

"if (pedal_ecu<55) pedal_ecu=55; //

if (pedal_ecu>220) pedal_ecu=220; //

в "классике" называются лимитаторы верхней и нижней границы...это дань нашей реальности от математики у каторой числа могут уходить очень далеко как вверх так и вниз...и они обязаны всегда присутствовать в таких программах....

...а вапще замечательный у тя препод....пабольше бы таких...

 

 

Добавлено после раздумий:

да макс забыл те еще одну весчь показать...вот посмотри на это.._https://www.hiasm.com/--занятная очень штука...ак раз для таких как мы )))..и самое главное она фриваре...все бесплатно...а функционал впечатляет...самое что интересное допустим как для меня у неё есть уже готовые модули для работы с ком и лпт портами(я так думаю её мона с протеусом подружить в ввиде обмена через сомпорт , протэс это может)...!!!там же есть видеопримерчики как с ним работать..))

Ссылка на комментарий
Поделиться на другие сайты

Пробежал глазами по сайту, понял мало. Это видимо визуальный конструктор программ из модулей? А конечная цель?

Ссылка на комментарий
Поделиться на другие сайты

ну например создать программу для общения мк и с компом с последующей обработки данных на компе или что то типа сбора статистики...я примерно за 10 минут подружил протеус и эту программу (хиасм этот кидает байтики а протеус их у ся ловит и выводит на терминал)..

Ссылка на комментарий
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...