stm32_ota/SYSTEM/STM32TEMP/stm32Temp.c

120 lines
5.5 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "stm32Temp.h"
#include "stm32f10x_adc.h"
#include "sysport.h"
/********************概*********************述*******************************
* STM32内部自带温度传感器 通过ADC1可以获取到MCU温度
* 通过STM32内部自带的温度传感器获取MCU温度
****************************************************************************/
/********************************************************************************
* @file stm32Temp.c
* @author 晏诚科技 Mr.Wang
* @version V1.0.0
* @date 11-Dec-2018
* @brief STM32内部自带温度传感器 通过ADC1可以获取到MCU温度
******************************************************************************
*******************************************************************************/
/**************************************************************************************************
* 名 称: void T_Adc_Init(void) //ADC通道初始化
* 功能说明: ADC1初始化
*************************************************************************************************/
void T_Adc_Init(void) //ADC通道初始化
{
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE ); //使能GPIOA,ADC1通道时钟
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //分频因子6时钟为72M/6=12MHz
ADC_DeInit(ADC1); //将外设 ADC1 的全部寄存器重设为缺省值
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent ; //ADC工作模式:ADC1和ADC2工作在独立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE ; //模数转换工作在单通道模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE ; //模数转换工作在单次转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None ; //转换由软件而不是外部触发启动
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right ; //ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1 ; //顺序进行规则转换的ADC通道的数目
ADC_Init(ADC1, &ADC_InitStructure) ; //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
ADC_TempSensorVrefintCmd(ENABLE) ; //开启内部温度传感器
ADC_Cmd(ADC1, ENABLE) ; //使能指定的ADC1
ADC_ResetCalibration(ADC1) ; //重置指定的ADC1的复位寄存器
while(ADC_GetResetCalibrationStatus(ADC1)) ; //获取ADC1重置校准寄存器的状态,设置状态则等待
ADC_StartCalibration(ADC1) ;
while(ADC_GetCalibrationStatus(ADC1)) ; //获取指定ADC1的校准程序,设置状态则等待
}
/**************************************************************************************************
* 名 称: uint16_t T_Get_Adc(uint8_t ch)
* 功能说明: 获取相应通道的ADC转化值
* 入口参数:
* @param1 ch: 通道
* 出口参数:
* @param1 uint16_t: ch通道ADC转化的值
*************************************************************************************************/
uint16_t T_Get_Adc(uint8_t ch)
{
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道3,第一个转换,采样时间为239.5周期
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC )); //等待转换结束
return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果
}
/**************************************************************************************************
* 名 称: uint16_t T_Get_Temp(void)
* 功能说明: 对ADC1通道16ADC转化5次取平均值
* 入口参数: 无
* 出口参数:
* @param1 uint16_t: ADC1通道16ADC转化5次返回的平均值
*************************************************************************************************/
uint16_t T_Get_Temp(void)
{
uint16_t temp_val = 0 ;
uint8_t t;
for( t=0; t<5; t++ )
{
temp_val += T_Get_Adc(ADC_Channel_16); //TampSensor
Wait_For_Nms(10);
}
return temp_val/5;
}
/**************************************************************************************************
* 名 称: uint16_t T_Get_Adc_Average( uint8_t ch, uint8_t times)
* 功能说明: 对ADC1通道chADC转化times次取平均值
* 入口参数:
* @param1 ch: 通道
* @param2 times: 采样次数
* 出口参数:
* @param1 uint16_t: 对ADC1通道chADC转化times次返回的平均值
*************************************************************************************************/
uint16_t T_Get_Adc_Average( uint8_t ch, uint8_t times)
{
uint32_t temp_val=0;
uint8_t t;
for( t=0; t<times; t++ )
{
temp_val += T_Get_Adc(ch) ;
Wait_For_Nms(10) ;
}
return temp_val/times ;
}
/**************************************************************************************************
* 名 称: short Get_Temprate(void) //获取内部温度传感器温度值
* 功能说明: 获取内部温度传感器温度值的100倍
* 出口参数: short温度值(扩大了100倍,单位:℃.)
*************************************************************************************************/
short Get_Temprate(void) //获取内部温度传感器温度值
{
uint32_t adcx ;
short result ;
double temperate ;
adcx=T_Get_Adc_Average(ADC_Channel_16,10) ; //读取通道16,20次取平均
temperate = (float)adcx*(3.3/4096) ; //电压值
temperate = (1.43-temperate)/0.0043+25 ; //转换为温度值
result = temperate*=100 ; //扩大100倍.
return result ;
}