Например TDA7294

Форум РадиоКот • Просмотр темы - Встроенный в STM32F0 датчик температуры
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 23, 2024 22:31:41

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 17 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Встроенный в STM32F0 датчик температуры
СообщениеДобавлено: Ср апр 15, 2015 17:01:32 
Открыл глаза

Зарегистрирован: Сб июн 14, 2014 09:05:06
Сообщений: 56
Рейтинг сообщения: 0
Всем привет!

Решил попробовать встроенный датчик температуры в STM32F0. Был крайне разочарован. Нет, я прочитал конечно что он не точный, но что бы так. В общем в помещении 20, по расчету получается 13. :( Хотя должно быть больше 20, чип же греется.

В общем считаю так:

Код:
    float localTempSensor;

    uint16_t *localTS_CAL1 = (uint16_t *)0x1FFFF7B8;
    uint16_t *localTS_CAL2 = (uint16_t *)0x1FFFF7C2;

    localTempSensor = localValueTempSensor - *localTS_CAL1;
    localTempSensor = localTempSensor * 80;
    localTempSensor = localTempSensor / (*localTS_CAL2 - *localTS_CAL1);
    localTempSensor = localTempSensor + 30;


Еще очень смущает что значение в localTS_CAL1 (это которое при 30 градусах) больше чем localTS_CAL2 (которое 110).

Подскажите это вообще нормально? Как добиться более "корректных" показаний.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Встроенный в STM32F0 датчик температуры
СообщениеДобавлено: Чт апр 16, 2015 05:23:36 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
в snippets для STM32F0 немного не так:
Код:
/* Temperature sensor calibration value address */
#define TEMP110_CAL_ADDR ((uint16_t*) ((uint32_t) 0x1FFFF7C2))
#define TEMP30_CAL_ADDR ((uint16_t*) ((uint32_t) 0x1FFFF7B8))
#define VDD_CALIB ((uint16_t) (330))
#define VDD_APPLI ((uint16_t) (300))
......
  ADC1->CR |= ADC_CR_ADSTART; /* Start the ADC conversion */
 
  while (1) /* Infinite loop */
  {   
    while ((ADC1->ISR & ADC_ISR_EOC) == 0); /* Wait end of conversion */
    temperature_C = ComputeTemperature((int32_t) ADC1->DR);
......

/**
  * @brief  This function computes the temperature from the temperature sensor measure
  *         The computation uses the following formula :
  *         Temp = (Vsense - V30)/Avg_Slope + 30
  *         Avg_Slope = (V110 - V30) / (110 - 30)
  *         V30 = Vsense @30°C (calibrated in factory @3.3V)
  *         V110 = Vsense @110°C (calibrated in factory @3.3V)
  *         VDD_APPLI/VDD_CALIB coefficient allows to adapt the measured value
  *         according to the application board power supply versus the
  *         factory calibration power supply.
  * @param  measure is the a voltage measured from the temperature sensor (can have been filtered)
  * @retval returns the computed temperature
  */
int32_t ComputeTemperature(uint32_t measure)
{
  int32_t temperature;
 
  temperature = ((measure * VDD_APPLI / VDD_CALIB) - (int32_t) *TEMP30_CAL_ADDR ) ;   
  temperature = temperature * (int32_t)(110 - 30);                     
  temperature = temperature / (int32_t)(*TEMP110_CAL_ADDR - *TEMP30_CAL_ADDR);                 
  temperature = temperature + 30;
  return(temperature);
}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Встроенный в STM32F0 датчик температуры
СообщениеДобавлено: Чт апр 16, 2015 14:19:10 
Открыл глаза

Зарегистрирован: Сб июн 14, 2014 09:05:06
Сообщений: 56
Рейтинг сообщения: 0
oleg110592 писал(а):
в snippets для STM32F0 немного не так


Так туда и подсматривал. Только VDD_APPLI / VDD_CALIB убрал, оно сделано для поправки при питании 3 В (как на плате Disovery), у меня 3.3.


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Встроенный в STM32F0 датчик температуры
СообщениеДобавлено: Чт апр 16, 2015 15:30:15 
Открыл глаза

Зарегистрирован: Сб июн 14, 2014 09:05:06
Сообщений: 56
Рейтинг сообщения: 0
Проблема решена. Нужно было учитывать ТОЧНОЕ значение Vref. Теперь показывает 27 градусов. Всем спасибо!


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

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

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Встроенный в STM32F0 датчик температуры
СообщениеДобавлено: Чт апр 16, 2015 16:26:44 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
у меня на градус больше (STM32F030C6) :)
Изображение


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Встроенный в STM32F0 датчик температуры
СообщениеДобавлено: Ср июн 29, 2016 08:57:38 
Первый раз сказал Мяу!
Аватар пользователя

Карма: 1
Рейтинг сообщений: 5
Зарегистрирован: Пт янв 02, 2015 14:45:31
Сообщений: 32
Рейтинг сообщения: 0
kapitan0v писал(а):
Проблема решена. Нужно было учитывать ТОЧНОЕ значение Vref. Теперь показывает 27 градусов. Всем спасибо!

А как Vref учитывать?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Встроенный в STM32F0 датчик температуры
СообщениеДобавлено: Чт июн 30, 2016 04:48:40 
Первый раз сказал Мяу!
Аватар пользователя

Карма: 1
Рейтинг сообщений: 5
Зарегистрирован: Пт янв 02, 2015 14:45:31
Сообщений: 32
Рейтинг сообщения: 0
1. http://datasheet.octopart.com/STM32F030 ... 349471.pdf
2. http://www.picproje.org/index.php?topic=59869.5;imode
3. http://ep.com.pl/files/10550.pdf
4. http://dpe-technics.ru/mcu/stm32l-temperature-sensor/
5. http://catethysis.ru/stm32-internal-thermosensor/

И ни одна из формул не показывает даже приблизительно нормальные значения.
Настрою левыми коэффициентами правильные 30 градусов на выходе, нагреваю феном до 60 градусов и показывает около 40.
Питание 3.3V. На выходе нужна temperature*10.

Код:
int32_t Temperature(uint16_t tADC, uint16_t vref) {      // (tADC=1850 и vref=1956 при 30 град.) (tADC=1799 и vref=1933 при 60 град.)
   uint16_t *VREFINT_CAL  = (uint16_t *)0x1FFFF7BA;   // VREFINT_CAL         1540
    uint16_t *localTS_CAL1 = (uint16_t *)0x1FFFF7B8;   // TEMP30_CAL_ADDR      1759
    uint16_t *localTS_CAL2 = (uint16_t *)0x1FFFF7C2;   // TEMP110_CAL_ADDR      1303
    float temperature, Vdda;
    uint16_t TS_data_norm;

   q1 = *VREFINT_CAL;
   q2 = *localTS_CAL1;
   q3 = *localTS_CAL2;

//   temperature = ((80*((*VREFINT_CAL * tADC) - (*localTS_CAL1 * vref)))/((*localTS_CAL2 - *localTS_CAL1) * vref))+30;

//   temperature = (tADC - *localTS_CAL1) * 800;                        // (1850 - 1759 = 91) * 800 = 72800
//   temperature = temperature / (*localTS_CAL2 - *localTS_CAL1);         // 72800 / (1303 - 1759 = -456) = -159,6
//   temperature = temperature + 300;                              // -159 + 300 = 141
//   temperature = (((vref - *VREFINT_CAL) * 10) / 26) + temperature;      // (((1956 - 1540) * 10 = 4160) / 26 = 160) + 141 = 301

   Vdda = 3.3 * ((float) *VREFINT_CAL / vref);                        // 3.3*(1540/1956=0.7873) = 2.5981
   TS_data_norm = tADC * Vdda / 3.3;                              // 1850 * 2.5981 / 3.3 = 1456
   Vdda = 3.3 * (float) (vref - *VREFINT_CAL) / 19;
//   temperature = (((float) 80 / (*localTS_CAL2 - *localTS_CAL1)) * (tADC - *localTS_CAL1) + 30);            // без нормализации
   // (80 / (1303 - 1759 = -456)) * (1850 - 1759 = 91) + 30 = -0.1754 * 91 + 30 = -15.9614 + 30 = 14.03 * 21.4 = 300
   temperature = (((float) 80 / (*localTS_CAL2 - *localTS_CAL1)) * (TS_data_norm - *localTS_CAL1) + 30);      // с нормализацией
   // (80 / (1303 - 1759 = -456)) * (1456 - 1759 = -303) + 30 = -0.1754 * -303 + 30 = 53.14 + 30 = 83.14
   temperature = ((float) temperature / 2.7713)*10;                  // 83.14 / 2.77 = 30.0 * 10 = 300
   return temperature;
}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Встроенный в STM32F0 датчик температуры
СообщениеДобавлено: Чт июн 30, 2016 05:30:24 
Первый раз сказал Мяу!
Аватар пользователя

Карма: 1
Рейтинг сообщений: 5
Зарегистрирован: Пт янв 02, 2015 14:45:31
Сообщений: 32
Рейтинг сообщения: 0
STM32 ADC Single Channel (Internal Temperature Sensor)
https://www.youtube.com/watch?v=01sV-vgegtk
http://embedded-lab.com/blog/stm32-adc-2/

И это не то.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Встроенный в STM32F0 датчик температуры
СообщениеДобавлено: Вс июл 03, 2016 14:42:51 
Первый раз сказал Мяу!
Аватар пользователя

Карма: 1
Рейтинг сообщений: 5
Зарегистрирован: Пт янв 02, 2015 14:45:31
Сообщений: 32
Рейтинг сообщения: 0
Код:
// Эта функция вычисляет температуру от измерения датчика температуры. Вычисление использует следующую формулу:
// V30 = Vsense@30 °C (откалиброван на заводе @3.3V)
// V110 = Vsense@110 °C (откалиброван на заводе @3.3V)
// Avg_Slope = (V110-V30)/(110-30)
// Temp = (Vsense-V30)/Avg_Slope+30
// VDD_APPLI/VDD_CALIB - коэффициент позволяет адаптировать измеренное значение
// в соответствии с приложенным к плате источником питания по сравнению с заводской калибровкой питания.
// Мерой является напряжение измеряется от датчика температуры (может быть отфильтрован). Возвращает расчетную температуру.

uint16_t Temperature(uint16_t tADC, uint16_t vref) {
    float temperature;                     // tADC=1850, vref=1956 при 30 град. (tADC=1799, vref=1933 при 60 град.)
    uint16_t *VREFINT_CAL  = (uint16_t *)0x1FFFF7BA;   // VREFINT_CAL         1540
    uint16_t *localTS_CAL1 = (uint16_t *)0x1FFFF7B8;   // TEMP30_CAL_ADDR      1759
    uint16_t *localTS_CAL2 = (uint16_t *)0x1FFFF7C2;   // TEMP110_CAL_ADDR      1303

   q1 = *VREFINT_CAL;
   q2 = *localTS_CAL1;
   q3 = *localTS_CAL2;

   temperature = ((tADC - *localTS_CAL1)/((*localTS_CAL2 - *localTS_CAL1)/800))+300;
//   ((1850-1759=91)/((1303-1759 = -456)/800=-0.57)=-15.96)+300 = 140
   temperature = temperature * (vref / *VREFINT_CAL);
//   140*(1956/1540=1.27) = 355 градусов при 30
//   229*(1933/1540=1.25) = 572 градусов при 60
   return temperature;                                                // Out temperature*10
}

Но на деле все не так, как в расчетах.
Хотельсь бы узнать какие значения tADC и vref у других получаются при 30 и 60 градусах.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Встроенный в STM32F0 датчик температуры
СообщениеДобавлено: Пн июл 04, 2016 11:33:01 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Чт май 05, 2011 15:35:36
Сообщений: 26
Рейтинг сообщения: 0
А почему бы не прибегнуть к табличному точечно-калиброванному методу получения температуры?

1) Ну скажем вешается к контроллеру 18B20 + драйверо-софтец к нему + UART выдача данных на PC.
По UARTу передаются парные данные температуры от 18B20 и внутренней мерилкой.

