Форум РадиоКот https://radiokot.ru/forum/ |
|
Встроенный в STM32F0 датчик температуры https://radiokot.ru/forum/viewtopic.php?f=59&t=115949 |
Страница 1 из 1 |
Автор: | kapitan0v [ Ср апр 15, 2015 17:01:32 ] |
Заголовок сообщения: | Встроенный в STM32F0 датчик температуры |
Всем привет! Решил попробовать встроенный датчик температуры в STM32F0. Был крайне разочарован. Нет, я прочитал конечно что он не точный, но что бы так. В общем в помещении 20, по расчету получается 13. ![]() В общем считаю так: Код: 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). Подскажите это вообще нормально? Как добиться более "корректных" показаний. |
Автор: | oleg110592 [ Чт апр 16, 2015 05:23:36 ] |
Заголовок сообщения: | Re: Встроенный в STM32F0 датчик температуры |
в 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); } |
Автор: | kapitan0v [ Чт апр 16, 2015 14:19:10 ] |
Заголовок сообщения: | Re: Встроенный в STM32F0 датчик температуры |
oleg110592 писал(а): в snippets для STM32F0 немного не так Так туда и подсматривал. Только VDD_APPLI / VDD_CALIB убрал, оно сделано для поправки при питании 3 В (как на плате Disovery), у меня 3.3. |
Автор: | kapitan0v [ Чт апр 16, 2015 15:30:15 ] |
Заголовок сообщения: | Re: Встроенный в STM32F0 датчик температуры |
Проблема решена. Нужно было учитывать ТОЧНОЕ значение Vref. Теперь показывает 27 градусов. Всем спасибо! |
Автор: | oleg110592 [ Чт апр 16, 2015 16:26:44 ] |
Заголовок сообщения: | Re: Встроенный в STM32F0 датчик температуры |
у меня на градус больше (STM32F030C6) ![]() ![]() |
Автор: | ave101 [ Ср июн 29, 2016 08:57:38 ] |
Заголовок сообщения: | Re: Встроенный в STM32F0 датчик температуры |
kapitan0v писал(а): Проблема решена. Нужно было учитывать ТОЧНОЕ значение Vref. Теперь показывает 27 градусов. Всем спасибо! А как Vref учитывать? |
Автор: | ave101 [ Чт июн 30, 2016 04:48:40 ] |
Заголовок сообщения: | Re: Встроенный в STM32F0 датчик температуры |
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; } |
Автор: | ave101 [ Чт июн 30, 2016 05:30:24 ] |
Заголовок сообщения: | Re: Встроенный в STM32F0 датчик температуры |
STM32 ADC Single Channel (Internal Temperature Sensor) https://www.youtube.com/watch?v=01sV-vgegtk http://embedded-lab.com/blog/stm32-adc-2/ И это не то. |
Автор: | ave101 [ Вс июл 03, 2016 14:42:51 ] |
Заголовок сообщения: | Re: Встроенный в STM32F0 датчик температуры |
Код: // Эта функция вычисляет температуру от измерения датчика температуры. Вычисление использует следующую формулу: // 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 градусах. |
Автор: | vastani [ Пн июл 04, 2016 11:33:01 ] |
Заголовок сообщения: | Re: Встроенный в STM32F0 датчик температуры |
А почему бы не прибегнуть к табличному точечно-калиброванному методу получения температуры? 1) Ну скажем вешается к контроллеру 18B20 + драйверо-софтец к нему + UART выдача данных на PC. По UARTу передаются парные данные температуры от 18B20 и внутренней мерилкой. 2) Тогда поместив платку в кулек + инертную среду типа банка с песком отправляется в морозилку скажем. Достигнув некой отрицательной температуры, достаем банку и ставим на стол, подключаем к PC и гоним данные датчиков логируя их в виде файла. 3) Данные получены, теперь импортируем данные в EXCEL таблицу, теперь можно и графики лицезреть и коэффициенты (ФАКТИЧЕСКИЕ!) выводить и таблицу зашивать в МК пусть и с шагом в один градус, а промежуточные если надо то аппроксимацией между точками получать, как вариант... 4) "Прогнав", таким образом несколько чипов, софта и его видов можно реально судить о точности и "плывучести" термодатчика. Учитывать Ref или нет как и сколько - это уже дело третье. |
Автор: | a5021 [ Пн июл 04, 2016 21:38:41 ] |
Заголовок сообщения: | Re: Встроенный в STM32F0 датчик температуры |
Слишком большие сложности. Внутренний термодатчик обеспечивает лишь приблизительную точность и калибровать его особого смысла нет. Стал МК греться чуть больше или чуть больше стал греться соседний с МК чип и поплыла вся калибровка к едрене фене. Как правильно считывать данные с термодатчика, есть в снайпетах для 030-й серии. |
Автор: | vastani [ Вт июл 05, 2016 11:12:11 ] |
Заголовок сообщения: | Re: Встроенный в STM32F0 датчик температуры |
Цитата: Стал МК греться чуть больше или чуть больше стал греться соседний с МК чип и поплыла вся калибровка к едрене фене. никакой логики в сказанном нет.На то он и внутренний чтобы внутри измерять, к калибровке отношения не имеет! Калибровка + таблица дает четкое понимание с некой точностью КАКУЮ именно температуру на кристалле имеет чип: 35? 20? 12?.... градусов. Потом калибровка уменьшает такую вещь, как нелинейность датчика, т.е. его несовершенство. Значительно уменьшаются вычислительные вещи по получению "готового" измерения (величины в чистом виде). Если ставится цель сделать ДЕШЁВЫЙ показометр лучше чем вариант - совсем плохо, то этот вариант самое то! |
Автор: | Z_h_e [ Вт июл 05, 2016 11:17:21 ] |
Заголовок сообщения: | Re: Встроенный в STM32F0 датчик температуры |
Немного поправлю в терминологии. Данная операция называется не калибровка, а градуировка. Но это так, для информации если что. |
Автор: | vastani [ Ср июл 06, 2016 12:37:20 ] |
Заголовок сообщения: | Re: Встроенный в STM32F0 датчик температуры |
да, градуировка |
Автор: | ave101 [ Чт июл 07, 2016 16:54:31 ] |
Заголовок сообщения: | Re: Встроенный в STM32F0 датчик температуры |
vastani писал(а): Если ставится цель сделать ДЕШЁВЫЙ показометр лучше чем вариант - совсем плохо, то этот вариант самое то! У меня была другая проблема - нехватка портов. 20-ти ножечный контроллер используется в ШИМ-контроллере для электролизера. Схема стоит под капотом автомобиля - в жару там возможно 100 градусов (пока не проверял). Нужно было сделать простую защиту - выключение на время при достижении, скажем 90 градусов. Плюнул я на этот внутренний термодатчик и решил проблему с помощью LM35. К схеме подключен блютуз модуль, который отправлял данные на телефон и принимал данные с телефона. Пришлось отказаться от приема данных с телефона (функция особо не нужная). Вот так и решил проблему. |
Автор: | Солнцеворот [ Чт авг 24, 2023 16:34:04 ] |
Заголовок сообщения: | Re: Встроенный в STM32F0 датчик температуры |
STM32F030F4P6. Прошу отозваться, если кому удавалось считать температуру с Temperature Sensor Channel Именно с этого микроконтроллера, 20-ножечное убожество. Есть подозрение, что на этой версии МК канал АЦП выпилен, т.к. измерение всегда возвращает 0xFFF. Это вряд-ли ошибка в коде, т.к. тот же код на STM32F072RBT6 работает корректно. |
Автор: | Солнцеворот [ Ср авг 30, 2023 18:00:11 ] |
Заголовок сообщения: | Re: Встроенный в STM32F0 датчик температуры |
Солнцеворот писал(а): Есть подозрение, что на этой версии МК канал АЦП выпилен, т.к. измерение всегда возвращает 0xFFF. Это вряд-ли ошибка в коде, т.к. тот же код на STM32F072RBT6 работает корректно. Сам и отвечу. После устранения ошибки температура читается. Другое дело, что она показывает не температуру окружающей среды, а температуру кристалла микроконтроллера. И если в сторону увеличения температуры термометр еще как-то адекватно показывает, то, при помещении его в холодильник, он этого практически не замечает. Теперь про причину, почему мне не удавалось считать значение АЦП. Отладочная плата одновременно была подключена к отладчику ST-Link и к преобразователю USB-UART. Питание 3.3В также подано и с отладчика и с преобразователя (чего нельзя делать категорически). Как я понял, это и привело к тому, что АЦП работал некорректно. Возможно, усугубила ситуацию некорректная разводка аналогового питания МК. Читатель, ты пришел сюда не просто так, надеюсь, тебе это поможет в поиске своей ошибки. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |