Проект продается, 60 000 USD [email protected]

Днепр 11 1988 → Широкополосный датчик кислорода своими руками. Часть 2

Широкополосный датчик кислорода своими руками. Часть 2



Всем привет. Наконец-то осилил продолжение статьи про широкополосный датчик кислорода (ШДК). Многое, что рассказано в первой части, я тут писать не буду, поэтому желательно прочитать. Изменения коснулись печатной платы, прошивки микроконтроллера и появилось ПО для калибровки и настройки контроллера ШДК. Постараюсь всё описать максимально просто и подробно. В конце статьи будут всё исходные файлы, схемы, печатные платы. Идея проекта, прежняя – сделать контроллер ШДК, который мог повторить практически любой. Естественно нужно приложить силы, решить некоторые конструктивные проблемы. Вообще говоря, я отталкиваюсь от собственного восприятия. Статья направлена на технарей, либо на тех, у кого есть друзья технари и смогут помочь. Если бы на момент настройки и сборки системы впрыска топлива на моего Днепра у меня была бы такая статья, то я не задумываясь бы заморочился и собрал такой контроллер. Сейчас мотоцикл настроен и лично мне этот контроллер не нужен особо. Но, я надеюсь, эта статья сможет упростить кому-нибудь жизнь.

Лирической отступление. Можно пропустить.
Все и везде хотят денег. Когда я начал курить всю тему с инжектором, было совершенно не понятно как оно работает. Информация в Интернете есть, довольно много, но разрознена. Хотелось поговорить с людьми, которые реально занимаются настройками моторов, чиптюнерами. Так вот к моему удивлению, выжать что-то из чиптюнеров практически невозможно. Либо они настраивают всё методом тыка, либо держат информацию в секрете. Это не только моё мнение. Если что-то и удаётся узнать, то крайне мало и не конкретно, никто разжевывать и объяснять на пальцах не хочет. К примеру существует море сайтов по микроконтроллерам, где всё разобрано до мелочей. Примеры кода, готовые устройства и схемы. У настройщиков моторов не так. Но есть и исключения. Вот тут есть замечательные видосы, где очень подробно всё разъясняют. Рекомендую к просмотру. Программное обеспечение и прошивки стоят, мягко говоря, очень дорого. Ну как дорого. Если ты занимаешь профессионально настройками, то наверно это адекватная цена, но для разовой настройки, некоммерческого проекта, отдавать 10-20к руб. это совершенно не приемлемо. Также покупать ШДК за 20к руб. для разовой настройки, тоже бессмысленно. В последе время я заметил, что начали появляться ШДК за более приемлемые цены, в пределах 10к руб. Но всё равно для разовой настройки жалко отдавать и эти суммы. Я, как человек, который занимается разработкой электроники, в какой-то мере дружу с паяльником. В принципе, многие электронные компоненты можно достать в Китае совсем не дорого. Поэтому эта статья направлена на таких же людей как я. Если вы готовы заморочиться с печатной платой, пайкой и прошивкой контроллера, то можете получить контроллер ШДК достаточно дёшево и «заточить» всю конструкцию под себя. Также приветствуется расширение и всяческие доработки системы. В дополнение хочу сказать, что очень хотелось бы накопить базу данных по разнообразным ШДК и просто загружать нужные калибровки для конкретного ШДК, ориентируясь по артикулу.

Продолжим.
Принципиальная схема практически не поменялась (по сравнениию с первой частью). На всякий случай выкладываю все принципиальные схемы ещё раз:

Схема для LSU


Схема для NTK


Схема нагревателя


Обобщённая схема для NTK


Микропроцессорная часть схемы


В схему с микроконтроллером я добавил функционал для трёх кнопок и делитель для измерения уровня заряда аккумулятора. Программно этот функционал не поддерживается (вроде не надо). Всё, что раньше было кинуто проводами, перекочевало на печатную плату. Практически все выводные детальки я заменил на SMD. Типоразмер резисторов и конденсаторов там 0805, поэтому проблем с ручной пайкой быть не должно.
Несколько фоток печатной платы:













Для удобства сборки я сделал монтажку. Весь монтаж односторонний. Детальки «100nF пл.» и «1uF пл.» это выводные плёночные конденсаторы. Наверно и на SMD керамике бы всё работало, но я решил выпендриться сделать по-модному сделать так. Я думаю, можно и выводную керамику запаять, врятли что-то будет звенеть.

