在通道16无引脚(测量温度不准确)
跟ADC代码差不多;不需要使能引脚时钟;将内部温度测量打开
/**
* @brief 启用或禁用温度传感器和内部参考电压功能
* @param NewState: 新的功能状态,取值为ENABLE或DISABLE
* @retval 无
* @note 温度传感器用于测量芯片温度
* @note 内部参考电压用于提供稳定的参考电压值
*/
void ADC_TempSensorVrefintCmd(FunctionalState NewState)
将通道改为通道16
代码如下:
#include "adc_temp.h"
#include "SysTick.h"
/*******************************************************************************
* 函 数 名 : ADC_Temp_Init
* 函数功能 : ADC_Temp初始化函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void ADC_Temp_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //分频因子6时钟为72M/6=12MHz
ADC_TempSensorVrefintCmd(ENABLE);//打开ADC内部温度传感器
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_InitStructure.ADC_NbrOfChannel = 1; //1个转换在规则序列中 也就是只转换规则序列1
ADC_Init(ADC1, &ADC_InitStructure);//ADC初始化
ADC_Cmd(ADC1, ENABLE);//开启AD转换器
ADC_ResetCalibration(ADC1);//重置指定的ADC的校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1));//获取ADC重置校准寄存器的状态
ADC_StartCalibration(ADC1);//开始指定ADC的校准状态
while(ADC_GetCalibrationStatus(ADC1));//获取指定ADC的校准程序
ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能或者失能指定的ADC的软件转换启动功能
}
/*******************************************************************************
* 函 数 名 : Get_ADC_Temp_Value
* 函数功能 : 获取通道ch的转换值,取times次,然后平均
* 输 入 : ch:通道编号
times:获取次数
* 输 出 : 通道ch的times次转换结果平均值
*******************************************************************************/
u16 Get_ADC_Temp_Value(u8 ch,u8 times)
{
u32 temp_val=0;
u8 t;
//设置指定ADC的规则组通道,一个序列,采样时间
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5); //ADC1,ADC通道,239.5个周期,提高采样时间可以提高精确度
for(t=0;t<times;t++)
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能指定的ADC1的软件转换启动功能
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
temp_val+=ADC_GetConversionValue(ADC1);
delay_ms(5);
}
return temp_val/times;
}
/*******************************************************************************
* 函 数 名 : Get_Temperture
* 函数功能 : 获取温度值
* 输 入 : 无
* 输 出 : 温度值(扩大了100倍,单位:℃)
*******************************************************************************/
int Get_Temperture(void)
{
u32 adc_value;
int temp;
float temperture;
adc_value=Get_ADC_Temp_Value(ADC_Channel_16,10); //读取通道16内部温度传感器通道,10次取平均
temperture=(float)adc_value*(3.3/4096); //电压值
temperture=(1.43-temperture)/0.0043+25; //转换为温度值
temp=temperture*100; //扩大100倍.
return temp;
}
主函数代码
#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "usart1.h"
#include "adc_temp.h"
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
int main()
{
u8 i=0;
int temp=0;
SysTick_Init(72);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组 分2组
LED_Init();
USART1_Init(115200);
ADC_Temp_Init();
while(1)
{
i++;
if(i%20==0)
{
LED1=!LED1;
}
if(i%50==0)
{
temp=Get_Temperture();
if(temp<0)
{
temp=-temp;
printf("内部温度检测值为:-");
}
else
{
printf("内部温度检测值为:+");
}
printf("%.2f°C\r\n",(float)temp/100);
}
delay_ms(10);
}
}