Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Термодатчик AD7415, помогите забодать
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
haker_fox
Считываю температуру, а она плавает: т.е. на первом измерении, допустим +25, на втором - +27, на третьем - +22 и т.д. Сначала грешил, что не верно работаю с I2C, но попробывал с аппаратным TWI ATmega8-16PI и с программным: результат одинаковый. Причем на изменение температуры он реагирует (датчик). Но, взяв его в руку он показывает примерно 33, 29, 35 градусов. Т.е. наблюдаются явные колебания от реальной температуры плюс минус 5-7 градусов. Даташит перечитал на несколько рядов, плюс человек, который мне эти термодатчики предложил, подтвердил правильность моего программного кода. Резисторы на шине 4,7 К, скорость почти самая низкая 20 000 Гц. Вот вопрос: в чем трабл??? Может кто встречался с подобным. Всем заранее спасибо, если что вот ICQ 399085018.
BlackJack
Есть подозрение, что он правильно показывает. Было нечто подобное с далласами. После включения схемы плата понемногу нагревалась,- оптроны рядом стояли. Может ветер дует? smile.gif Кстати, если все данные четные -может быть байт не до конца считывается. Такое тоже было на И2с..
fur
Цитата(haker_fox @ Oct 5 2005, 11:22)
Считываю температуру, а она плавает: т.е. на первом измерении, допустим +25, на втором - +27, на третьем - +22 и т.д. Сначала грешил, что не верно работаю с I2C, но попробывал с аппаратным TWI ATmega8-16PI и с программным: результат одинаковый. Причем на изменение температуры он реагирует (датчик). Но, взяв его в руку он показывает примерно 33, 29, 35 градусов. Т.е. наблюдаются явные колебания от реальной температуры плюс минус 5-7 градусов. Даташит перечитал на несколько рядов, плюс человек, который мне эти термодатчики предложил, подтвердил правильность моего программного кода. Резисторы на шине 4,7 К, скорость почти самая низкая 20 000 Гц. Вот вопрос: в чем трабл??? Может кто встречался с подобным. Всем заранее спасибо, если что вот ICQ 399085018.
*

Возможно, что плохо откалиброван сам датчик, я сталкивался с такой проблемой, правда у меня были датчики на основе термопары. Советую попробовать с другим датчиком, может глюк связан именно с этим конкретным.
NickB
Мы использовали датчики AD7414 (они почти такие же)- проблем не видел
haker_fox
2BlackJack: да нет, ветер не дует! У меня пять таких датчиков, два испытал - результат тот же самый. Человек, который посоветовал мне эти датчики проблем не ощущал. А насчет четности/не четности байта я проверю, спасибо за совет!

2NickB: извините, не могли бы Вы выслать программу опроса датчиков? Я уже не знаю что делать! Весь свой код проверил не один раз, все соединения, обматывал датчик изолентой (чтоб мнимый ветер не дул) и все бестолку.
artStinger
А что если тебе усреднять несколько измерений (5-7), тогда ты сможешь избавится от плаванья и получить относительно постоянное значение. Кстати, такое может наблюдаться если нестабилизировано напряжение питания...
PowerF1
попробуйте пройтись по всей шкале температур (скажем, сходите в баню, там обязательно висят термометры). Сравните серии измерений. Посмотрите на отклонения.
haker_fox
2artStinger: так-то оно так, да вот говорят, что эти датчики должны показывать постоянную температуру (по крайней мере не должна же она колебать на +-5 градусов).

2PowerF1: ага, заодно и помыться можноsmile.gif сразу двух зайцев убить. А может тогда уж воды вскипятить, опустить туда термометр и так проверить. Кстати опять убиваем двух несчастных зацев: кипятком можно заварить чай smile.gif
BlackJack
Цитата(haker_fox @ Oct 6 2005, 16:56)
2BlackJack: да нет, ветер не дует! У меня пять таких датчиков, два испытал - результат тот же самый. Человек, который посоветовал мне эти датчики проблем не ощущал. А насчет четности/не четности байта я проверю, спасибо за совет!

*


Немного непонятно из вопроса: различаются именно соседние измерения, или дрейфус плавный? Дело в том, что у меня в прибор заложен этот чип и вчера я тормознул закупку...
SergeyBorshch
У нас на фирме выпускается промышленные регуляторы и измерители температуры, в основном первичный датчик температуры у нас либо термосопротивление, либо терморары, цифровые датчики используються редко, поскольку у них предел до +180 град. в сравнении с аналоговыми - +1000 град. Так вот, для того чтобы небыло колебаний температуры предусмотрено:
1. усреднение результата (в среднем 20 усреднений - задает пользватель);
2. цифровая фильтрация результата - если текущее значение температуры отличается от результатов предыдущего измерения на большое значение (этот параметр также задает пользователь), то производится повторное измерение температуры, а на индикаторе остается старое значение. Таким образом мы уменьшаем влияние случайных импульсных помех на измерение.
haker_fox
2BlackJack: ну не знаю как это сказать! Вот значит показания с датчика снимаются каждые 0,5 сек:
1-ое значение 20 C
2-ое значение 25 C
3-ое значение 23 C
4-ое значение 22 C
5-ое значение 21 C и т. д.
К сожалению до сих пор не имею возможности узнать истинную температуру в комнате.

