Перейти к содержимому

Фотография

Индикаторы температуры и давления


Сообщений в теме: 25

Опрос: Интересна ли тема народу. (18 пользователей проголосовало)

Быть теме?

  1. Однозначно быть! (18 голосов [100.00%])

    Процент голосов: 100.00%

  2. Теме тут не место! (0 голосов [0.00%])

    Процент голосов: 0.00%

  3. Мне базразлично. (0 голосов [0.00%])

    Процент голосов: 0.00%

#1
AndreyUA

    Продвинутый пользователь

  • Пользователи
  • 36 сообщений
Собственно, под влиянием положительных эмоций от темы "Бакометр" начал задумываться и о других цифровых приборах. А именно индикатор температуры ОЖ и давления масла. Ведь у этих датчиков принцип работы такой же, как и у датчика бензина - изменение сопротивления, зависящее от внешних факторов.
По этой причине, я начал углублённо изучать микроконтроллеры AVR. Почему-то, они мне ближе, нежели PIC и программируются легче.
До сегодняшнего дня пытался уже как-то вникнуть в программирование на Ассемблере и на СИ, но ничего более как помигать светодиодом у меня не выходило. Я не программист. Программирование мне очень трудно дается. Но, как говорится, терпение и труд все перетрут!
Тему создал, как просьбу о помощи. Самообучание программировать МК занимает много времени, а результата хочется уже сайчас.
По сей причине, БУДУ РАД ЛЮБОЙ ПОМОЩИ! Я не прошу дать готовую прошивку, а прошу посотрудничать в разработке полезных устройств, которые, возможно будут полезны не только мне.


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

- За основу хочу взять ATTiny26, наверное это самый маленький МК, у которого есть на борту АЦП и у которого хватит ножек для управления трёх-разрядным семисегментником в динамике.


Задача МК (датчик температуры ОЖ)
- Использовать внутренне опорное напряжение 2.56 в.
- Получать напряжение с делителя (постоянный резистор + датчик) и оцифровывать его на диапазон 0…255.
- Делать усреднение получаемых данных в течение 2-3 сек.
- Полученный результат вывести на индикатор в виде заданных чисел в диапазоне 50 - 130.
- Если напряжение на входе вне диапазона (больше чем 2.56 в.) - показывать ---. Пояснения ниже.
- Мигание индикатора в диапазоне чисел 110 - 130.
- МК не должен калиброваться, чтобы не усложнять конструкцию.

Логика проста. Штатный стрелочный индикатор разбит на равные участки 50-90-130 (+40).
Датчик температуры имеет полезное сопротивление в дапазоне 300 - 0 Ом относительно массы.
При сопротивлении датчика в 300 Ом, стрелка штатного шкалика стоит на отметке 50 гр.
С прогревом, сопротивление уменьшается линейно и уже при 150 Ом стрелка стоит на 90 гр. и так далее.

Когда двигатель холодный (около 0 гр. по цельсию), сопротивление датчика равно ~5к.
Так вот, если в делителе использовать постоянный резистор на 300 Ом, мы получим как раз тот диапазон напряжений, что является полезным.
А когда на ножке МК будет присутствоват напряжение от 5 и до 2.5 вольта (сопротивление датчика еще не упало до отметки 300 Ом), индикатор должен показывать три средних сегмента (---), что означает, мол двигатель холодный, движение не рекомендуется.

Вот как-то так :)
Надеюсь, изложил все ясно. Буду делать попытки написать что-то. Кстати, приглянулся мне Algorithm Builder. В этой программе у меня хоть что-то получается.
И, как я уже говорил, буду рад любой вашей помощи.

Спасибо за внимание!

#2
goda

    Продвинутый пользователь

  • Проверенные
  • 565 сообщений

Вот как-то так :)
Надеюсь, изложил все ясно. Буду делать попытки написать что-то. Кстати, приглянулся мне Algorithm Builder. В этой программе у меня хоть что-то получается.
И, как я уже говорил, буду рад любой вашей помощи.

Спасибо за внимание!

