STM32_Study: STM32_Study (gitee.com)
(內(nèi)部溫度傳感器在通道ADC_Channel_16)
不逼逼 貼代碼
adc-temperature.c
/**
* @file adc_temperature.c
* @author WaterFairy (995637517@qq.com)
* @brief 芯片內(nèi)部溫度傳感器
* @version 1.0.0
* @date 2022-04-28 12:04:82
*
* @copyright Copyright (c) 2022
*
*/
#include "stm32f10x.h"
#include "adc_temperature.h"
#include <stdio.h>
void init_adc_temperature(void)
{
// adc
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //分頻 72/6 =13 ,不高于14MHZ
ADC_DeInit(ADC1);
ADC_InitTypeDef adc_structure;
adc_structure.ADC_DataAlign = ADC_DataAlign_Right; //右對齊
adc_structure.ADC_Mode = ADC_Mode_Independent; //獨立模式
adc_structure.ADC_NbrOfChannel = 1; //掃描個數(shù)
adc_structure.ADC_ContinuousConvMode = DISABLE; //連續(xù)
adc_structure.ADC_ScanConvMode = DISABLE; //掃描
adc_structure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //外部
ADC_Init(ADC1, &adc_structure);
//開啟內(nèi)部溫度傳感器
ADC_TempSensorVrefintCmd(ENABLE);
//使能adc1
ADC_Cmd(ADC1, ENABLE);
//規(guī)則組輸入通道配置 (ADC_Channel_16 固定通道,需要頻率高于17.5)
ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_239Cycles5);
// adc 校驗
ADC_ResetCalibration(ADC1);
while (ADC_GetResetCalibrationStatus(ADC1))
;
ADC_StartCalibration(ADC1);
while (ADC_GetCalibrationStatus(ADC1))
;
}
/**
* @brief 溫度轉換
* 溫度(°C) = {(V25 - VSENSE) / Avg_Slope} + 25
* V25 = VSENSE在25°C時的數(shù)值
* Avg_Slope = 溫度與VSENSE曲線的平均斜率(單位為mV/ °C 或 μV/ °C)
* 即:(1.43 - voltage) / 0.043 + 25;
* @param voltage
* @return float
*/
float trans_temperature(float voltage)
{
float V25 = 1.43;
float Avg_Slope = 0.043;
return (V25 - voltage) / Avg_Slope + 25;
}
/**
* @brief Get the adc temperature value object
*
* @return float
*/
float get_adc_temperature_value(void)
{
//開啟軟件轉換
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC))
;
// adc值
uint16_t adc_value = ADC_GetConversionValue(ADC1);
//電壓
float voltage = (float)adc_value * (3.3 / 4096);
//溫度
return trans_temperature(voltage);
}
adc-temperature.c
/**
* @file adc_temperature.h
* @author WaterFairy (995637517@qq.com)
* @brief
* @version 1.0.0
* @date 2022-04-28 12:04:75
*
* @copyright Copyright (c) 2022
*
*/
#include "stm32f10x.h"
#ifndef __ADC_TEMPERATURE_H__
#define __ADC_TEMPERATURE_H__
void init_adc_temperature(void);
float get_adc_temperature_value(void);
#endif