STM32有一个内部温度监测传感器,它的使用一般情况下不解决什么问题,但是对于日常使用还是有一定的作用。
内部温度传感器通道号16 初始化及配置代码为:
USARTSET usartset; /* System Clocks Configuration --72M*/ RCC_Configuration(); GPIO_Configuration(); NVIC_Configuration(); OS_CPU_SysTickInit(); //ADC³õʼ»¯ adc_init(); dma_configuration(); ADC_SoftwareStartConvCmd(ADC1, ENABLE); //******************************************** // RTCʵʱʱÖÓ³õʼ»¯ //******************************************** void adc_init(void) { GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); ADC_DeInit(ADC1); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //Á¬Ðø×ª»»¿ªÆô ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 2; //ÉèÖÃת»»ÐòÁ㤶ÈΪ8 ADC_Init(ADC1, &ADC_InitStructure); //ADCÄÚÖÃζȴ«¸ÐÆ÷ʹÄÜ£¨ÒªÊ¹ÓÃÆ¬ÄÚζȴ«¸ÐÆ÷£¬ÇмÉÒª¿ªÆôËü£© ADC_TempSensorVrefintCmd(ENABLE); //³£¹æ×ª»»ÐòÁÐ1£ºÍ¨µÀ10 ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_71Cycles5); //³£¹æ×ª»»ÐòÁÐ2£ºÍ¨µÀ16£¨ÄÚ²¿Î¶ȴ«¸ÐÆ÷£©£¬²ÉÑùʱ¼ä>2.2us,(239cycles) ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 2, ADC_SampleTime_71Cycles5); // Enable ADC1 ADC_Cmd(ADC1, ENABLE); // ¿ªÆôADCµÄDMAÖ§³Ö£¨ÒªÊµÏÖDMA¹¦ÄÜ£¬»¹Ðè¶ÀÁ¢ÅäÖÃDMAͨµÀµÈ²ÎÊý£© ADC_DMACmd(ADC1, ENABLE); // ÏÂÃæÊÇADC×Ô¶¯Ð£×¼£¬¿ª»úºóÐèÖ´ÐÐÒ»´Î£¬±£Ö¤¾«¶È // Enable ADC1 reset calibaration register ADC_ResetCalibration(ADC1); // Check the end of ADC1 reset calibration register while(ADC_GetResetCalibrationStatus(ADC1)); // Start ADC1 calibaration ADC_StartCalibration(ADC1); // Check the end of ADC1 calibration while(ADC_GetCalibrationStatus(ADC1)); } //******************************************** // Adc With DMA Configration function //******************************************** void dma_configuration(void) { DMA_InitTypeDef DMA_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ad_value; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //BufferSize=2£¬ÒòΪADCת»»ÐòÁÐÓÐ2¸öͨµÀ //Èç´ËÉèÖã¬Ê¹ÐòÁÐ1½á¹û·ÅÔÚAD_Value[0]£¬ÐòÁÐ2½á¹û·ÅÔÚAD_Value[1] DMA_InitStructure.DMA_BufferSize = 2; //adת»»µÄͨµÀÊýÁ¿ DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //Ñ»·Ä£Ê½¿ªÆô£¬BufferдÂúºó£¬×Ô¶¯»Øµ½³õʼµØÖ·¿ªÊ¼´«Êä DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); //ÅäÖÃÍê³Éºó£¬Æô¶¯DMAͨµÀ DMA_Cmd(DMA1_Channel1, ENABLE); }计算公式:Temperature = {(V25 - VSENSE) / Avg_Slope} + 25
V25 最小=1.34V 典型=1.43V 最大=1.52V 单位是V
Avg_Slope 最小=4.0 典型=4.3 最大=4.6 单位是 mV/℃
V25和Avg_Slope一般都是去典型值。
VSENSE是AD所读取到的电压值。
AD值转采集电压:
采集到的电压=AD值*(电源电压/4096)
如果采用毫伏计算和(1430-ad_value[1]*0.806)/4.3+25
