在通道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=12MHzADC_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); }
}