?在通道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); }
}