STM32G0에는 칩내부에 온도 센서가 있다.
온도값에 따라 리니어 하게 전압으로 출력 되지만 절대온도로 사용하려면 보정이 필요 하다고 한다.
대략 온도 측정하기는 좋을것 같다.
STM32G0 내부 온도 출력 Aruino 소스코드
#include "stm32yyxx_ll_adc.h"
/* Values available in datasheet */
#define CALX_TEMP 25
#if defined(STM32F1xx)
#define V25 1430
#define AVG_SLOPE 4300
#define VREFINT 1200
#elif defined(STM32F2xx) || defined(STM32F4xx)
#define V25 760
#define AVG_SLOPE 2500
#define VREFINT 1210
#endif
/* Analog read resolution */
#define LL_ADC_RESOLUTION LL_ADC_RESOLUTION_12B
#define ADC_RANGE 4096
// the setup routine runs once when you press reset:
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(115200);
while (!Serial);
//Serial.println("Temp");
analogReadResolution(12);
}
static int32_t readVref()
{
#ifdef __LL_ADC_CALC_VREFANALOG_VOLTAGE
return (__LL_ADC_CALC_VREFANALOG_VOLTAGE(analogRead(AVREF), LL_ADC_RESOLUTION));
#else
return (VREFINT * ADC_RANGE / analogRead(AVREF)); // ADC sample to mV
#endif
}
#ifdef ATEMP
static int32_t readTempSensor(int32_t VRef)
{
#ifdef __LL_ADC_CALC_TEMPERATURE
return (__LL_ADC_CALC_TEMPERATURE(VRef, analogRead(ATEMP), LL_ADC_RESOLUTION));
#elif defined(__LL_ADC_CALC_TEMPERATURE_TYP_PARAMS)
return (__LL_ADC_CALC_TEMPERATURE_TYP_PARAMS(AVG_SLOPE, V25, CALX_TEMP, VRef, analogRead(ATEMP), LL_ADC_RESOLUTION));
#else
return 0;
#endif
}
#endif
static int32_t readVoltage(int32_t VRef, uint32_t pin)
{
return (__LL_ADC_CALC_DATA_TO_VOLTAGE(VRef, analogRead(pin), LL_ADC_RESOLUTION));
}
// The loop routine runs over and over again forever:
void loop() {
// Print out the value read
int32_t VRef = readVref();
Serial.printf("VRef(mv)= %i", VRef);
#ifdef ATEMP
Serial.printf("\tTemp(°C)= %i", readTempSensor(VRef));
#endif
#ifdef AVBAT
Serial.printf("\tVbat(mv)= %i", readVoltage(VRef, AVBAT));
#endif
Serial.printf("\tA0(mv)= %i\n", readVoltage(VRef, A0));
delay(200);
}
STM32G0 내부 온도 출력 결과
반응형