STM32應用:在MCU電壓浮動的硬體設計上實現如何用ADC量測電壓

關鍵字 :STM32ADCVrefint
在使用ADC取得輸入的電壓值時,有一個重要的參數是VDDA的電壓值,因為從ADC量測取得的數值,需要用到VDDA的電壓值,才能算出量測到的電壓,公式如下。

VCHANNEL-X = VDDA ÷ ADC_RESOLUTION × ADC_DATAX

但是在部分在電池供電且線路設計較為簡約的硬體上,有時會將電池直接供電給MCU,省略了LDO,故MCU的電壓會隨著使用時間而有壓降的情況,回到上一個公式來看,因為VDDA變動,就會導致VCHANNEL-X的結果變動,以下就是要處理這個情況。STM32內部會產生一個參考電壓,而STM32的ADC通常會有一個通道連接到這個參考電壓讓使用者可以量測,而STM32在出廠時,會在一個設定條件下用ADC量測這個內部參考電壓,並將結果燒錄在MCU ROM,我們可以利用這個條件來回推VDDA的電壓。

   大大购相关商品      NUCLEO-L152RE  >> 查询存货及售价

依據上述公式和工廠校正的條件,可得到公式如下。

VDDA = 3000mV x VREFINT_CAL ÷ VREFINT_DATA

以下是實作方式,首先設置CubeMX的ADC,打開Vrefint Channel。


設置適當的ADC參數,因為STM32L152的ADC最大接受頻率會隨著MCU電壓降低而降低,這個測試就先將ADC頻率設置到最低電壓能接受的最高頻率。


以下是STM32L152的ADC說明,關於頻率的部分。


設置適當的取樣時間,須注意VREFINT所需的取樣時間在datasheet中有說明,需參考datasheet後做適當的設置。


由上圖從datasheet取得的內容得知最少需要4μs的取樣時間,因為ADC的頻率設置在4MHz,4μs ÷ ( 1 / 4MHz ) =16,故將Sampling Time設置在16 Cycles。


以上就完成CubeMX的設置,產生程式碼後,在main.c中加入測試程式如下。

這邊加入LL ADC driver的header檔,裡面有所需要的define和macro。

/* USER CODE BEGIN Includes */
#include "stm32l1xx_ll_adc.h"
/* USER CODE END Includes */

這邊加入所需要的兩個變數,一個儲存從ADC取得的轉換結果,一個儲存經運算後回推得到的電壓值。
/* USER CODE BEGIN PV */
uint16_t dr_vrefint;
uint16_t vdda_mv;
/* USER CODE END PV */

下面是轉換的程式碼。
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_Delay(100);
HAL_ADC_Start(&hadc);
HAL_ADC_PollForConversion(&hadc, 100);
dr_vrefint = HAL_ADC_GetValue(&hadc);
vdda_mv = __LL_ADC_CALC_VREFANALOG_VOLTAGE(dr_vrefint, LL_ADC_RESOLUTION_12B);

/* USER CODE END WHILE */

這樣即可取得目前的VDDA電壓,供之後ADC轉換其他Channel的結果轉換成電壓使用。

技術文檔

類型標題檔案
軟件IOC

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論