Algorithm Builder.практически тот же Flowcode если заинтересует могу помочь в освоении проги ,тема уже подымалась
вот https://bezkz.su/foru…c/268-flowcode/

#3
AndreyUA

    Продвинутый пользователь

  • Пользователи
  • 36 сообщений
Сейчас вот написал программу на Algorithm Builder чтобы на индикатор выводились цифры, полученные на входе АЦП. Собственно, все вроде работает.
Но просимулировал в Протеусе и вышла такая штука:
- Используется внутренее опорное напряжение 2.56 вольта.
- Через делитель 1:1 подаю на вход АЦП 2.5 в, а МК пишет цифры 128 вместо 255 (или близкое тому).
- Подаю на вход 5 в. - пишет 255.

Собственно, вопрос: опорное напряжение задает максимум измеряемого или же максимум есть питание МК?

Такое впечатление, что опорное напряжение есть средняя точка между землей и питанием <_<

________________________________
update

Разобрался. В Протеусе нету Tiny26, а есть Tiny261. Они немного отличаются по настройкам АЦП. Вот и был казус.
Все поправил. Вроде работает :)
На днях выложу архив со всеми исходниками. Может кому интересно будет.

#4
Sergey_L

    Продвинутый пользователь

  • Проверенные
  • 382 сообщений
  • ГородМосква
Все верно, измеряемое напряжение должно быть меньше опорного.

P.S. У меня все это уже работает на базе бакометра, только дополняет штатные приборы.
Если и делать "градусник", то от -50 до +125.Со штатным ТМ-106 большой гимор из-за его нелинейности,
присмотрись к 19.3828
http://avgaz.narod.r…ovdattemper.htm
с ним все просто, сразу выдает напругу равную Т в Кельвинах … (С=К-273)

#5
AndreyUA

    Продвинутый пользователь

  • Пользователи
  • 36 сообщений

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

P.S. У меня все это уже работает на базе бакометра, только дополняет штатные приборы.

Ты делал на базе того же PIC16F676?

#6
Sergey_L

    Продвинутый пользователь

  • Проверенные
  • 382 сообщений
  • ГородМосква

Ты делал на базе того же PIC16F676?


Ага, все на нем, менялась только прошивка.
и даже напряжометр …, мы ж не так просто с 3-мя цифрами мутили …

#7
AndreyUA

    Продвинутый пользователь

  • Пользователи
  • 36 сообщений
А я вот пытаюсь с нуля сделать на ATTiny26. Собственно, заминка в чем. Выход с АЦП имею, но я не знаю, как правильно динамическую индикацию сделать.

Может ли кто-то расписать алгоритм вывода информации на индикаторы?
Например. Получаю я данные с АЦП в диапазоне от 0 до 255. Эти данные у меня сохраняются в переменной adc_in.
И теперь я не знаю алгоритма КАК ПРАВИЛЬНО сделать вывод этих данных.
Знаю только, что по переполнению таймера надо менять разряды. А дальше хз

#8
goda

    Продвинутый пользователь

  • Проверенные
  • 565 сообщений
вот на радиокоте СТАТЬЯ БЫЛА

#9
AndreyUA

    Продвинутый пользователь

  • Пользователи
  • 36 сообщений

вот на радиокоте СТАТЬЯ БЫЛА

ОООО, спасибо! То что надо. Первые результаты уже не за горами :)

#10
AndreyUA

    Продвинутый пользователь

  • Пользователи
  • 36 сообщений
Урряяя! Первые результаты. Программа, как по мне получилась очень компактная.
Сейчас на индикаторы выводится результат прямо с АЦП. Тобишь, диапазон от 0 до 255.

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



Тут в заглавии немного попутал. Прошивка под общий анод. А для катода строчки закомментированы












Может есть варианты попроще для разбиения числа на составляющие?

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

P.S. У меня все это уже работает на базе бакометра, только дополняет штатные приборы.
Если и делать "градусник", то от -50 до +125.Со штатным ТМ-106 большой гимор из-за его нелинейности,
присмотрись к 19.3828
http://avgaz.narod.r…ovdattemper.htm
с ним все просто, сразу выдает напругу равную Т в Кельвинах … (С=К-273)