2) Тогда поместив платку в кулек + инертную среду типа банка с песком отправляется в морозилку скажем.
Достигнув некой отрицательной температуры, достаем банку и ставим на стол, подключаем к PC и гоним данные датчиков
логируя их в виде файла.

3) Данные получены, теперь импортируем данные в EXCEL таблицу, теперь можно и графики лицезреть и коэффициенты (ФАКТИЧЕСКИЕ!) выводить и таблицу зашивать в МК пусть и с шагом в один градус, а промежуточные если надо то аппроксимацией между точками получать, как вариант...

4) "Прогнав", таким образом несколько чипов, софта и его видов можно реально судить о точности и "плывучести" термодатчика.
Учитывать Ref или нет как и сколько - это уже дело третье.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Встроенный в STM32F0 датчик температуры
СообщениеДобавлено: Пн июл 04, 2016 21:38:41 
Друг Кота

Карма: 20
Рейтинг сообщений: 228
Зарегистрирован: Пт сен 13, 2013 13:11:31
Сообщений: 6388
Рейтинг сообщения: 0
Слишком большие сложности. Внутренний термодатчик обеспечивает лишь приблизительную точность и калибровать его особого смысла нет. Стал МК греться чуть больше или чуть больше стал греться соседний с МК чип и поплыла вся калибровка к едрене фене. Как правильно считывать данные с термодатчика, есть в снайпетах для 030-й серии.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Встроенный в STM32F0 датчик температуры
СообщениеДобавлено: Вт июл 05, 2016 11:12:11 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Чт май 05, 2011 15:35:36
Сообщений: 26
Рейтинг сообщения: 0
Цитата:
Стал МК греться чуть больше или чуть больше стал греться соседний с МК чип и поплыла вся калибровка к едрене фене.
никакой логики в сказанном нет.
На то он и внутренний чтобы внутри измерять, к калибровке отношения не имеет!
Калибровка + таблица дает четкое понимание с некой точностью КАКУЮ именно температуру на кристалле имеет чип: 35? 20? 12?.... градусов.
Потом калибровка уменьшает такую вещь, как нелинейность датчика, т.е. его несовершенство.
Значительно уменьшаются вычислительные вещи по получению "готового" измерения (величины в чистом виде).
Если ставится цель сделать ДЕШЁВЫЙ показометр лучше чем вариант - совсем плохо, то этот вариант самое то!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Встроенный в STM32F0 датчик температуры
СообщениеДобавлено: Вт июл 05, 2016 11:17:21 
Собутыльник Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2694
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Немного поправлю в терминологии. Данная операция называется не калибровка, а градуировка. Но это так, для информации если что.

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Встроенный в STM32F0 датчик температуры
СообщениеДобавлено: Ср июл 06, 2016 12:37:20 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Чт май 05, 2011 15:35:36
Сообщений: 26
Рейтинг сообщения: 0
да, градуировка


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Встроенный в STM32F0 датчик температуры
СообщениеДобавлено: Чт июл 07, 2016 16:54:31 
Первый раз сказал Мяу!
Аватар пользователя

