00. 目錄
文章目錄
- 00. 目錄
- 01. 內部溫度傳感器簡介
- 02. 主要特性和框圖
- 03. 硬體模塊
- 04. 編程步驟
- 05. 程式示例
- 06. 附錄
- 07. 宣告
01. 內部溫度傳感器簡介
STM32F4 有一個內部的溫度傳感器,可以用來測量 CPU 及周圍的溫度(TA),該溫度傳感器在內部和 ADC1_IN16(STM32F40xx/F41xx 系列)或 ADC1_IN18(STM32F42xx/F43xx系列)輸入通道相連接,此通道把傳感器輸出的電壓轉換成數字值, STM32F4 的內部溫度傳感器支持的溫度范圍為:-40~125 度,精度為±1.5℃左右,
02. 主要特性和框圖
● 支持的溫度范圍:—40 °C 到 125 °C
● 精度:±1.5 °C

讀取溫度
要使用傳感器,請執行以下操作:
- 選擇 ADC1_IN16 或 ADC1_IN18 輸入通道,
- 選擇一個采樣時間,該采樣時間要大于資料手冊中所指定的最低采樣時間,
- 在 ADC_CCR 暫存器中將 TSVREFE 位置 1,以便將溫度傳感器從掉電模式中喚醒,
- 通過將 SWSTART 位置 1(或通過外部觸發)開始 ADC 轉換
- 讀取 ADC 資料暫存器中生成的 V SENSE 資料
- 使用以下公式計算溫度:
溫度(單位為 °C)= {(V SENSE — V 25 ) / Avg_Slope} + 25
其中:
— V 25 = 25 °C 時的 V SENSE 值
— Avg_Slope = 溫度與 V SENSE 曲線的平均斜率(以 mV/°C 或 μV/°C 表示)
有關 V 25 和 Avg_Slope 實際值的相關資訊,請參見資料手冊中的電氣特性一節,
溫馨提示
傳感器從掉電模式中喚醒需要一個啟動時間,啟動時間過后其才能正確輸出 V SENSE , ADC 在上電后同樣需要一個啟動時間,因此,為盡可能減少延遲間,應同時將 ADON 和 TSVREFE位置 1
溫度傳感器的輸出電壓隨溫度線性變化,由于工藝不同,該線性函式的偏移量取決于各個芯片(芯片之間的溫度變化可達 45 °C),
內部溫度傳感器更適用于對溫度變數而非絕對溫度進行測量的應用情況,如果需要讀取精確溫度,則應使用外部溫度傳感器,
03. 硬體模塊
用到的硬體資源有:
1) 指示燈 DS0
2) TFTLCD 模塊
3) ADC
4) 內部溫度傳感器
04. 編程步驟
① 選擇ADC_IN16或者ADC_IN16輸入通道,
② 設定采樣時間大于17.1us,
③ 設定ADC_CCR的TSVREFE位,打開內部溫度傳感器,
④ 設定ADC_CR2的SWSTART位啟動轉換,
⑤ 讀取ADC結果,
⑥ 計算,
05. 程式示例
初始化函式
//ADC通道初始化
void ADC1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
ADC_InitTypeDef ADC_InitStructure;
//開啟GPIO時鐘 PA5
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
//開啟ADC1時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
//GPIO初始化 初始化為模擬功能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE); //ADC1復位
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE); //復位結束
//使能內部溫度傳感器
ADC_TempSensorVrefintCmd(ENABLE);
//初始化ADC_CCR暫存器
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;
ADC_CommonInit(&ADC_CommonInitStructure);
//初始化ADC1
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfConversion = 1;
ADC_Init(ADC1, &ADC_InitStructure);
//設定ADC規則組通道 一個序列 采樣時間
ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SampleTime_480Cycles);
ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_480Cycles);
//使能ADC
ADC_Cmd(ADC1, ENABLE);
}
獲取溫度值的函式
//獲取溫度值
s16 Get_Temperature(void)
{
u32 value = 0;
s16 result = 0;
double temperature = 0;
//讀取通道16內部溫度傳感器的值
value = Get_Adc_Average(ADC_Channel_16, 10);
//轉化為電壓值
temperature = (float)value * (3.3 / 4096);
//轉化為溫度值
temperature = (temperature - 0.76) / 0.0025 + 25;
temperature *= 100;
result = temperature;
return result;
}
主函式
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "usmart.h"
#include "lcd.h"
#include "rtc.h"
#include "rng.h"
#include "key.h"
#include "wkup.h"
#include "adc.h"
int main(void)
{
//u16 value = 0;
s16 temp = 0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設定系統中斷優先級分組2
delay_init(168);
uart_init(115200);
//usmart_dev.init(84);
LED_Init();
LCD_Init();
ADC1_Init();
POINT_COLOR = RED;
LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");
LCD_ShowString(30,70,200,16,16,"Temperature TEST");
LCD_ShowString(30,90,200,16,16,"ATOM@tom");
LCD_ShowString(30,110,200,16,16,"2020/09/13");
//設定字體為藍色
POINT_COLOR = BLUE;
LCD_ShowString(30,140,200,16,16,"Temperate:00.00C");
while(1)
{
//得到溫度值
temp = Get_Temperature();
printf("temperature: %f\r\n", (float)temp / 100);
LED1 = !LED1;
delay_ms(250);
}
}
06. 附錄
6.1 【STM32】STM32系列教程匯總
網址:【STM32】STM32系列教程匯總
07. 宣告
該教程參考了正點原子的《STM32 F4 開發指南》
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/35854.html
標籤:其他
