本篇詳細的記錄瞭如何使用STM32CubeMX配置STM32L431RCT6的ADC外設,讀取MQ-2氣體感測器的資料並透過串列埠傳送
本質就是ADC採集
MQ-2的原理圖如下:
![STM32Cube-10 | 使用ADC讀取氣體感測器資料(MQ-2)](https://i.iter01.com/images/f653b5b8d3078884b546d6674c36ede41f3619ae022b641bff14b7cd657d8c20.png)
生成MDK工程
選擇晶片型號
開啟STM32CubeMX,開啟MCU選擇器:
![STM32Cube-10 | 使用ADC讀取氣體感測器資料(MQ-2)](https://i.iter01.com/images/67fece673b8de02c5b93f7fcb09932f878c3b05e03d1738d100ef4ee9c0224f7.jpg)
搜尋並選中晶片STM32L431RCT6
:
![STM32Cube-10 | 使用ADC讀取氣體感測器資料(MQ-2)](https://i.iter01.com/images/abe348ab99dc682d45a4986842cad6f69c331e09563215e3150a781f94d8a8eb.jpg)
配置時鐘源
- 如果選擇使用外部高速時鐘(HSE),則需要在System Core中配置RCC;
- 如果使用預設內部時鐘(HSI),這一步可以略過;
這裡我都使用外部時鐘:
![STM32Cube-10 | 使用ADC讀取氣體感測器資料(MQ-2)](https://i.iter01.com/images/7d258ebd28b1e1b918653585fca45e95d59c48502263bad64974cc5a8c329347.jpg)
配置串列埠
小熊派開發闆闆載ST-Link並且虛擬了一個串列埠,原理圖如下:
![STM32Cube-10 | 使用ADC讀取氣體感測器資料(MQ-2)](https://i.iter01.com/images/3033dd7f25b44861f2f8e2242343325ca95f6c71b9a3b7d72242c19d94466717.png)
這裡我將開關撥到AT-MCU
模式,使PC的串列埠與USART1之間連線。
接下來開始配置USART1
:
![STM32Cube-10 | 使用ADC讀取氣體感測器資料(MQ-2)](https://i.iter01.com/images/1b1756d4758a8848fdc66a74b76bf25afab5c190d61bb1f82a96b7db17fc1a45.jpg)
配置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)](https://i.iter01.com/images/0b786f52a64adc587c1ccecefecf38066efd41fa3c156fd9907e42ec4d60e019.jpg)
接下來是對ADC的設定,這裡我們保持預設即可:
![STM32Cube-10 | 使用ADC讀取氣體感測器資料(MQ-2)](https://i.iter01.com/images/53dcf677bdcd0faae11e660ea522646c2aee3cdc29f869e42c0c828a9e9dfe58.png)
最後設定ADC的轉換規則:
![STM32Cube-10 | 使用ADC讀取氣體感測器資料(MQ-2)](https://i.iter01.com/images/f6a06645f0296269e8e125844d80b2cbf4ffe43e133f3d4d36997a9611293792.png)
其餘的一些設定保持預設即可。
配置時鐘樹
STM32L4的最高主頻到80M,所以配置PLL,最後使HCLK = 80Mhz
即可:
![STM32Cube-10 | 使用ADC讀取氣體感測器資料(MQ-2)](https://i.iter01.com/images/ac1d086140a6c126e63fc68572b8bb939f4a9954974cdd229a322a3b46f8759e.jpg)
![STM32Cube-10 | 使用ADC讀取氣體感測器資料(MQ-2)](https://i.iter01.com/images/20404cfcb9b05d8ea9b54dfd19246dfe38f5bfe80720c59110c2b661ab29712e.png)
![STM32Cube-10 | 使用ADC讀取氣體感測器資料(MQ-2)](https://i.iter01.com/images/1c06e5535a3d5034d4a0ce4b4bd987f3f5702e80c2f5d514f78c4eb546cba3c4.png)
生成工程設定
![STM32Cube-10 | 使用ADC讀取氣體感測器資料(MQ-2)](https://i.iter01.com/images/fc1d4488341710345342b9f90d4314403046cae6a6006544d023c05daaaffe86.png)
程式碼生成設定
最後設定生成獨立的初始化檔案:
![STM32Cube-10 | 使用ADC讀取氣體感測器資料(MQ-2)](https://i.iter01.com/images/6c7371c8e955281d0fa6eb88f8d93630ce2727eb42ab0b21943d68aed35559d3.png)
生成程式碼
點選GENERATE CODE
即可生成MDK-V5工程:
![STM32Cube-10 | 使用ADC讀取氣體感測器資料(MQ-2)](https://i.iter01.com/images/5e2bb4a1aa70aa2fc2f66f92f00feb4187d40734a0f85d24de79fece2efd6ac4.png)
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);
}
}
![STM32Cube-10 | 使用ADC讀取氣體感測器資料(MQ-2)](https://i.iter01.com/images/ab472d504a162b894ce96e18d32b960b29f522e9632145c9d9e84cfd580f0a28.png)
至此,我們已經學會如何使用ADC讀取MQ-2感測器的值