вторник, 12 сентября 2017 г.

Меряем температуру кристалла

#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_adc.h"

int main(void)
{
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
   ADC_InitTypeDef term;
   term.ADC_Mode = ADC_Mode_Independent;
   term.ADC_ScanConvMode = DISABLE;
   term.ADC_ContinuousConvMode = ENABLE;
   term.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
   term.ADC_DataAlign = ADC_DataAlign_Right;
   term.ADC_NbrOfChannel = 1;

   ADC_RegularChannelConfig(ADC1, ADC_Channel_TempSensor, 1, ADC_SampleTime_239Cycles5);
   ADC_Init (ADC1, &term);

   ADC_TempSensorVrefintCmd(ENABLE);
   ADC_Cmd (ADC1, ENABLE);

   ADC_ResetCalibration(ADC1);    //Сброс калибровочных данных
   while(ADC_GetResetCalibrationStatus(ADC1));
   ADC_StartCalibration(ADC1);    //Новая калибровка
   while(ADC_GetCalibrationStatus(ADC1));

   ADC_SoftwareStartConvCmd(ADC1, ENABLE);
   ADC_Cmd (ADC1, ENABLE);

   int value;
   int temperature;


    while(1)
    {
      value = ADC_GetConversionValue(ADC1);
      temperature = (1750 - value) / 4.3 + 25; //собственно результат в градусах Цельсия
    }
}


К сожалению мне еще не пришли семисегментные индикаторы и отладочная плата поэтому посмотреть результат можно только через отладчик.

Еще есть идея выводить температуру на терминал по USB-порту. Надо бы этим заняться.