1.前言
STM32ADC是一種模擬/數字轉換器,可以將模擬信號轉換為數字信號。STM32ADC有多個通道,可以選擇不同的輸入源、轉換模式、觸發方式和采樣時間。STM32ADC的轉換結果可以通過中斷、DMA或者寄存器讀取。
在本文中,我將介紹如何使用STM32CubeMX和HAL庫配置和使用STM32ADC,以及如何編寫一個簡單的ADC轉換的代碼實例。我將使用STM32F103C8T6開發板作為硬件平臺,使用PC0作為ADC1的通道10輸入,使用ADC1的通道16作為內部溫度傳感器輸入。我將使用Keil uVision5作為編譯器和調試器。
2.STM32CubeMX配置
1.首先,我們需要使用STM32CubeMX工具來生成初始化代碼和配置文件。STM32CubeMX是一個圖形化的軟件配置工具,可以幫助我們快速設置STM32的外設和時鐘。
2.打開STM32CubeMX后,我們選擇New Project,然后在MCU Selector中搜索并選擇STM32F103C8T6芯片。
3.然后,我們在Pinout & Configuration選項卡中,配置ADC1的通道10和通道16。我們將PC0設置為模擬輸入模式,即ADC_IN10。我們將ADC1的通道16設置為內部溫度傳感器
4.接下來,我們在ADC1選項卡中,配置ADC1的參數。我們將ADC1的時鐘設置為PCLK2/6,即10MHz,因為ADC1的最大時鐘不能超過14MHz。我們將ADC1的分辨率設置為12位,即最高精度。我們將ADC1的數據對齊方式設置為右對齊,即低位有效。我們將ADC1的轉換模式設置為連續轉換,即轉換結束后自動開始下一次轉換。我們將ADC1的掃描模式設置為使能,即掃描所有被選擇的通道。我們將ADC1的DMA模式設置為使能,即使用DMA傳輸轉換結果。我們將ADC1的規則通道組的轉換順序設置為通道10和通道16,即先轉換PC0的輸入,再轉換溫度傳感器的輸入。我們將ADC1的規則通道組的采樣時間設置為239.5個周期,即最長的采樣時間,以提高轉換精度。我們將ADC1的注入通道組的轉換順序和采樣時間設置為默認值,因為我們不使用注入通道組。我們將ADC1的中斷設置為禁止,因為我們使用DMA模式。我們將ADC1的模擬看門狗設置為禁止,因為我們不需要監測輸入電壓的閾值。
5.最后,我們在Project Manager選項卡中,設置工程的名稱、位置、工具鏈等信息。我們選擇Keil uVision5作為IDE,選擇STM32F1xx_HAL_Driver作為硬件抽象層,選擇NoRTOS作為操作系統,選擇Generate peripheral initialization as a pair of ‘.c/.h’ files per peripheral作為代碼生成選項。我
點擊GENERATE CODE按鈕,STM32CubeMX就會為我們生成初始化代碼和配置文件,并自動打開Keil uVision5。
3.Keil uVision5編譯和調試
在Keil uVision5中,我們可以看到STM32CubeMX生成的工程結構,我們主要關注的是main.c文件,這里是我們的主程序代碼。我們可以看到STM32CubeMX已經為我們生成了一些函數,包括:
- SystemClock_Config():配置系統時鐘,使用外部8MHz晶振,使得HCLK為72MHz,PCLK1為36MHz,PCLK2為72MHz。
- MX_GPIO_Init():初始化GPIO,設置PC0為模擬輸入模式。
- MX_DMA_Init():初始化DMA,設置DMA1通道1為ADC1的傳輸通道,傳輸方向為外設到內存,傳輸模式為循環模式,傳輸數據寬度為半字,傳輸數據長度為2,傳輸優先級為高,傳輸地址遞增模式為內存遞增。
- MX_ADC1_Init():初始化ADC1,設置時鐘為PCLK2/6,分辨率為12位,數據對齊方式為右對齊,轉換模式為連續轉換,掃描模式為使能,DMA模式為使能,規則通道組的轉換順序為通道10和通道16,規則通道組的采樣時間為239.5個周期。
我們只需要在USER CODE區域添加我們自己的代碼即可。我們的主要任務是:
- 定義一個數組,用于存儲DMA傳輸的ADC轉換結果。
- 啟動DMA傳輸。
- 啟動ADC轉換。
- 計算溫度傳感器的溫度值。
- 在調試窗口顯示溫度值。
我們的代碼如下:
/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes *//* Private variables ---------------------------------------------------------*/
ADC_HandleTypeDef hadc1;
DMA_HandleTypeDef hdma_adc1;/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
uint16_t adc_value[2]; //定義一個數組,用于存儲DMA傳輸的ADC轉換結果
float temperature; //定義一個浮點變量,用于存儲溫度值
/* USER CODE END PV *//* USER CODE BEGIN 0 */
//重定向printf函數到ITM調試窗口
int fputc(int ch, FILE *f)
{ITM_SendChar(ch);return(ch);
}
/* USER CODE END 0 */int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_DMA_Init();MX_ADC1_Init();/* USER CODE BEGIN 2 */HAL_ADCEx_Calibration_Start(&hadc1); //啟動ADC校準HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_value, 2); //啟動DMA傳輸,傳輸地址為adc_value數組,傳輸長度為2/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */temperature = ((float)adc_value[1]) / 4095 * 3.3; //計算溫度傳感器的電壓值,單位為Vtemperature = (temperature - 0.76) / 0.0025 + 25; //計算溫度值,單位為攝氏度printf("The temperature is %.2f C\r\n", temperature); //在調試窗口打印溫度值,保留兩位小數HAL_Delay(1000); //延時1秒}/* USER CODE END 3 */
}
4.STM32ADC的應用場景
STM32ADC可以用于測量模擬信號的電壓值,例如傳感器的輸出、電池的電壓、電位器的位置等。STM32ADC還可以用于測量內部的溫度傳感器、參考電壓和電流。STM32ADC的轉換結果可以用于控制、顯示、存儲或者傳輸等目的。
STM32ADC的應用場景有很多,例如:
- 溫度控制:我們可以使用STM32ADC測量溫度傳感器的輸出電壓,然后根據溫度值來控制風扇、加熱器或者空調等設備,實現溫度的調節和保持。
- 電壓檢測:我們可以使用STM32ADC測量電池或者電源的電壓,然后根據電壓值來判斷電池的剩余電量或者電源的穩定性,實現電源的管理和保護。
- 信號處理:我們可以使用STM32ADC采樣模擬信號,然后對采樣結果進行數字信號處理,實現信號的濾波、放大、調制、解調等功能。
- 數據采集:我們可以使用STM32ADC采集多個模擬信號,然后將采集結果存儲在內存或者外部存儲器中,實現數據的記錄和分析。
- 人機交互:我們可以使用STM32ADC測量電位器或者滑動變阻器的位置,然后根據位置值來控制LED、LCD或者音頻等設備,實現人機的交互和反饋。
以上只是STM32ADC的一些常見的應用場景,實際上STM32ADC的應用范圍是非常廣泛的,只要有模擬信號的存在,就可以使用STM32ADC來進行轉換和處理。
5.STM32ADC的注意事項
在使用STM32ADC時,我們需要注意以下幾點:
- STM32ADC的輸入電壓范圍是0V到VREF+,其中VREF+是參考電壓,通常是3.3V或者內部的1.2V。如果輸入電壓超過VREF+,會導致ADC的損壞或者轉換結果的不準確。
- STM32ADC的轉換精度和分辨率有關,分辨率越高,精度越高,但是轉換時間越長。STM32ADC的分辨率可以選擇6位、8位、10位或者12位,我們需要根據應用的需求來選擇合適的分辨率。
- STM32ADC的轉換速度和采樣時間有關,采樣時間越長,轉換速度越慢,但是轉換精度越高。STM32ADC的采樣時間可以選擇1.5個周期到239.5個周期,我們需要根據輸入信號的特性來選擇合適的采樣時間。
- STM32ADC的轉換模式可以選擇單次轉換、連續轉換、掃描轉換或者注入轉換,我們需要根據應用的需求來選擇合適的轉換模式。單次轉換只轉換一次,需要軟件或者硬件觸發;連續轉換不斷地重復轉換,無需觸發;掃描轉換按照設定的順序轉換多個通道,需要觸發;注入轉換可以在規則轉換的間隙插入轉換特定的通道,需要觸發。
- STM32ADC的觸發方式可以選擇軟件觸發、外部觸發或者內部觸發,我們需要根據應用的需求來選擇合適的觸發方式。軟件觸發是通過寫入寄存器來啟動轉換;外部觸發是通過外部的信號來啟動轉換,例如定時器、外部中斷等;內部觸發是通過內部的事件來啟動轉換,例如模擬看門狗、注入結束等。
- STM32ADC的數據傳輸方式可以選擇中斷、DMA或者寄存器讀取,我們需要根據應用的需求來選擇合適的數據傳輸方式。中斷方式是通過中斷服務程序來處理轉換結果,適合低速或者低頻的轉換;DMA方式是通過DMA控制器來傳輸轉換結果,適合高速或者高頻的轉換;寄存器讀取方式是通過讀取寄存器來獲取轉換結果,適合單次或者簡單的轉換。