Спасибо за ссылку. По большему счету такой диапазон мне и не нужен. Просто хочу сделать, чтоб красиво было :)
Так вот, у штатного датчика некая линейность появляется от 300 Ом (это равно 50 гр. по цельсию, если верить стрелке). По мере прогрева - сопротивление падает. 90 гр. - 150 Ом. Я прям на машине проверял.

#11
Sergey_L

    Продвинутый пользователь

  • Проверенные
  • 382 сообщений
  • ГородМосква
AndreyUA
у ТМ-106 нет никакой линейности, я с ним чего только ни делал …
http://avtokat01.nar…oxlazdenie.html
Вот и решил оставить его на стрелку, а цифру брать с 19.3828, самое то (по схеме бакометра).

#12
goda

    Продвинутый пользователь

  • Проверенные
  • 565 сообщений

Например. Получаю я данные с АЦП в диапазоне от 0 до 255. Эти данные у меня сохраняются в переменной adc_in.
И теперь я не знаю алгоритма КАК ПРАВИЛЬНО сделать вывод этих данных.
Знаю только, что по переполнению таймера надо менять разряды. А дальше хз

Если мы с АЦП получаем 8-битный результат, это значит, что диапазон от 0 до опорного напряжения разбит на 255 частей, например, если опорное напряжение 5 вольт, то 1 бит у нас равен 5/255=0,0196 вольт. Таким образом, результат с АЦП нужно множить на коэффициент 0,0196, тогда мы получим значение в вольтах. Преобразование в десятичную форму нужно делать непосредственно перед выводом на индикацию,помня, что нам нужно перенести точку на 4 знака влево.

#13
AndreyUA

    Продвинутый пользователь

  • Пользователи
  • 36 сообщений

AndreyUA
у ТМ-106 нет никакой линейности, я с ним чего только ни делал …
http://avtokat01.nar…oxlazdenie.html
Вот и решил оставить его на стрелку, а цифру брать с 19.3828, самое то (по схеме бакометра).