2SergeyBorshch: да, это дельный совет. Только вот смущает одно, мне-то говорили, что на них не должны так скакать значения. Но если так и будет продолжаться, то буду наверно применять цифровую фильтрацию.
haker_fox
Не знаю что и делать? Все советы, которые мне любезно дали в этой ветке я перепробывал. И все бестолку.
Я пробывал усреднять результат (10 измерений каждые 0,5 сек), ну все равно каждые 5 секунд, то 26, то 25, то 27. Так быть не должно!!!
Я вот выкладываю исходник, как я опрашиваю свой датчик, я не кого не прошу не очем и так слишком уже перевалил все свои проблемы. Просто, если кто захочет, пусть посмотрит и может найдет ошибки.

Данные:
МК ATmega-16PI
Компилятор: IAR EWAVR 4.11A
Частота кварца 16.000 MHz

Вот константы
#define THERMAL_H 0x94 //адрес домашнего термодатчика AD7415ART-0500RL7

#define WR 0
#define RD 1

#define TWI_TWBR 0x0C

Вот сам код:

//Инициализация I2C
void i2c_init(void)
{
TWBR = TWI_TWBR; //установить скорость шины i2c
TWCR = (1<<TWEN); //включить модуль i2c
}


volatile short int home_temp, street_temp; //домашняя у уличная температуры

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

TWCR=((1<<TWEN)|(1<<TWINT)|(1<<TWSTA)); //посылаем "старт"
i2c_delay(); //ждем установки флага TWINT
if((TWSR != 0x08)&&(TWSR != 0x10))//If status other than START
{street_temp=111; return;} //ошибка

TWDR=THERMAL_H|RD; //загружаем адрес датчика + чтение
TWCR = ((1<<TWINT)+(1<<TWEN));//инициируем передачу установкой TWINT + питание модуля TWI
i2c_delay(); //ждем установки флага TWINT
if(TWSR!=0x40)
{street_temp=222; return;} //ошибка передачи
TWCR = ((1<<TWINT)+(1<<TWEN)+(1<<TWEA)); //посылаем подтверждение, сбрасываем TWINT для приема второго байта

i2c_delay();
if(TWSR!=0x50) {street_temp=333; return;} //нет подтверждения, выход
home_temp=(TWDR<<8);
TWCR=((1<<TWINT)|(1<<TWEN)); //не посылаем подтверждение (последний байт уже принят)

i2c_delay(); //ждем установки флага TWINT
if((TWSR&0xf8)!=0x58) {street_temp=444; return;} //нет подтверждения, выход
home_temp|=(short unsigned int)TWDR;

i2c_delay();
TWCR = ((1<<TWEN)+(1<<TWINT)+(1<<TWSTO)); //посылаем "стоп"

home_temp>>=6; //вычисляем
home_temp/=4; //температуру
BlackJack
Цитата(haker_fox @ Oct 8 2005, 02:21)
2BlackJack: ну не знаю как это сказать! Вот значит показания с датчика снимаются каждые 0,5 сек:
1-ое значение 20 C

*


Постой-ка.
Почему 0,5 с??? там вроде бы преобразование 800 мс длится...
Замедляйся. и скорость СМбас тоже пониже сделай, на всякий случай.
haker_fox
нет, я задержки пробывал и раньше увеличивать, не помогало!!! Вот и сейчас опрос каждые 2,5 сек, та же хрень. Вот отсюда и отчаение полное: вроде все мелочи исправил, и все равно...
Runner
Возможно мой совет покажется ну уж слишком банальным, но все-таки.
Проверте разводку платы - не зашумлена ли "земля" попробуйте бросить и землю и питание "толстыми" проводами прямо на источник на плате. Как можно ближе к пину VDD - керамический конденсатор единицы - десятки nF с VDD на землю. Отфильтровать напряжение питания (хоть RC-цепочкой).

И еще раз извините, если обидел Вас этим советом.
haker_fox
2Runner: у меня все собрано на макетной плате, фильтры по цепи питания (два кондера 0,1 мкф) присутсвуют.
haker_fox
Люди, удалось забодать!!! Оказывается нужно прямо на саму микруху (только на нее) повешать кондер 0,1 мк. Спасибо, что один добрый человек подсказал, а то не знаю, что бы делал. С английским у меня не очень хорошо!!!
Все крупной удачи, как и мине!!! smile.gifsmile.gifsmile.gifsmile.gif
Runner
Цитата(haker_fox @ Oct 18 2005, 08:54)
Люди, удалось забодать!!! Оказывается нужно прямо на саму микруху (только на нее) повешать кондер 0,1 мк. Спасибо, что один добрый человек подсказал, а то не знаю, что бы делал. С английским у меня не очень хорошо!!!
Все крупной удачи, как и мине!!! smile.gifsmile.gifsmile.gifsmile.gif
*

