STM32Cube-10 | 使用ADC讀取氣體感測器資料(MQ-2)

BK小鬼發表於2024-05-13

本篇詳細的記錄瞭如何使用STM32CubeMX配置STM32L431RCT6的ADC外設,讀取MQ-2氣體感測器的資料並透過串列埠傳送

本質就是ADC採集

MQ-2的原理圖如下:

STM32Cube-10 | 使用ADC讀取氣體感測器資料(MQ-2)

生成MDK工程

選擇晶片型號

開啟STM32CubeMX,開啟MCU選擇器:

STM32Cube-10 | 使用ADC讀取氣體感測器資料(MQ-2)

搜尋並選中晶片STM32L431RCT6:

STM32Cube-10 | 使用ADC讀取氣體感測器資料(MQ-2)

配置時鐘源

  • 如果選擇使用外部高速時鐘(HSE),則需要在System Core中配置RCC;
  • 如果使用預設內部時鐘(HSI),這一步可以略過;

這裡我都使用外部時鐘:

STM32Cube-10 | 使用ADC讀取氣體感測器資料(MQ-2)

配置串列埠

小熊派開發闆闆載ST-Link並且虛擬了一個串列埠,原理圖如下:

STM32Cube-10 | 使用ADC讀取氣體感測器資料(MQ-2)

這裡我將開關撥到AT-MCU模式,使PC的串列埠與USART1之間連線。

接下來開始配置USART1

STM32Cube-10 | 使用ADC讀取氣體感測器資料(MQ-2)

配置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:

STM32Cube-10 | 使用ADC讀取氣體感測器資料(MQ-2)

接下來是對ADC的設定,這裡我們保持預設即可:

STM32Cube-10 | 使用ADC讀取氣體感測器資料(MQ-2)

最後設定ADC的轉換規則:

STM32Cube-10 | 使用ADC讀取氣體感測器資料(MQ-2)

其餘的一些設定保持預設即可。

配置時鐘樹

STM32L4的最高主頻到80M,所以配置PLL,最後使HCLK = 80Mhz即可:

STM32Cube-10 | 使用ADC讀取氣體感測器資料(MQ-2)
STM32Cube-10 | 使用ADC讀取氣體感測器資料(MQ-2)
STM32Cube-10 | 使用ADC讀取氣體感測器資料(MQ-2)

生成工程設定

STM32Cube-10 | 使用ADC讀取氣體感測器資料(MQ-2)

程式碼生成設定

最後設定生成獨立的初始化檔案:

STM32Cube-10 | 使用ADC讀取氣體感測器資料(MQ-2)

生成程式碼

點選GENERATE CODE即可生成MDK-V5工程:

STM32Cube-10 | 使用ADC讀取氣體感測器資料(MQ-2)

3. 在MDK中編寫、編譯、下載使用者程式碼

重定向printf( )函式

參考:

  • STM32Cube-09 | 重定向printf函式到串列埠輸出的多種方法

編寫讀取資料的測試程式碼

修改main函式如下:

程式碼語言:javascript
複製
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);
    }
}
STM32Cube-10 | 使用ADC讀取氣體感測器資料(MQ-2)

至此,我們已經學會如何使用ADC讀取MQ-2感測器的值

相關文章