Монтажка


Да! Прошу обратить внимание! Монтажка для схемы LSU датчика. Как переделать LSU-NTK и как проверить схему, читать тут ОБЯЗАТЕЛЬНО! Обращаю внимание, на плате два варианта линейного стабилизатора LT1086 под TO-220 и под D2PACK корпуса. Многие танталовые конденсаторы можно заменить на алюминиевые. Вообще говоря, я многие детальки насобирал у себя в хламе, в Китае купил по минимуму и за копейки.
Повторю про переделку LCD дисплея. Дисплей применён на контроллере ST7735 размером 1,8 дюйма. Всё есть в первой части. С дисплея можно отпаять линейный стабилизатор LM1117-3,3 и перенести его на плату. Плюс нужно запаять перемычку на плате дисплея. Я ещё снёс держатель карты памяти для удобства сборки конструкции.



Так. Теперь сам ШДК датчик. Я решил заказать с Китая, я предпочитаю eBay. Вбил артикул (0258017025), выбрал не самый дешевый вариант. Ссылку дать не могу, тот продавец больше не продаёт эти датчики. Попутно заказал ещё и разъём, куда можно воткнуть этот датчик. Пришёл датчик, мягко сказать, так себе. Ни одного обозначения, вообще ничего не написано. Защитный колпачок не такой как на фото. Короче китайцы. Не знаю уж сколько он прослужит, да и не важно мне это сейчас. Напомню, проект затачивался под применение практически любого датчика кислорода, с последующей калибровкой по эталону. Распиновка ШДК на картинке ниже.



Распиновка моего датчика попала под распиновку как у Bosch (да и по артикулу это Bosch… китайский).
Всю конструкцию я собрал в корпусе для РЭА. Если честно, я даже не знаю что это за корпус. Мне он достался за «так» и на нём нет обозначений. Линейный стабилизатор нагревателя в TO-220 нужно установить на небольшой радиатор. Я откопал у себя радиатор от старой материнской платы.
Кстати! По поводу разъёма для ШДК. Обращаю внимание! Паять провода к разъёму нельзя! Только обжимка! Разъёмы на корпус контроллера ШДК решил не ставить, сделал через кабельные вводы. Получилось примерно так:





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

Прошивка
Я не знаю как здесь добавлять символы табюляции, поэтому все куски кода слипаются в столбик и плохо читаемы. Но файл с исходником можно отрыть при помощи, например Sublime text и там будет правильная табуляция. Прошивка (внутреннее ПО) написано в среде программирования CodeVision под микроконтроллер (МК) ATmega8A. В конце статьи будет проект целиком. В прошивке кое-что поменялось (по сравнениию с первой частью ). Я хотел сделать так, чтобы изменять настройку контроллера ШДК можно было без перепрошивки микроконтроллера (МК) ATmega8A. Поэтому я задействовал внутренний EEPROM. Лично я не сторонник использования внутреннего EEPROM МК. Его можно легко очистить, достаточно не поставить галочку в fuse битах. И мне попадались экземпляры микроконтроллеров, где самопроизвольно слетал внутренний EEPROM. Китайцы, блин. Обычно я использую внешнюю память 24LC64 потому что у меня много таких микросхем потому что это удобно и всегда можно перепаять на новую. Но тут я поленился её разводить, поэтому внутренний EEPROM. Теперь в энергонезвисимой памяти хранится 61 калибровка Uout-AFR(Air-Fuel Ratio) и одна калибровка самого аналогово-цифрового преобразователя (АЦП).
Давайте по порядку алгоритм работы. Калибровка АЦП. На борту МК есть АЦП, который измеряет напряжение с выхода аналоговой платы управления ШДК через повторитель напряжения на операционном усилителе LM358. Фактически, уровень напряжения зависит напрямую от AFR. Но детальки на плате, и сам АЦП не идеален, и существует погрешность оцифровки. Для обеспечения максимальной точности измерений нужно «не совсем точные показания АЦП» умножить на некоторую величину и можно получить истинные значения. Какая точность с калибровкой/без калибровки, сколько знаков после запятой я не измерял, долго, нудно и неинтересно. Выражаясь научным языком, эта калибровка АЦП убирает некоторую систематическую погрешность.
Далее 61 калибровка Uout-AFR. Да простят меня профессионалы, но я определил диапазон изменения AFR от 7 до 22, с шагом 0,25. Почему так? Не знаю. Такое у меня было настроение. Хотя сам диапазон я выбрал, слегка посоветовавшись со знакомыми автомобилистами. Получилась таблица, с одной стороны мы получаем измеренное значение напряжение при помощи АЦП контроллера, с другой сопоставляем соответствующий ему AFR. Фактически это функция как в первой части статьи, но заданная таблично. Внимательный читатель спросит, а как же быть, если Uout не попадает в табличное значение? Очень просто. В диапазонах между точками происходит, внимание, линейная аппроксимация. Метод наименьших квадратов (МНК) по двум точками. Вот и всё! Поясню, графически:


