STM32-ADC 内部温度传感器

STM32_Study: STM32_Study (gitee.com)
(内部温度传感器在通道ADC_Channel_16)

不逼逼 贴代码

adc-temperature.c
/**
 * @file adc_temperature.c
 * @author WaterFairy ([email protected])
 * @brief 芯片内部温度传感器
 * @version 1.0.0
 * @date 2022-04-28 12:04:82
 *
 * @copyright Copyright (c) 2022
 *
 */

#include "stm32f10x.h"
#include "adc_temperature.h"
#include 

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;                             //扫描个数
    adc_structure.ADC_ContinuousConvMode = DISABLE;                 //连续
    adc_structure.ADC_ScanConvMode = DISABLE;                       //扫描
    adc_structure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //外部
    ADC_Init(ADC1, &adc_structure);

    //开启内部温度传感器
    ADC_TempSensorVrefintCmd(ENABLE);
    //使能adc1
    ADC_Cmd(ADC1, ENABLE);
    //规则组输入通道配置  (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时的数值
 * 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 ([email protected])
 * @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

你可能感兴趣的:(STM32-ADC 内部温度传感器)