Я Вам это советовал более недели назад.
"Ну вот, я же говорил" wink.gif
haker_fox
Runner:
Цитата
Я Вам это советовал более недели назад.
"Ну вот, я же говорил"

Да, действительно! Извините пожалуйста, что по-какой-то причине пропустил это! Больше не буду smile.gif
Dars
А я вот себе купил tmp36 и не могу управится с ним.А проблемы вот в чем,выходное напряжение если меряю ацп или мультиметром соответствует 10 градусам,что не может быть,если шунтировать выход кондером(чего по идее не надо делать) то выход около 26 градусов,что уже лучше,а если поставить последовательно резюк 750 ом то выход около 22 градусов,что на мой взгляд является нормой,если ставить резюк большого сопротивления то
выходое напрядение сильно зависит от его номинала. 750 ом я взял из доки,там рекомендуется подключать его если кабель длинный,но я подсоединял лапу датчика к лапе контроллера вообще без кабеля поэтому и этого сопротивления не должно быть. В общем фигня с ним творится,может кто работал,подскажет? Или посоветуйте как это можно выличить?Да и если ставить резистор то напряжение на лапе датчика меньше чем после резистора,то есть ток течет как бы к датчику,хотя должен от него,там ведь выход-эммитер...
haker_fox
Даааааааа. Может документация не изучена подпробно (от корки до корки), как у меня. Я слышал о tmp36 - отзывались о нем хорошо.
haker_fox
Извините за возвращение к старой теме, но возникли сомнения, а поделиться больше не с кем:-)
В общем датчики работают отлично, но... недавно понадобилось увеличить провода, которыми они подключены, до 2 м. Начались проблемы, например, при включении лампы дневного света, переставал работать модуль TWI. Восстановить работу получалось только жестким рестартом МК. Просто обновить значение управляющих регистров не помогало. Т.к. на этой шине висит еще и At24C32 & DS1307, я решил два датчика повесить на программную отдельную шину I2C, чтобы уж в крайнем случае, часы и память работали исправно. Все отлично, сбои прекратились, вроде бы. Но возник вопрос: все ли я верно сделал? Может быть нужен экранированный провод? Еще какие-нибудь дополнительные средства защиты, чтобы сбоев не повторилось? Из средств защиты есть только конденсаторы на шине питания возле разъемов для подключения датчиков 0,1 мкф. Что можно еще сделать?

P.S. Неужели модуль TWI такой "чувствительный", что не может работать на длинную линию связи (~2 м) или у меня руки кривые?
WHALE
Я на работе пользую другие термодатчики- DS1821,но они тоже висят на квадратной шине и условия
эксплуатации достаточно жесткие-датчиков 6 штук,расстояние до самого дальнего 7 метров и все это
на мощных ТВ И FM передатчиках.Стоит программная защита-при начале обмена запускается таймер на
5 секунд и обнуляется в конце обмена.Если модуль зависает-улет на прерывание по переполнению
таймера,где сбрасывается модуль TWI.Ну и защита от сбоев-опрос раз в 10с и если показания отличаются от предыдущих больше чем на 3 градуса,отсчет считается ложным.Контроллер -Мега8 от внутренного опорника 1Мгц,делитель тактовой i2c по максимуму.Работает уже года полтора без вопросов.Да,вся разводка обычным неэкранированным 4-х проводным проводом,единственное на каждый датчик фильтр LC по питанию-100мкгн и 0,1мкф.
haker_fox
Цитата(WHALE @ Feb 2 2006, 01:54) *
Я на работе пользую другие термодатчики- DS1821,но они тоже висят на квадратной шине и условия
эксплуатации достаточно жесткие-датчиков 6 штук,расстояние до самого дальнего 7 метров и все это
на мощных ТВ И FM передатчиках.Стоит программная защита-при начале обмена запускается таймер на
5 секунд и обнуляется в конце обмена.Если модуль зависает-улет на прерывание по переполнению
таймера,где сбрасывается модуль TWI.Ну и защита от сбоев-опрос раз в 10с и если показания отличаются от предыдущих больше чем на 3 градуса,отсчет считается ложным.Контроллер -Мега8 от внутренного опорника 1Мгц,делитель тактовой i2c по максимуму.Работает уже года полтора без вопросов.Да,вся разводка обычным неэкранированным 4-х проводным проводом,единственное на каждый датчик фильтр LC по питанию-100мкгн и 0,1мкф.


Чтож, примерно я так и думал, что нужно еще и LC фильтр поставить. А все-таки были случаи, что TWI вис? Раз защита предусмотрена, наверно вис smile.gif Не зря ли я подключил свои датчики на отдельную, программную шину? Правда, в моем девайсе не очень-то и допустимо, чтобы в случае сбоя TWI, перестали опрашиваться часики DS1307 sad.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.