Блин, ну что за датчики в жигулях :(
А с какой машины этот 19.3828? Он вместо родного вкрутится?

#14
Sergey_L

    Продвинутый пользователь

  • Проверенные
  • 382 сообщений
  • ГородМосква

Блин, ну что за датчики в жигулях :(
А с какой машины этот 19.3828? Он вместо родного вкрутится?

Сам датчик идет на ВОЛГАх, ГАЗЕЛях,
На простой классике 2101-1303014 место под него накернено, но не просверлено,
штатно вкручивается во входной патрубке головки блока 21213-1303014 вместо датчика 2112-3851010 (23.3828)
http://www.konsulavt…ml?part=2010143

#15
AndreyUA

    Продвинутый пользователь

  • Пользователи
  • 36 сообщений
Меня все не покидает мысль, как приспособить МК к штатному нелинейному датчику. Ведь диапазон измерения 0.01в, а этого вполне должно быть достаточно, чтобы разделить кривую на участки, по которым и выводить необходимую температуру. Если бы я чуть лучше понимал в программировании, покопался бы в коде "бакометра" Gipsy.
Надо как-то забить уже готовые значения на вход АЦП МК, чтобы обойтись без калибровки.
Снять характеристики с датчика не будет проблемой.
Может кто-то поможет с алгоритмом программы?
Суть такова (считаем что данные с АЦП мы получили):
- Допустим, разбить диапазон от "00" до "FF" на 10 участков.
- Определить, в каком участке находятся данные в АЦП.
- Вывести на дисплей данные.

Как-то всё упрощенно написал. Но, пока, подробнее не осиливаю.

#16
Sergey_L

    Продвинутый пользователь

  • Проверенные
  • 382 сообщений
  • ГородМосква
Ну это просто, даже я, нешарящий в программировании и то разобрался …
для начала определись останется у тебя штатная стрелка или нет, если да - это сложнее,
а если нет - шунтируешь датчик резюком ок. 10кОм и получаешь хар-ку близкую к линейной
(я так делал в детстве еще на 572ПВ2(5)).
Теперь по сути бакометра:
меняешь тут:
const
stNormal : byte = 1;
stCalibr : byte = 2;
AdrHi : byte = 1; // кол-во замеров
litr : array [0..AdrHi] of byte = (0, …, 255); // их выводимые значения

комментируешь в исходнике процедуру калибровки (это надежнее) или не ставишь кнопку
компилишь
открываешь .HEX в программаторе и редактируешь EEPROM
вбиваешь в него руками свои расчетные значения от 00 до FF
сохраняешь и можешь им поиграть в ПРОТЕУСЕ уже со своими данными или заливаешь сразу в ПИК

я именно так сделал себе вольтметр 0 - 25.5в в авто именно из бакометра,
но пришлось поменять наоборот его логику работы, а потом из вольтметра и термометр на 19.3828

#17
goda

    Продвинутый пользователь

  • Проверенные
  • 565 сообщений

Надо как-то забить уже готовые значения на вход АЦП МК, чтобы обойтись без калибровки.
Снять характеристики с датчика не будет проблемой.
Может кто-то поможет с алгоритмом программы?
Суть такова (считаем что данные с АЦП мы получили):
- Допустим, разбить диапазон от "00" до "FF" на 10 участков.
- Определить, в каком участке находятся данные в АЦП.
- Вывести на дисплей данные.

Если характеристики снять не проблемма и датчик ну уж совсем не линейный я бы сделал так,
диапазон ацп разбиваем например на 10 нужных значений, пусть это будет диапазон 0-100 градусов шаг показаний будет в 10 градусов соответственно 10 переменных TEMP десять разных значений АЦП для выполнения решения.
Для каждого условия присваиваем свое значение АЦП, TEMP1=10, TEMP2=25,TEMP3=45 и так далее,выполняем решение,читаем АЦП сравниваем с переменной ТЕМP
и выполняем условие если ТЕМP>=45 это 30 градусов (Выводим значение 30 гр), ТЕМP>=25 это 20 градусов (Выводим значение 20 гр) ну и так далее для нужных значений АЦП.
Данные эти можно занести в основной цикл программы но их уже не изменить ,или в ЕЕПРОМ и считывать их перед основным циклом, а изменять программно перед прошивкой это если понадобиться корректировка в процесе эксплуатации.
Поправьте меня если не прав с ув. ;)

#18
AndreyUA

    Продвинутый пользователь

  • Пользователи
  • 36 сообщений
Всем привет! Нашлось немного свободного времени, попытался вчера снять характеристику с датчика ТМ106. Мягко говоря, я был шокирован.
Такого расброса сопротивления я не ожидал. По этой причине, решил что-то варганить на термисторе.
График зависимости сопротивления от температуры я взял из даташита. График зависимости напряжения дорисовал сам.
На графиках я оставил только рабочий диапазон, все лишнее убрал. Пока буду так делать, а там видно будет.

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

Привожу характеристики термистора 640.103 (10к, +/- 5%).




#19
Sergey_L

    Продвинутый пользователь

  • Проверенные
  • 382 сообщений
  • ГородМосква
Желание задействовать штатный датчик (ТМ-106), ну это еще было понятно, но мутить свой …
Все-таки присмотрись тут:
http://www.atrd.ru/p…sti_423828.html
да и диапазое поинтереснее, вышел утром из дома, сел в машину и знаешь сколько на улице.

#20
AndreyUA

    Продвинутый пользователь

  • Пользователи
  • 36 сообщений

Желание задействовать штатный датчик (ТМ-106), ну это еще было понятно, но мутить свой …
Все-таки присмотрись тут:
http://www.atrd.ru/p…sti_423828.html
да и диапазое поинтереснее, вышел утром из дома, сел в машину и знаешь сколько на улице.

Датчик интересный, но его не вкрутить в родное место.