|
0 / 0 / 0
Регистрация: 27.06.2014
Сообщений: 35
|
||||||
Алгоритм калибровки датчика уровня топлива.19.02.2015, 00:32. Показов 6082. Ответов 8
Метки нет (Все метки)
Здравствуйте. Продолжаю осваивать AVR микроконтроллеры на примере датчика уровня топлива. Датчик обычный резистивный(поплавковый). Прочитав несколько статей по этому поводу, я определился с алгоритмом:
Калибровка: Заливаем 1 литр топлива в бак - сохраняем показания АЦП Заливаем 2 литра в бак и. т. д.... Контроль уровня топлива: Нужно сравнивать значения которые приходят с АЦП, с теми, что были ранее сохранены. Но я так понимаю, я не могу конкретно сравнивать текущее значение с сохраненным, так как текущее значение АЦП (которое отвечает определенному количеству топлива) может отличаться от сохраненного (отвечающего ЭТОМУ же количеству топлива) в некотором диапазоне. Все попытки осуществить задумку закончились функцией для первоначальной калибровки:
0
|
||||||
| 19.02.2015, 00:32 | |
|
Ответы с готовыми решениями:
8
Корректор уровня топлива в баке на Attiny13 Согласование датчика топлива ГАЗ и прибора Тойота Разработка устройства коррекции показаний датчика топлива |
|
0 / 0 / 0
Регистрация: 21.08.2011
Сообщений: 1,057
|
|||||||||||
| 19.02.2015, 01:03 | |||||||||||
|
if (ADC_fuel > 10 && ADC_fuel<20) { real_fuel_val:=1;}
elsif (ADC_fuel > 20 && ADC_fuel<30) { real_fuel_val:=2;} итд. Не оно? Еще можно поиграться с округлением. Взять 10-битный диапазон и разбить на 8 поддиапазонов, округляя через сдвиг переменной. И еще: код типа:
Хороший код:
0
|
|||||||||||
|
0 / 0 / 0
Регистрация: 27.06.2014
Сообщений: 35
|
||||||||||||||
| 19.02.2015, 02:32 | ||||||||||||||
|
Благодарю за ответ!
if (adc_data[1]==fuel[i]+/-какое то значение) { real_fuel_val:=1;} Где adc_data[1] - результат чтения канала АЦП, fuel[i] - массив с ранее записанными константами, где i увеличиваеться до совпадения, только нужно чтобы либо каждый элемент массива fuel[] был не константой, а находился в некотором диапазоне (+/-какое то значение), либо этот диапазон задавался при сравнении adc_data[1]==fuel[i]. Возможно я не корректно пояснил...Давайте по порядку: АЦП работает по прерыванию в режиме Frii Running:
Для вольтметра имеется функция, которую я вызываю в нужном мне месте:
В нормальном режиме работы нужно текущее значение adc_data[1] сравнивать с значениями из массива fuel[]. Но как я уже писал, есть большая вероятность того, что не одно из значений не сойдется, так как текущее значение АЦП (которое отвечает определенному количеству топлива) может отличаться от сохраненного (отвечающего ЭТОМУ же количеству топлива) в некотором диапазоне.
0
|
||||||||||||||
|
0 / 0 / 0
Регистрация: 12.04.2013
Сообщений: 241
|
|
| 19.02.2015, 02:46 | |
|
Вам уже намекают, но Вы всё никак не можете избавится от оператора "==".
В предыдущих намёках была лишь одна огрешность, её я подправил if ( ADC_fuel<ee_1) { real_fuel_val:=1;} { real_fuel_val:=0;} else if (ADC_fuel >= ee1_1 && ADC_fuel<ee_2) { real_fuel_val:=1;} else if (ADC_fuel >= ee_2 && ADC_fuel<ee_3) { real_fuel_val:=2;} ........................................ ............ else if (ADC_fuel >= ee_101 && ADC_fuel<=ee_102) { real_fuel_val:=100;} где ee_1 ....... ee_102 - значения записанные в еепроме при калибровке.
0
|
|
|
0 / 0 / 0
Регистрация: 21.08.2011
Сообщений: 1,057
|
|||||||
| 19.02.2015, 03:15 | |||||||
Про сравнение с интервалом уже объяснили. Теперь о прерываниях:
Если нужно усреднение, то в обработчике прерывания пишем ADC_val+=ADCW; ADC_count++; if (ADC_count==10){ ADC_XUJARIM_OBRABOTKU=1; ADC_count=0;}, и в ф-ции измерения (которая ждёт флаг==1) делим измеренное на 10. Если нужна задержка - запускаем ее опять же вне прерывания. Все эти премудрости относятся к хорошему стилю. Без них прога работать будет, но только до некого уровня сложности.
0
|
|||||||
|
0 / 0 / 0
Регистрация: 27.06.2014
Сообщений: 35
|
||||||||
| 19.02.2015, 10:07 | ||||||||
не писать 60+ строк...:
0
|
||||||||
|
0 / 0 / 0
Регистрация: 10.04.2014
Сообщений: 879
|
|
| 19.02.2015, 10:58 | |
|
А не проще снять характеристику датчика, зависимость показаний ацп от количества топлива
Аппроксимировать функцию, хоть через эксэль, и уже её вычислять А еще учтите что это всё для сферического коня в вакууме У нас не на столько дороги ровные, на кочках оно вам такое покажет!!! Нужно как-то программно сглаживать Еще такой момент. Вроде датчики топлива - проволочные. То есть характеристика не наклонная а ступеньками. Может не все такие. На всякий случай
0
|
|
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 2,309
|
|
| 19.02.2015, 12:00 | |
|
Да. Вот идея с апроксимацией самая надежная в таком случае. Просто поплавок на валу резюка дают несколько нелинейный результат. Потому апроксимировать его нужно полиномом второй, а то и третьей степени. А считать количество топлива из этого полинома на МК уже сложно (если это не Sortix-M4 какой нибудь). Если апроксимировать прямой - то это гораздо проще, но будут ошибки (особенно по краям - когда бак почти пустой, и когда он почти полный).
Еще можно попробовать апроксимировать экспонентой и считать с фиксированной точкой.
0
|
|
|
0 / 0 / 0
Регистрация: 21.08.2011
Сообщений: 1,057
|
||
| 19.02.2015, 12:19 | ||
В главной программе нам уже не нужны никакие флаги. Мы берём среднее из массива, пересчитываем его в литры/вольты и показываем пользователю или записываем где-то. Плюс такого подхода в том что таймер с ацп собирают данные самостоятельно, и главная прога не нуждается ни в задержках, ни во флагах и может исполняться с любой частотой без потери данных. Динные из массива вместо обычного округления можно прогонять через фильтр (НЧ, Калмана, любой). Это должно повысить качество измерений.
0
|
||
| 19.02.2015, 12:19 | |
|
Помогаю со студенческими работами здесь
9
указатель уровня топлива в приборку
Контроль трех-электродного датчика уровня и управление насосом Преобразование сигнала датчика уровня Опрос множества электродов кондуктометрического датчика уровня воды Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|