The code snippet below shows how to measure temperature using the internal
temperature
sensor.
#define F_CPU 3333333ul
#include <avr/io.h>
#include <math.h>
#include <util/delay.h>
#define TIMEBASE_VALUE ((uint8_t) ceil(F_CPU*0.000001))
#define TEMPSENSE_SAMPDUR ((uint8_t) ceil(F_CPU*0.000032/2))
static volatile uint16_t adc_reading;
static volatile uint16_t temperature_in_K;
static volatile int16_t temperature_in_degC;
void adc_init()
{
ADC0.CTRLA = ADC_ENABLE_bm;
ADC0.CTRLB = ADC_PRESC_DIV2_gc;
ADC0.CTRLC = ADC_REFSEL_1024MV_gc | (TIMEBASE_VALUE << ADC_TIMEBASE_gp);
ADC0.CTRLE = TEMPSENSE_SAMPDUR;
ADC0.MUXPOS = ADC_MUXPOS_TEMPSENSE_gc;
ADC0.COMMAND = ADC_MODE_SINGLE_12BIT_gc;
}
int main(void)
{
adc_init();
int8_t sigrow_offset = SIGROW.TEMPSENSE1;
uint8_t sigrow_gain = SIGROW.TEMPSENSE0;
while(1)
{
ADC0.COMMAND |= ADC_START_IMMEDIATE_gc;
while(!(ADC0.INTFLAGS & ADC_RESRDY_bm));
adc_reading = ADC0.RESULT >> 2;
uint32_t temp = adc_reading - sigrow_offset;
temp *= sigrow_gain;
temp += 0x80;
temp >>= 8;
temperature_in_K = temp;
temperature_in_degC = temperature_in_K - 273;
_delay_ms(500);
}
}