STM32-ADC 内部温度传感器
2022-04-29 本文已影响0人
水妖
STM32_Study: STM32_Study (gitee.com)
(内部温度传感器在通道ADC_Channel_16)
不逼逼 贴代码
adc-temperature.c
/**
* @file adc_temperature.c
* @author WaterFairy (995637517@qq.com)
* @brief 芯片内部温度传感器
* @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; //扫描个数
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 (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