Карма: 1
Рейтинг сообщений: 5
Зарегистрирован: Пт янв 02, 2015 14:45:31
Сообщений: 32
Рейтинг сообщения: 0
vastani писал(а):
Если ставится цель сделать ДЕШЁВЫЙ показометр лучше чем вариант - совсем плохо, то этот вариант самое то!

У меня была другая проблема - нехватка портов.
20-ти ножечный контроллер используется в ШИМ-контроллере для электролизера. Схема стоит под капотом автомобиля - в жару там возможно 100 градусов (пока не проверял). Нужно было сделать простую защиту - выключение на время при достижении, скажем 90 градусов.

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Встроенный в STM32F0 датчик температуры
СообщениеДобавлено: Чт авг 24, 2023 16:34:04 
Встал на лапы
Аватар пользователя

Карма: 3
Рейтинг сообщений: 8
Зарегистрирован: Вт июн 03, 2008 01:39:47
Сообщений: 140
Рейтинг сообщения: 0
STM32F030F4P6. Прошу отозваться, если кому удавалось считать температуру с Temperature Sensor Channel
Именно с этого микроконтроллера, 20-ножечное убожество.

Есть подозрение, что на этой версии МК канал АЦП выпилен, т.к. измерение всегда возвращает 0xFFF.
Это вряд-ли ошибка в коде, т.к. тот же код на STM32F072RBT6 работает корректно.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Встроенный в STM32F0 датчик температуры
СообщениеДобавлено: Ср авг 30, 2023 18:00:11 
Встал на лапы
Аватар пользователя

Карма: 3
Рейтинг сообщений: 8
Зарегистрирован: Вт июн 03, 2008 01:39:47
Сообщений: 140
Рейтинг сообщения: 0
Солнцеворот писал(а):
Есть подозрение, что на этой версии МК канал АЦП выпилен, т.к. измерение всегда возвращает 0xFFF.
Это вряд-ли ошибка в коде, т.к. тот же код на STM32F072RBT6 работает корректно.

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

Теперь про причину, почему мне не удавалось считать значение АЦП. Отладочная плата одновременно была подключена к отладчику ST-Link и к преобразователю USB-UART. Питание 3.3В также подано и с отладчика и с преобразователя (чего нельзя делать категорически).
Как я понял, это и привело к тому, что АЦП работал некорректно. Возможно, усугубила ситуацию некорректная разводка аналогового питания МК.

Читатель, ты пришел сюда не просто так, надеюсь, тебе это поможет в поиске своей ошибки.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 17 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 26


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y