訓練題——ADC讀取溫度
Author:XuanYu
利用ADC測量單片機內部溫度
廢話不多說,直接開搞。
科普
先科普一下ADC(不是 AD carry!),ADC是模數轉化器,就是模擬信號轉換成數字信號的東西,通常的模數轉換器是將一個輸入電壓信號轉換為一個輸出的數字信號。由于數字信號本身不具有實際意義,僅僅表示一個相對大小。故任何一個模數轉換器都需要一個參考模擬量作為轉換的標準,而輸出的數字量則表示輸入信號相對于參考電壓的大小。 因此,模擬數字轉換器會會將模擬信號轉換為表示一定比例電壓值的數字信號。
舉個簡單的例子,對于一般的單片機上的ADC,測量電壓的范圍也就是輸入的模擬信號的范圍是0-3.3V,而轉化后的數字信號范圍取決于ADC的位數,假如是12位的那就是0-2^12也就是0-4096,也就是說要是輸入電壓是1V的話,那轉化的電壓就是1/3.3*4096=1240。
ADC的主要作用就是讀取輸入到單片機的電壓等物理量,當然也可以測溫度,現在我們就來用單片機自帶的溫度傳感器測溫度吧!
配置
先用中斷的方式使用ADC讀取電壓。
首先拿出我們的單片機(我用的是STM32f407ZGT6)然后放到一邊
打開cubemx配置如下:



配置ADC這里可能不同的單片機溫度傳感器的位置不一樣,要找到自己單片機的Temperature Sensor Channel并選中,同時勾選一下NVIC Settings里的那個Enabled下面的框,開啟adc的全局中斷。

這里配了一個串口,方便一會輸出測量的溫度,操作就是選一個串口然后把最上面的mode設置成Asynchronous就可以了。
最后再配置一下時鐘樹,前面應該有講我就不贅述了。
然后生成工程,開始寫代碼。
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
現在最上面加這段代碼,然后再按照下圖操作
在cubeide主界面,選中工程,然后點擊項目->屬性->C/C++構建->設置->MCU Settings

把下面的兩個Use都選上
這樣就可以直接調用printf函數通過串口輸出了。
使用ADC
然后再寫一個adc的中斷函數
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
HAL_ADC_PollForConversion(&hadc1 ,10); //等待adc采樣結束
light_value=HAL_ADC_GetValue(hadc); //讀取adc采樣的數值并賦值給light_value
v=light_value*3.3/4096;
tem=((light_value*3.3/4096-0.76)/0.0025)+25; //計算溫度
// printf("light_value=%d\n",light_value );
}

這個是我的單片機的溫度傳感器的一個電氣特性,就是說adc采集的電壓和實際的溫度是一個正比的關系,然后第三行的Avg_Slope是斜率,也就是2.5mV/°C 然后第四行是說25°時讀取的電壓大約為0.76,所以就可以根據這兩個算出當讀取的電壓值為v0時,實際的溫度是(v0-0.76)/0.0025+25。
最后主函數中不斷開啟ADC中斷就可以了。代碼如下
while (1)
{
HAL_ADC_Start_IT(&hadc1);
printf("get_value=%d,V=%f\r\n",light_value,v);
printf("temp=%f\r\n",tem); //把溫度值打印出來
HAL_Delay(1000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
然后把程序燒到單片機里,連接串口調試助手結果如下:

輸出的溫度大概是18°左右,因為沒有室溫計所以沒法比較誤差,但是對比當時的天氣預報顯示的是20°(可能科協比較冷一點)也能反映這次測量大概是比較準的。
其他ADC調用方法
也可以用一種簡單的查詢阻塞的方式
這個配置起來就比較簡單,和中斷相比就不用勾選ADC的全局中斷Enable了,其他的相同。
代碼的話直接在主函數里寫就行,

代碼我就扔個圖片就好。
最后還有一種方式通過DMA采集
這個博客建議大家看一看,挺實用的。
【STM32技巧】ADC模擬量采集的幾種用法_小石頭有大內涵的博客-CSDN博客_stm32模擬信號采集
關于DMA的配置也可以參考文章:https://blog.csdn.net/weixin_44584198/article/details/119453399
ADC是單片機里比較基礎的也是最常用的東西了,希望大家都能認真學習,有問題先 csdn再找學長問,希望大家都能有所收獲。

浙公網安備 33010602011771號