Ср апр 15, 2015 17:01:32
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;
Чт апр 16, 2015 05:23:36
/* 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);
}
Чт апр 16, 2015 14:19:10
oleg110592 писал(а):в snippets для STM32F0 немного не так
Чт апр 16, 2015 15:30:15
Чт апр 16, 2015 16:26:44
Ср июн 29, 2016 08:57:38
kapitan0v писал(а):Проблема решена. Нужно было учитывать ТОЧНОЕ значение Vref. Теперь показывает 27 градусов. Всем спасибо!
Чт июн 30, 2016 04:48:40
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;
}
Чт июн 30, 2016 05:30:24
Вс июл 03, 2016 14:42:51
// Эта функция вычисляет температуру от измерения датчика температуры. Вычисление использует следующую формулу:
// 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
}
Пн июл 04, 2016 11:33:01
Пн июл 04, 2016 21:38:41
Вт июл 05, 2016 11:12:11
никакой логики в сказанном нет.Стал МК греться чуть больше или чуть больше стал греться соседний с МК чип и поплыла вся калибровка к едрене фене.
Вт июл 05, 2016 11:17:21
Ср июл 06, 2016 12:37:20
Чт июл 07, 2016 16:54:31
vastani писал(а):Если ставится цель сделать ДЕШЁВЫЙ показометр лучше чем вариант - совсем плохо, то этот вариант самое то!
Чт авг 24, 2023 16:34:04
Ср авг 30, 2023 18:00:11
Солнцеворот писал(а):Есть подозрение, что на этой версии МК канал АЦП выпилен, т.к. измерение всегда возвращает 0xFFF.
Это вряд-ли ошибка в коде, т.к. тот же код на STM32F072RBT6 работает корректно.