Алгоритм работает так. Получаем значение Uout с АЦП. После всех преобразований получаем реальные вольты, начинаем сравнивать со всеми подряд значениями из таблицы. Как только знак результата меняется (например, полученный Uout был всё время меньше табличного значения, а потом вдруг стал больше), значит, мы попали как раз между двумя точками, где лежит полученное значение. Теперь другими словами. Пусть в процессе перебора мы попали в некую i-ю точку, где сменился знак. Знаем Uout[i](табл),AFR[i](табл) и Uout[i-1](табл),AFR[i-1](табл) или Uout[i+1](табл),AFR[i+1](табл), в зависимости от того, с какой стороны шёл поиск значения. Дальше по двум точкам МНК. Получаем на этом участке f(x)=ax+b, подставляем рассчитанный Uout и находим AFR. Ну а дальше вывод на дисплей, подготовка пакета для LC-1 и прочая борода. Конечно, этот алгоритм имеет ограничение. Табличная функция AFR(Uout) не может иметь экстремумов, точек максимума и минимума кроме двух на которых определена. Иначе одному значению AFR будет соответствовать несколько Uout, что недопустимо.
Теперь по строчкам прошивки. До входа в основной цикл while(1) происходит загрузка таблицы AFR-Uout из EEPROM, переменные двухбайтовые:

….
//Load calibr value from EEPROM
temp_ui=0;
for(i=0;i<124;i++)
{
RXBUF[i]=EEPROM_read(i);
//TRANS_UART(RXBUF[i]);
}
for(i=0;i<124;i++)
{
if(((i==0)||(i%2==0))&&(i!=1))
{
if(i<122)
{
ALF_UOUT[temp_ui]=((float)((RXBUF[i]<<8)+RXBUF[i+1])/1000);
temp_ui++;
}
else
{
calibr_adc=((float)((RXBUF[i]<<8)+RXBUF[i+1])/1000);
}
}
}
….

Значения в EEPROM хранятся в виде двухбайтового целого, умноженного на 1000, поэтому при считывании в массив с плавающей точкой, происходит деление на 1000. Да-да можете пинать меня, я программист такой, уж какой есть:
ALF _UOUT[temp_ui]=((float)((RXBUF[i]<<8)+RXBUF[i+1])/1000);

Дальше интересности в основном цикле. Опущу всякую бороду типа вывод на экран состояния нагревателя и прочее, не существенное. Веселуха начинается тут:


if(flag_end_adc!=0)
{
flag_end_adc=0;
vin_f=calibr_adc*(2)*((adc_data*2.56)/1024);
vin_f_akk=vin_f_akk+vin_f;
akk_cou++;
….

Когда АЦП отработает (if(flag_end_adc!=0)), то произойдет расчет реальных вольт:
vin_f=calibr_adc*(2)*((adc_data*2.56)/1024);

Переменная «calibr_adc» как раз и «докручивает» АЦП до истинных значений. А загадочная запись «(2)», это коэффициент деления делителя на входе АЦП (там два резистора по 2,2 кОм запаяны).
Дальше это усреднение по 10 значениям. Измерения для усреднения копятся в переменной «vin_f_akk».
Как только накопилось 10 отсчётов АЦП, происходит та самая магия(удалю строчки с комментариями):


if(akk_cou>=10)
{
vin_f=vin_f_akk/akk_cou;
vin_f_akk=0.0;
akk_cou=0;
//new table const AFR-UOUT
i=0;
if(vin_f>ALF_UOUT[0])
{
do
{
if(i<63)
{
i++;
}
else
{
break;
}
}
while(vin_f>ALF_UOUT[i]);
}
else
{
do
{
if(i<63)
{
i++;
}
else
{
break;
}
}
while(vin_f<ALF_UOUT[i]);
}

Вот это «vin_f=vin_f_akk/akk_cou;» собственно само усреднение, а дальше два if-а и циклы do-while. Тут происходит «пробежка» по таблице AFR-Uout и поиск точки попадания измеренного значения. «Пробежка» идёт с начала в конец или с конца в начало, в зависимости от значений в таблице и измеренного значения Uout. Если пробежали по всей таблице и никуда не попали, то вываливаемся по «break;» и на дисплее будет отображено «OUT OF RANGE», на нормальном языке значит «Вне диапазона».
А вот если мы попали куда-то, то дальше сам МНК (кому интересно полные формулы ищем в интернете):


x1=ALF_UOUT[i-1];
x2=ALF_UOUT[i];
y1=22-((i-1)*0.25);
y2=22-((i)*0.25);
//n=2
//linery approx
a=(2*(x1*y1+x2*y2)-(x1+x2)*(y1+y2))/(2*(x1*x1+x2*x2)-(x1+x2)*(x1+x2));
b=((y1+y2)-a*(x1+x2))/2;
ALF=a*vin_f+b;



Вот и всё. Наш искомый: ALF=a*vin_f+b;
Куски кода, которые сидят тут:


if(flag_new_com!=0)
{…}
if(flag_new_rx!=0)
{…}


отвечают за обмен данными с компьютером.Тут ничего интересного. Это получение команды и отправка всех калибровочных значений на комп, и получение новых калибровок с компа. Там происходит проверка контрольной суммы, компоновка, короче нудятина всякая.
Ну и в конце, сам протокол LC-1. Что-то у меня вызывает сомнения его корректность работы. Если работает, хорошо, если плохо и вы почините, то тоже хорошо (удалил строчки комментариев):


if(flag_lc_out!=0)
{
flag_lc_out=0;
temp_ui=(unsigned short int)((ALF*10000/147)-500);
TRANS_UART(0xB2);
TRANS_UART(0x82);
TRANS_UART(0x43);
TRANS_UART(0x13);
TRANS_UART((temp_ui>>7));
TRANS_UART((temp_ui&0b01111111));
}



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

Внешнее ПО
ПО написано в среде Delphi 5. Чтобы настроить контроллер ШДК, а конкретно залить калибровки в EEPROM, была написана маленькая утилитка:


Интересна только часть, обведенная красной рамкой. Остальное-технологическое (тупа забыл убрать, а теперь лень).
Основные области:


Зеленая рамка – работа с COM портом
Синяя рамка – ввод калибровок
Жёлтая рамка – отправка/получение калибровок
Оранжевая рамка – инструменты, плюшки

Кнопка «Порт» — выбрать нужный номер COM порта
Кнопка «Подключить» — соединиться с портом
Кнопка «Отключить» — отсоединиться от порта

Кнопка «Записать» — залить калибровки в контроллер
Кнопка «Прочитать» — получить калибровки из контроллера

Кнопка «Рисовать» — отобразить графически значения из области синей рамки
Кнопка «Открыть» — открыть текстовый файл с калибровками
Кнопка «Рассчитать» — расчет калибровки АЦП

Калибровки вводятся вручную или могут быть загружены из файла. Формат файла (пример input.txt находится в папке с проектом Delphi):

4,72
4,65
….
….
0,28
0,2

Цифры с разделителем «,» вводятся просто в столбик, удобно для копирования с Excel. Цифры соответствуют Uout. А сам файл имеет следующее соответствие (значения из примера):
4,72 В – 22,00 AFR
4,65 В – 21,75 AFR
….
….
0,28 В – 7,25 AFR
0,2 В – 7,00 AFR

Внимание! Если при вводе значений и записи в контроллер вываливается ошибка, то возможно нужно изменить разделитель целой и дробной части в настройках ОС. Или вписывать числа с разделителем «точка», тоесть не так «4,72», а так «4.72».
Для загрузки данных из файла в область ввода калибровок нужно нажать кнопку «Открыть» и выбрать в диалоговом окне необходимый текстовой файл. Значения из файла автоматически будут записаны в поля для ввода.
Зависимость AFR-Uout можно отобразить графически. Для этого достаточно нажать кнопку «Рисовать» и в зависимости от введенных значений будет отображен тот или иной график.



Для калибровки АЦП предусмотрен небольшой инструмент. Поля «не калибр» «реальное» и кнопка «Рассчитать». Когда в EEPROM микроконтроллера калибровочное значение АЦП равно 1.000, тогда можно воспользоваться данным инструментом. В поле «не калибр» нужно ввести то число, которое отображается на дисплее, пусть это будет 1.543. Далее измеряем тестером, мультиметром, Авометром, языком, желательно внесенным в госреестр, напряжение до делителя, вот тут:


По измерения получилось, например 1.678. Вводим это число в поле «реальное» и нажимаем кнопку «Рассчитать». В поле рядом с надписью «АЦП» появится число «1,087», это и есть калибровочный коэффициент.



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

Итак. После сборки и проверки устройства нужно прошить микроконтроллер (МК). Скомпилированный HEX файл находится по пути ..\files2\OXY_WBO\Debug\Exe\OXY_WBO.hex Небольшое отступление по прошивке МК. Прошить можно только при помощи программатора. Вариантов программаторов несколько. Самый простой в интернете зовётся «5 проводочков» и самый ненадёжный. Улучшенный вариатнт «5 проводочков» это STK200, эти те же проводочки, но с буферной микросхемой на триггерах Шмидта. Но этим двум программаторам требуется LPT порт. Всё шьётся через программу PonyProg.
Следующий вариант это USB программаторы. Я пользуюсь двумя видами: BitBang и USBASP. BitBang хорош тем, Что ничего прошивать для его изготовления не нужно, но затык в корпусе FT232RL, шаг между лапками 0,5мм. Для работы с этим программатором я использую ПО SinaProg. С изготовлением USBASP проблем меньше, но там нужен именно ATmega8-16PU (-16AU), варианты ATmega8P-8PU, ATmega8A не подходят. Только древняя 16-ти мегагерцовая версия этой атмеги. Но есть решение, которое я не проверял. На али можно купить такой программатор за копейки, но идти будет долго. С USBASP я использую ПО AVRDUDE или Extreme Burner.
Чуть не забыл важный момент, так называемые FUSE биты. Настройку я по даташиту не произвожу, очень заморочно. Поэтому пользуюсь благами цивилизации: (ссылка на FUSE калькулятор). Выбираете ATmega8 и настройки всего две нужны:
  1. В разделе «Режимы синхронизации и задержки запуска (CKSEL, SUT)» нужно выбрать
  2. Внутренний генератор 8 мгц; заждержка запуска 6 тактов+64мс
  3. Нужно установить галочку:
  4. Не стирать EEPROM при выполнении команды «Стереть Кристалл» (EESAVE)
FUSE биты получились такие: младший 0xE4 старший 0xD1
Я не могу расписать досканально как всё прошивать, паять программаторы, устанавливать ПО, это всё можно найти в сети.
Когда микроконтроллер ATmega8 будет прошит и контроллер ШДК заработает и на экране появятся измерения АЦП:



Начальная настройка
После прошивки в EEPROM микроконтроллера будут значения 0xFF или в десяичном виде это 255. Это очень большое значение и оно одинаковое для всех точек, поэтому будет выдана надпись «OUT OF RANGE» на экране контроллера ШДК. Первым делом рекомендую при помощи утилиты на компе загрузить начальные калибровки. Для начала калибровки могут быть любыми, главное чтобы были в адекватном диапазоне, чтобы не появлялась надпись на экране контроллера ШДК «OUT OF RANGE». Можно воспользоваться калибровками в файле input.txt, который лежит в папке с Delphi проектом. В поле «АЦП» ОБЯЗАТЕЛЬНО нужно указать «1.000». Далее нажать кнопку «Записать». Начальная настройка завершена. Теперь нужно настроить правильный коэффициент для калибровки АЦП. Как это сделать я описывал выше. После настройки правильного коэффициента для АЦП можно настраивать точки для AFR.
Настройка калибровок AFR проводится по следующему алгоритму. Обязательное условие, это должен быть ещё один калиброванный ШДК, он будет эталоном В выхлопную вкручивается эталонный и настраиваемый ШДК. Подключается инженерник, в котором отключена работа по датчику кислорода. Двигатель заводится включаются оба датчика, ожидается их прогрев. Как выяснилось, на самодельном контроллере ШДК готовность прогрева, не означает готовность датчика. Готовность датчика можно определить по резкому изменению напряжения, например при ключении было 2.5В, а секунд через 30 скачком стало 1.8В, значит датчик готов. В принципе алгоритм настройки практически полностью расписан здесь. Меняем состав смеси. От бедной в богатую и от богатой в бедную, пока мотор ещё может работать. Можно сделать несколько проходов для усреднения. Смотрим и записываем соотношения AFR у эталонного датчика и напряжение АЦП на экране настраиваемого. По итогу должна быть зависимость AFR от Uout (напряжение с АЦП). Далее эта зависимость переносится в Excel, там строится линия тренда или просто подбираются. Цель простая, получить значения Uout для заданных в утилите значений AFR: 22.0-7.0. После того как значения получены, они задаются в утилите и после нажатия на кнопку «Записать» они запишутся в EEPROM микроконтроллера. Не забудьте указать правильную калибровку для АЦП!
Правила оформления постов не разрешают использовать более 30000 символов, поэтому испытания в части 3 будет.

Ссылки на архив с барахлом.

07 марта 2020 Дополнение к статье. Решение проблемы отсутствия связи с ПО на компьютере.

Микроконтроллер(далее МК) ATmega8, как и многие другие, содержат ячейки памяти, которые отвечают за калибровку внутреннего RC генератора. Некоторые экземпляры, купленные мной в китае, были с совершенно раскалиброванным RC генератором, что делает невозможным настройку, например, UART посредством формул в Datasheet или встроенного в CodeVision помощника настройки МК(значок-шляпа волшебника). Поэтому такие МК я калибровал вручную. Результат калибровки виден в коде в виде строчки:
OSCCAL=175;

Вот это число «175» и есть калибровка, подобранная вручную при помощи не хитрого алгоритма.

Соответственно, если ваш МК уже с нормально настроенным RC генератором, то эта строчка всё испортит.

Если вы залили HEX из архива, который был указан выше, а МК и ПО на компьютере не соединяются, возможно у вас МК с нормально настроенным RC генератором. Для решения этой проблемы нужно удалить из кода строчку «OSCCAL=175;» перекомпилировать, и залить новый HEX. Но я сделал это за вас и ниже ссылка на HEX, где не производится настройка RC генератора:

Архив с HEX где нет программной настройки генератора

По вопросам можно обращаться сюда:

romanbuyan[СОБАКА]gmail.com
  • roman_buyanroman_buyan
  • Роман
  • 21 января 2020 в 17:09
  • 2
  • ?

Комментарии (17)

RSS свернуть / развернуть
0
dww
  • dww
  • 26 февраля 2020 в 10:01
Привет.Что то калибровки погой не могу закинуть. В чем может быть проблема?
0
roman_buyan
Так. FUSE биты прошиты? Если частота внутреннего генератора не 8 Мгц, то скорость UART будет неправильной. Да и можно уточнить скорость порта во внешнем ПО (нажать кнопку Порт), должна быть 19200.
0
dww
  • dww
  • 26 февраля 2020 в 10:09
Кнопки и делитель будут задействованы?
0
roman_buyan
В кнопках нет необходимости. Я не знаю какой функционал им приспособить. Можно хранить несколько калибровок в памяти и кнопками выбирать под необходимый датчик. Но это уже overkill
0
dww
  • dww
  • 26 февраля 2020 в 11:06
Ок Сейчас проверю.
0
dww
  • dww
  • 26 февраля 2020 в 11:21
Все вроде норм.AVRDUDE -U lfuse:w:0xE4:m -U hfuse:w:0xD1:m Скорость 19200. В дровах такую же скорость ставить?
0
roman_buyan
Хм. В драйвере вроде ничего менять на надо, это стандартная скорость порта. Мост USB-UART на cp2102?
Попробуй глянуть что выкидывается в порт при помощи Terminal v1.9b. Поидее там должно периодически вываливаться 0x43 0x13 (нужно в терминале переключиться с ASCII на HEX).
0
dww
  • dww
  • 26 февраля 2020 в 11:35
Мост FT232. Терминалом попробую.
0
roman_buyan
По идее всё должно работать. У тебя CodeVision есть?
0
roman_buyan
В коде есть строчка:
OSCCAL=175;

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

Если есть CodeVision, то можно закомментировать эту строчку и перекомпилировать. Если это сложно/непонятно, я попробую сегодня вечером дома перекомпилировать без этой строчки.
0
dww
  • dww
  • 26 февраля 2020 в 11:50
Терминал-D2 C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 8B 80 81 D2 C2 A3 83 80 81 DA C2 A3 83 80 81 DA C2 A3 83 80 81 D2 C2 A3 8B 80 81 D2 C2 A3 83 80 81 D2 C2 A3 8B 80 81 D2 C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 8B 80 81 D2 C2 A3 8B 80 81 D2 C2 A3 83 80 81 D2 C2 A3 8B 80 81 DA C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 8B 80 81 DA C2 A3 8B 80 81 D2 C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 8B 80 81 DA C2 A3 83 80 81 D2 C2 A3 83 80 81 DA C2 A3 83 80 81 DA C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 8B 80 81 DA C2 A3 83 80 81 DA C2 A3 83 80 81 DA C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 83 80 81 DA C2 A3 83 80 81 D2 C2 A3 83 80 81 DA C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 83 80 81 DA C2 A3 83 80 81 D2 C2 A3 83 80 81 DA C2 A3 8B 80 81 D2 C2 A3 83 80 81 D2 C2 A3 83 80 81 DA C2 A3 8B 80 81 DA C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 83 80 81 DA C2 A3 83 80 81 D2 C2 A3 83 80 81 DA C2 A3 83 80 81 D2 C2 A3 83 80 81 DA C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 8B 80 81 D2 C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 8B 80 81 DA C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 8B 80 81 D2 C2 A3 83 80 81 D2 C2 A3 8B 80 81 D2 C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 83 80 81 DA C2 A3 8B 80 81 D2 C2 A3 8B 80 81 D2 C2 A3 8B 80 81 D2 C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 8B 80 81 D2 C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 8B 80 81 D2 C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 8B 80 81 D2 C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 8B 80 81 D2 C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 8B 80 81 D2 C2 A3 8B 80 81 DA C2 A3 83 80 81 D2 C2 A3 83 80 81 DA C2 A3 8B 80 81 DA C2 A3 8B 80 81 DA C2 A3 83 80 81 DA C2 A3 83 80 81 D2 C2 A3 8B 80 81 D2 C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 8B 80 81 D2 C2 A3 83 80 81 D2 C2 A3 83 80 81 D2 C2 A3 8B 80 81 D2 C2 A3 83 80 81 D2 C2 A3 83 80 81 DA C2 A3 83 80 81 D2 C2 A3 83 80 81 DA C2 A3 83 80 81
0
dww
  • dww
  • 26 февраля 2020 в 11:51
CodeVision есть.
0
roman_buyan
Вот эта посылка повторяется «D2 C2 A3 83 80 81», но байты не те. Похоже внутренний генератор фигачит не так.
0
dww
  • dww
  • 26 февраля 2020 в 12:44
Что делать?
0
dww
  • dww
  • 26 февраля 2020 в 12:50
Паять лудить вышивать все можем но не программить!
0
roman_buyan
В коде есть строчка:
OSCCAL=175;

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

Если есть CodeVision, то можно закомментировать(или удалить) эту строчку и перекомпилировать. Если это сложно/непонятно, я попробую сегодня вечером дома перекомпилировать без этой строчки.
0
dww
  • dww
  • 26 февраля 2020 в 14:55
Буду очень благодарен!
Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста, или зарегистрируйтесь.
При перепечатке материалов, видео или картинок гиперссылка на «bikepost.ru» обязательна
мотоблоги, Днепр 11 1988, Широкополосный датчик кислорода своими руками. Часть 2