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

Как Создать Таблицу Соотношений Cvavr?


Corename

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

Доброго времени суток.

Самостоятельно изучаю CVAVR. Сейчас делаю себе цифровую приборку в автомобиль. Есть вопрос по измерению уровня топлива в баке.

В основе лежит емкостный ДУТ. В зависимости от уровня топлива он выдает от 0 до 5В на выходе. При 0В - бак пустой, при 5В - бак полный.

Вроде бы все просто - бак имеет правильную форму, емкость - 40Л. Достаточно измерять результат и умножить его на 8 - получим уровень топлива в литрах.

Но на практике нужно делать нечто вроде тарировочной таблицы. В этой таблице определенному напряжению на входе АЦП должен соответствовать определенный уровень. Как это сделать программно - опыта не хватает. В интернете и на форуме ничего подобного не нашел.

Как правильно это сделать?

Привожу свой рабочий код, точнее его кусок отвечающий за топливо, сейчас приборка работает "по простому":

i=0;

while(i<127)

{

result=((5.00*adc_data[1])/255.00); //Заполняем массив результатами измерений

result=result*8;

i++;

}

i=0;

real=0;

while(i<127)

{

real=real+result; //Суммируем значения из массива

i++;

}

{

real=real/127; //Делим сумму на колличество элементов и получаем среднее значение АЦП

sprintf(lcd_bufferA,"%.0f",real); //Форматируем строку и помещаем ее в буфер АЦП

}

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Об этом и речь. Не знаю как это правильно делается. Если бы кто-то поделился кусочком кода и в двух словах объяснил что к чему. Самому пока что сложно - опыта нет.

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

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Ну гляди, например для трёхразрядного АЦП (для своего сам сделаешь по аналогии):

Создаём массив выходных значений.

int adc_tbl[8] = {0, 2, 4, 6, 8, 10, 12, 14};

И в зависимости от значения АЦП выбираем значение из этого массива

int adc_out;
adc_out = adc_tbl[adc_in];

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

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

Спасибо.. но я не понял как оно работает.

Имеем массив значений, которые выводятся на экран:

int adc_tbl[8] = {0, 2, 4, 6, 8, 10, 12, 14};

Но как работает сопоставление значений АЦП с элементами массива мне не ясно.

Мне нужно, чтобы работала следующая логика (пример):

Если напряжжение 1,0В-1,2В, выводим на экран 1

Если напряжжение 1,21В-1,3В, выводим на экран 2

Если напряжжение 1,31В-1,4В, выводим на экран 3

Если напряжжение 1,41В-1,5В, выводим на экран 4

И т.д.

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

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

С АЦП получите значения АЦП преобразования, они и будут номерами элементов массива, которые вы предварительно в этот массив запишете.

Если напряжжение 1,0В-1,2В, выводим на экран 1

Если напряжжение 1,21В-1,3В, выводим на экран 2

Если напряжжение 1,31В-1,4В, выводим на экран 3

Если напряжжение 1,41В-1,5В, выводим на экран 4

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

Ты не путай напряжение и числовое значение АЦП.

Если у тебя полный размах АЦП 0-5В и АЦП 8-разрядный, то 0В будет соответствовать числу 0, а 5В будет соответствовать числу 255.

Далее эти числа ты используешь как номер ячейки массива и по этому номеру выбираешь из массива что там лежит.

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

Теперь понял, это реально выход, спасибо огромное!

Теперь следующий вопрос: а есть ли возможность в CVAVR записать значения массива (в моем случае это аж 255 значений) не в один ряд, а как-то более удобно и читабельно?

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

Вообще конечно такая таблица нужна только если шкала должна быть неравномерной и трудноописываемой математически. Иначе достаточно арифметических действий как у тебя было.

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

Здесь достаточно последовательного вычитания в цикле, с выводом на дисплей количества итераций.

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

Какие таблицы, какие вычитания, вы чего, люди ? :)

Тут достаточно вспомнить математику за 5 класс, тему - пропорции.

40Л - 1023
x - ADC

Отсюда, x = (ADC*40)/1023

Вот и вся магия :)

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

Вы все правильно говорите. Изначально я именно так и сделал, в моем куске кода в первом посте это есть:

Но практика показала что зависимость там не линейная, по этому и нужна таблица соотношений.

Я все сделал по примеру и получил отличный результат!

Огромное всем спасибо. Так по чуть-чуть и набью опыт.

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

Но практика показала что зависимость там не линейная, по этому и нужна таблица соотношений.

И... таблица не нужна.... при нелинейной зависимости делается линеаризация.... те берется несколько контрольных точек и вычисляется коэфф.приращения функции , обычно достаточно 3-5 точек + точка "ноль"

контрольные точки и их кол-во вводятся в интерактивном режиме уст-ва

и запоминаются показания АЦП в этих точках....

тогда кол-во топлива в баке равно:

Litr= const_Litr[i-1] + ( ADC - const_ADC[i-1])*(const_Litr - const_Litr[i-1])/(const_ADC - const_ADC[i-1])

где

ADC - текущие значение АЦП

const_Litr[5]={0,10,20,30,40} - контрольные точки в литрах

const_ADC[5]={23,189,453,790,1008} - значение АЦП в контр.точках

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

А не проще делать дискретизацию по АЦП, а не по объему? Данные для массива пересчитаны из массива IMXO.

const_litr[5]={-1.707, 13.075, 21,704, 29.233, 40.955}; //здесь числа дробные, но лучше использовать с фиксированной точкой или просто целые - зависит от точности
adc_ind=ADC / 4; //номер интервала
adc=ADC % 4; //координата внутри интервала
ADC_MAX = 1024 / 4; //максимальное число, которой может измерить АЦП +1 (для простоты математики)
litr = const_litr[adc_ind] + (const_litr[adc_ind+1] - const_litr[adc_ind]) * adc / ADC_MAX; //простейшая пропорция

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

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

Часть моих наработок.

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

какой в этом сакральный смысл? кстати COKPOWEHEU как вы собираетесь заливать в бак 13,075Л или -1.707Л :unknw:

смысл в том , что пользователь заливает контрольные объемы и указывает процессору в режиме калибровки сколько залито, процессор сохраняет эти данные в памяти и использует их в процессе работы,

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

и еще я специально для 0л указал 23 и для 40л указал 1008, те не полный диапазон АЦП , это позволяет осуществлять контроль обрыва датчика....

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

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

кстати COKPOWEHEU как вы собираетесь заливать в бак 13,075Л или -1.707Л :unknw:
Я? Никак. Эти числа получены интерполяцией Вашей таблицы полиномом 4 степени и переводом в другие координаты, график получился похожим.-1.707 л это то, что соответствует 0 на АЦП. Тоже, кстати, можно использовать для контроля повреждения датчика.

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

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

Часть моих наработок.

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

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

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