本篇詳細的記錄瞭如何使用STM32CubeMX配置STM32L431RCT6的ADC外設,讀取MQ-2氣體感測器的資料並透過串列埠傳送
本質就是ADC採集
MQ-2的原理圖如下:
生成MDK工程
選擇晶片型號
開啟STM32CubeMX,開啟MCU選擇器:
搜尋並選中晶片STM32L431RCT6
:
配置時鐘源
- 如果選擇使用外部高速時鐘(HSE),則需要在System Core中配置RCC;
- 如果使用預設內部時鐘(HSI),這一步可以略過;
這裡我都使用外部時鐘:
配置串列埠
小熊派開發闆闆載ST-Link並且虛擬了一個串列埠,原理圖如下:
這裡我將開關撥到AT-MCU
模式,使PC的串列埠與USART1之間連線。
接下來開始配置USART1
:
配置ADC
ADC
ADC全稱 Analog-to-Digital Converter,即模擬-數字轉換器,可以將連續變化的模擬訊號轉換為離散的數字訊號,進而使用數位電路進行處理,稱之為數字訊號處理。
STM32L431xx 系列有 1 個 ADC,ADC 解析度高達 12 位,每個 ADC 具有多達 20 個的採集通道,這些通道的 A/D 轉換可以單次、連續、掃描或間斷模式執行。ADC 的結果可以左對齊或右對齊方式儲存在 16 位資料暫存器中。
STM32L431 的 ADC 最大的轉換速率為 5.33Mhz,也就是轉換時間為 0.188us(12 位解析度時),ADC 的轉換時間與 AHB 匯流排時脈頻率無關。
配置ADC(單次轉換模式)
首先選擇ADC1
,開啟通道3:
接下來是對ADC的設定,這裡我們保持預設即可:
最後設定ADC的轉換規則:
其餘的一些設定保持預設即可。
配置時鐘樹
STM32L4的最高主頻到80M,所以配置PLL,最後使HCLK = 80Mhz
即可:
生成工程設定
程式碼生成設定
最後設定生成獨立的初始化檔案:
生成程式碼
點選GENERATE CODE
即可生成MDK-V5工程:
3. 在MDK中編寫、編譯、下載使用者程式碼
重定向printf( )函式
參考:
- STM32Cube-09 | 重定向printf函式到串列埠輸出的多種方法
編寫讀取資料的測試程式碼
修改main
函式如下:
int main(void)
{
uint16_t smoke_value = 0;
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
MX_USART1_UART_Init();
while (1)
{
HAL_ADC_Start(&hadc1); //啟動ADC單次轉換
HAL_ADC_PollForConversion(&hadc1, 50); //等待ADC轉換完成
smoke_value = HAL_ADC_GetValue(&hadc1); //讀取ADC轉換資料
printf("smoke_value = %d\n", smoke_value);
HAL_Delay(500);
}
}
至此,我們已經學會如何使用ADC讀取MQ-2感測器的值