RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32L0 ADC使用HAL庫(kù)關(guān)于校準(zhǔn)問(wèn)題的說(shuō)明

矜辰所致 ? 來(lái)源:矜辰所致 ? 作者:矜辰所致 ? 2023-06-15 10:57 ? 次閱讀
STM32 系列 ADC校準(zhǔn)問(wèn)題說(shuō)明

前言

最近是有一個(gè)產(chǎn)品用到了ADC,使用的是STM32L051 芯片,使用 STM32CubeMX 生成的代碼,本來(lái)以為簡(jiǎn)簡(jiǎn)單單,但是在調(diào)用 HAL ADC校準(zhǔn)函數(shù)的時(shí)候遇到一個(gè)問(wèn)題有點(diǎn)疑問(wèn),度娘一下也沒有找到解答,還是經(jīng)過(guò)翻閱了一些資料才得到答案,特此來(lái)記錄一下。

我是矜辰所致,全網(wǎng)同名,盡量用心寫好每一系列文章,不浮夸,不將就,認(rèn)真對(duì)待學(xué)知識(shí)的我們,矜辰所致,金石為開!

一、ADC 配置說(shuō)明

詳細(xì)的 STM32 ADC 的使用,本文不做過(guò)多說(shuō)明,這個(gè)網(wǎng)上一搜一大把。

本文使用的是 HAL 庫(kù),直接用 STM32CubeMX 生成的代碼,ADC 的配置步驟在我的另外一篇博文:

[STM32L051測(cè)試 (一、使用CubeMX生成工程文件 — ST系列芯片通用)] 中有過(guò)介紹(發(fā)燒友小伙伴需我還沒發(fā)表過(guò)來(lái)):

在這里插入圖片描述

對(duì)于其他不同型號(hào),F(xiàn)1,F(xiàn)4 等,配置大同小異。

1.1 ADC 采樣步驟

使用 CubeMX 可以大大簡(jiǎn)化工程師的使用步驟,這里直接說(shuō)明一下對(duì)于使用 CubeMX 來(lái)說(shuō)的 ADC 采樣步驟。

ADC 采樣使用步驟簡(jiǎn)單來(lái)說(shuō)如下幾步(以單次采樣為例說(shuō)明)

  1. 配置 ADC 工作參數(shù):包括基本配置,和通道相關(guān)參數(shù);

    (STM32BubeMX 自動(dòng)生成代碼 MX_ADC_Init()

  2. ADC_MSP 初始化:包括初始化 ADC 的時(shí)鐘、GPIO 引腳、 DMA 和 NVIC 相關(guān)的設(shè)置;(STM32BubeMX 自動(dòng)生成代碼HAL_ADC_MspInit()

  3. 校準(zhǔn)!使用前務(wù)必校準(zhǔn)??;

    (大部分型號(hào)需要我們?cè)诔绦蛑凶约赫{(diào)用代碼,某些型號(hào)不需要校準(zhǔn),后面會(huì)說(shuō)明HAL_ADCEx_Calibration_Start()

  4. 啟動(dòng) ADC 轉(zhuǎn)換;

    (我們?cè)诔绦蛑凶约簩懘a,調(diào)用庫(kù)函數(shù)HAL_ADC_Start()

  5. 等待轉(zhuǎn)換完成;

    (我們?cè)诔绦蛑凶约簩懘a,調(diào)用庫(kù)函數(shù)HAL_ADC_PollForConversion()

  6. 獲取結(jié)果;

    (我們?cè)诔绦蛑凶约簩懘a,調(diào)用庫(kù)函數(shù)HAL_ADC_GetValue()

二、ADC 校準(zhǔn)

在上面的步驟中,我把校準(zhǔn)用了紅色字體強(qiáng)調(diào)說(shuō)明,因?yàn)樵?ADC 的使用中必須進(jìn)行校準(zhǔn) ,否者自己設(shè)計(jì)的電路得到的結(jié)果可能與實(shí)際的會(huì)有不同的偏差。

2.1 什么是ADC校準(zhǔn)?

STM32 的 ADC 校準(zhǔn)一般有 參考電壓校準(zhǔn) 和 增益校準(zhǔn)。

參考電壓校準(zhǔn):

先測(cè)量 ADC 參考電壓的實(shí)際值,然后將該值與預(yù)設(shè)的參考電壓進(jìn)行比較,得到參考電壓的偏差,最終通過(guò)校準(zhǔn)將其校正的方式叫做 參考電壓校準(zhǔn) ,其目的是為了準(zhǔn)確測(cè)量 ADC 的輸入信號(hào)。

叫做增益校準(zhǔn):

通過(guò)測(cè)量?jī)?nèi)部基準(zhǔn)電壓和 ADC 輸入信號(hào)的幅值之間的比例關(guān)系,校準(zhǔn) ADC 增益的方式 叫做增益校準(zhǔn),其目的是確保 ADC 輸出的數(shù)值與輸入信號(hào)的幅值之間具有良好的線性關(guān)系,為了準(zhǔn)確的轉(zhuǎn)換 ADC 輸入信號(hào)。

ADC 校準(zhǔn)的目的是為了消除 ADC 的偏移誤差和增益誤差,從而提高測(cè)量精度。

2.2 為什么 ADC 使用需要校準(zhǔn)?

這個(gè)為什么要用 ADC 校準(zhǔn),我這里也只能簡(jiǎn)單的說(shuō)明一下。

這個(gè)就像芯片生產(chǎn)過(guò)程制造中的差異化一樣,ADC部分也存在一些差異化(雖然很小),其參考電壓、偏置電壓、增益等參數(shù)可能存在一些不確定性和漂移,這些參數(shù)的變化會(huì)導(dǎo)致 ADC 的測(cè)量結(jié)果產(chǎn)生誤差。

就想上面介紹什么是 ADC 校準(zhǔn)最后說(shuō)的,為了提高測(cè)量精度,消除 ADC 的偏移誤差和增益誤差,所以在使用 ADC 采樣的時(shí)候都需要進(jìn)行 ADC 校準(zhǔn)。

2.2 什么時(shí)候使用 ADC 校準(zhǔn)?

在我們使用 CubeMX 軟件的時(shí)候,ADC 的配置,初始化等大部分程序都是由軟件給我們生成的,我們都無(wú)需過(guò)多干預(yù),但是校準(zhǔn)是不會(huì)給我們自動(dòng)加入程序的,這就需要我們 手動(dòng)的添加。

在程序中,我們只需要保證在 ADC 開始使用前(ADC 轉(zhuǎn)換函數(shù)調(diào)用前),ADC 初始化后,進(jìn)行校準(zhǔn)即可。

2.3 ADC 采樣每次都需要校準(zhǔn)嗎?

這個(gè)問(wèn)題并不能直接回答,我們先來(lái)了解一下 調(diào)用了 HAL 校準(zhǔn)函數(shù)以后,STM32 是怎么處理的。

調(diào)用 STM32 校準(zhǔn)函數(shù)以后, 校準(zhǔn)的結(jié)果會(huì)被保存在相應(yīng)的寄存器中,以供后續(xù)的ADC測(cè)量使用。

由上面這句話可以知道,校準(zhǔn)過(guò)后的結(jié)果會(huì)被保存起來(lái),每次 ADC 使用的時(shí)候會(huì)從該寄存器中取校準(zhǔn)數(shù)值,所以說(shuō)一般來(lái)說(shuō),只要你上電校準(zhǔn)過(guò)一次,就行了。

但是!注意,校準(zhǔn)過(guò)后不用再校準(zhǔn)是基于你的 ADC 設(shè)置沒有改變,產(chǎn)品的工作環(huán)境穩(wěn)定的前提下!

如果采樣過(guò)程中你改變了 ADC 的環(huán)境,比如參考電壓,采樣時(shí)間等一些配置,或者一些低功耗產(chǎn)品,需要進(jìn)行休眠,那么還是需要進(jìn)行再次校準(zhǔn)的。

還有一點(diǎn),就是產(chǎn)品的工作環(huán)境,比如產(chǎn)品的環(huán)境比較惡劣,溫度啊,干擾啊之類的,那么還是有必要在 ADC 的使用過(guò)程中進(jìn)行定期校準(zhǔn)的。

當(dāng)然,如果我們本著嚴(yán)謹(jǐn)?shù)淖黠L(fēng),在產(chǎn)品上直接使用定期校準(zhǔn)那也是沒問(wèn)題的。

三、HAL 庫(kù)校準(zhǔn)函數(shù)

上面理論的東西介紹完了,那么我們就來(lái)簡(jiǎn)單做個(gè)測(cè)試,其實(shí)我使用過(guò)程中的小疑問(wèn)也是在使用過(guò)程中遇到的。

我們都知道 ADC 的校準(zhǔn)函數(shù)為:HAL_ADCEx_Calibration_Start()

但是當(dāng)我使用這個(gè)函數(shù)時(shí)候,居然出錯(cuò)了,如下圖:

在這里插入圖片描述

提示調(diào)用的參數(shù)太少了(確定出錯(cuò)是我編譯過(guò)后發(fā)現(xiàn)的),提示函數(shù)調(diào)用參數(shù)太少了,這就奇怪了,于是我進(jìn)入看看函數(shù)原型:

在這里插入圖片描述

這里可以看到,怎么多了一個(gè)參數(shù)(上面確實(shí)有解釋說(shuō)明,應(yīng)該填寫什么),但是當(dāng)時(shí)我第一反應(yīng)是看一下這個(gè)參數(shù)在函數(shù)中是怎么用的,于是搜索了一下SingleDiff 這個(gè)參數(shù),發(fā)現(xiàn)在HAL_ADCEx_Calibration_Start 這個(gè)函數(shù)中根本沒用到這個(gè)參數(shù)?

為了搞清楚,我還去度娘問(wèn)了下,發(fā)現(xiàn)根本沒有關(guān)于這個(gè)參數(shù)的說(shuō)明,所有的 STM32 ADC 有關(guān)的帖子文章,都是一樣的, ADC 是啥啥啥,什么模式,解釋一下,怎么用等等巴拉巴拉的……

3.1 單端校準(zhǔn)和差分校準(zhǔn)

其實(shí)上面的注釋說(shuō)明就是,這個(gè)參數(shù)就是用來(lái)選擇使用哪種校準(zhǔn)方式:?jiǎn)味诵?zhǔn)ADC_SINGLE_ENDED 和 差分校準(zhǔn)ADC_DIFFERENTIAL_ENDED。

后來(lái)就去翻閱手冊(cè)資料,下面是查到的說(shuō)明,這里給大家參考一下:

單端校準(zhǔn):

單端校準(zhǔn)是指對(duì) ADC 的單個(gè)輸入通道進(jìn)行校準(zhǔn),主要校準(zhǔn)項(xiàng)包括偏移誤差和增益誤差。

單端校準(zhǔn)主要針對(duì)單端輸入的情況,通過(guò)比較參考電壓和輸入信號(hào)之間的誤差,校準(zhǔn)ADC的增益和偏置電壓。在單端輸入的情況下,參考電壓和輸入信號(hào)之間存在可能的偏差,這會(huì)導(dǎo)致ADC采樣結(jié)果的偏移和誤差。為了解決這個(gè)問(wèn)題,可以使用單端校準(zhǔn)來(lái)校正 ADC 的增益和偏置電壓。單端校準(zhǔn)的過(guò)程是使用一個(gè)已知的模擬信號(hào)來(lái)輸入 ADC,然后比較采樣結(jié)果與該模擬信號(hào)的期望值,得到增益和偏置電壓的偏差值,然后通過(guò)校準(zhǔn)將其校正。

單端校準(zhǔn)時(shí),ADC將使用內(nèi)部參考電壓作為參考電壓,對(duì)每個(gè)輸入通道進(jìn)行測(cè)量,計(jì)算出偏移誤差和增益誤差,并將這些誤差保存在相應(yīng)的寄存器中。

差分校準(zhǔn):

差分校準(zhǔn)是指對(duì) ADC 的差分輸入通道進(jìn)行校準(zhǔn),主要校準(zhǔn)項(xiàng)也包括偏移誤差和增益誤差。

差分校準(zhǔn)主要針對(duì)差分輸入的情況,通過(guò)比較參考電壓和輸入信號(hào)之間的誤差,校準(zhǔn) ADC 的差分增益和偏置電壓。在差分輸入的情況下,差分增益和偏置電壓的偏差也會(huì)導(dǎo)致 ADC 采樣結(jié)果的偏移和誤差。為了解決這個(gè)問(wèn)題,可以使用差分校準(zhǔn)來(lái)校正 ADC 的差分增益和偏置電壓。差分校準(zhǔn)的過(guò)程是使用一個(gè)已知的差分輸入信號(hào)來(lái)輸入 ADC,然后比較采樣結(jié)果與該差分輸入信號(hào)的期望值,得到差分增益和偏置電壓的偏差值,然后通過(guò)校準(zhǔn)將其校正。

差分校準(zhǔn)時(shí),ADC 將使用內(nèi)部參考電壓作為參考電壓,并將兩個(gè)輸入通道的差值作為輸入信號(hào)進(jìn)行測(cè)量,計(jì)算出偏移誤差和增益誤差,并將這些誤差保存在相應(yīng)的寄存器中。

3.2 不同系列的校準(zhǔn)函數(shù)

所以在我們使用不同的系列的 HAL 庫(kù)的時(shí)候,雖然校準(zhǔn)函數(shù)都是HAL_ADCEx_Calibration_Start ,但是也有著一些參數(shù)的區(qū)別。

對(duì)于我目前使用的 STM32L051 來(lái)說(shuō),HAL校準(zhǔn)函數(shù)使用的示例如下:

HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED);

大部分情況下直接選擇單端校準(zhǔn)ADC_SINGLE_ENDED就行了,差分校準(zhǔn)還需要外部電路的支持。

對(duì)于 STM32F 系列的來(lái)說(shuō),HAL校準(zhǔn)函數(shù)使用的示例如下:

HAL_ADCEx_Calibration_Start(&hadc1);

......

3.3 更多的校準(zhǔn)模式

對(duì)于更多的系列,因?yàn)樽约耗壳皼]有用到,我也沒有一個(gè)一個(gè)去找,但是通過(guò)資料了解到,對(duì)于有些型號(hào),比如 STM32F4 系列的,ADC的校準(zhǔn)由硬件自動(dòng)執(zhí)行,不需要額外的調(diào)用 ADC 校準(zhǔn)函數(shù)。

雖然我沒有去試,但是這個(gè)硬件自動(dòng)執(zhí)行校準(zhǔn)在 STM32CubeMX 中應(yīng)該可以選擇,因?yàn)樗枰鼓?,在程序中的體現(xiàn)為:

hadc1.Init.AutoCalibration = ENABLE;

而且在 STM32 系列中,還有支持額外校準(zhǔn)模式(共模校準(zhǔn)、差分共模校準(zhǔn))的MCU,具體哪個(gè)我也不知道,這樣的MCU,在使用校準(zhǔn)函數(shù)HAL_ADCEx_Calibration_Start的時(shí)候又多一個(gè)參數(shù)。但是這里可以告訴大家在遇到的時(shí)候不要慌張,這里給出示例。

共模校準(zhǔn):

/* 
使能共模校準(zhǔn) 
*/
HAL_ADCEx_Calibration_Start(&hadc, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED);

/* 等待共模校準(zhǔn)完成 */
while (HAL_ADCEx_Calibration_GetState(&hadc) != HAL_ADC_CALIBRATION_STATE_COMPLETED);

差分共模校準(zhǔn):

/*
使能差分共模校準(zhǔn) 
*/
HAL_ADCEx_Calibration_Start(&hadc, ADC_CALIB_OFFSET, ADC_DIFFERENTIAL_ENDED);

/* 
等待差分共模校準(zhǔn)完成 
*/
while (HAL_ADCEx_Calibration_GetState(&hadc) != HAL_ADC_CALIBRATION_STATE_COMPLETED);

上面的 ADC_CALIB_OFFSET 是指定進(jìn)行偏置校準(zhǔn)。

結(jié)語(yǔ)

好了,本文是自己在使用過(guò)程中遇到的一個(gè)小問(wèn)題,但確實(shí)直接度娘找不到我需要的答案,所以自己花費(fèi)了些功夫查了一下,當(dāng)然也記錄說(shuō)明一下,希望對(duì)大家能夠有幫助!

插一句題外話,我已經(jīng)停了幾個(gè)月沒寫博文了,我也發(fā)過(guò) Blink 告訴大家我最近狀態(tài)很差,現(xiàn)實(shí)事情太多了,到現(xiàn)在為止,我還是深受影響,但是我自己也知道不能繼續(xù)沉淪下去,人往高處走,總是要向前看的,這也是受打擊過(guò)后的第一篇博文,找找感覺,加油!

好了,本文就到這里,謝謝大家!
審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 校準(zhǔn)
    +關(guān)注

    關(guān)注

    1

    文章

    154

    瀏覽量

    21862
  • ADC
    ADC
    +關(guān)注

    關(guān)注

    0

    文章

    110

    瀏覽量

    16845
  • HAL
    HAL
    +關(guān)注

    關(guān)注

    2

    文章

    70

    瀏覽量

    12607
  • STM32L0
    +關(guān)注

    關(guān)注

    1

    文章

    7

    瀏覽量

    1677
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    stm32L0固件庫(kù)下載在哪里

    stm32l0的固件庫(kù)在哪下載啊,網(wǎng)上的教程已經(jīng)不適用于st改版之后的了,謝謝
    發(fā)表于 08-19 17:14

    請(qǐng)問(wèn)STM32L0如何用LSE校準(zhǔn)MSI

    STM32L0的資料和開發(fā)實(shí)例比較少,包括HAL庫(kù)的資料也不多。我用的是STM32L011的MCU,不能接無(wú)源的外部高速晶振HSE,接有源的晶振功耗也大,所以打算用內(nèi)部的MSI,但是又
    發(fā)表于 12-05 08:52

    STM32L0ADC采集

    STM32L0系列之ADC采集前言使用芯片:STM32L051C8T6軟件平臺(tái):KEIL V5、STM32CubeL0庫(kù)函數(shù):HAL一、原理
    發(fā)表于 08-11 07:55

    如何解決STM32L0 HAL串口問(wèn)題?

    如何解決STM32L0 HAL串口問(wèn)題?
    發(fā)表于 12-16 07:05

    如何去實(shí)現(xiàn)STM32L0 HAL庫(kù) UART串口的讀寫功能呢

    如何去實(shí)現(xiàn)STM32L0 HAL庫(kù) UART串口讀寫功能呢?如何接收字符串?
    發(fā)表于 02-21 07:42

    介紹STM32L0實(shí)現(xiàn)超低功耗

    STM32L0 超低功耗新突破
    的頭像 發(fā)表于 07-03 04:20 ?9125次閱讀

    講講開發(fā)STM32的四種庫(kù)

    1.我是選擇寄存器開發(fā)STM32,還是標(biāo)準(zhǔn)外設(shè)庫(kù)呢? 2.你有STM32L0標(biāo)準(zhǔn)外設(shè)庫(kù)嗎? 3.HAL
    的頭像 發(fā)表于 02-10 10:16 ?1.1w次閱讀
    講講開發(fā)<b class='flag-5'>STM32</b>的四種<b class='flag-5'>庫(kù)</b>

    STM32四種庫(kù)對(duì)比:寄存器、標(biāo)準(zhǔn)外設(shè)庫(kù)HAL、LL

    1.我是選擇寄存器開發(fā)STM32,還是標(biāo)準(zhǔn)外設(shè)庫(kù)呢? 2.你有STM32L0標(biāo)準(zhǔn)外設(shè)庫(kù)嗎? 3.HAL庫(kù)
    發(fā)表于 03-05 06:17 ?50次下載
    <b class='flag-5'>STM32</b>四種<b class='flag-5'>庫(kù)</b>對(duì)比:寄存器、標(biāo)準(zhǔn)外設(shè)<b class='flag-5'>庫(kù)</b>、<b class='flag-5'>HAL</b>、LL

    keil + STM32CubeMX 開發(fā)stm32L0 踩坑

    鏈接大家習(xí)慣從官方路徑下載是最好的了,慢就VPN關(guān)鍵詞:STM32L051 STM32L07流程目錄keil + STM32CubeMX 開發(fā)stm32L0 踩坑安裝軟件keil安裝j
    發(fā)表于 12-03 09:06 ?30次下載
    keil + <b class='flag-5'>STM32</b>CubeMX 開發(fā)<b class='flag-5'>stm32L0</b> 踩坑

    關(guān)于STM32L系列MCU adc 測(cè)地信號(hào)不為0

    關(guān)于STM32L011系列MCU adc 測(cè)地信號(hào)不為0(Analog模擬adc測(cè)試為40或更大)如圖所示:之前請(qǐng)教很多工程師說(shuō)
    發(fā)表于 12-09 12:51 ?7次下載
    <b class='flag-5'>關(guān)于</b><b class='flag-5'>STM32L</b>系列MCU <b class='flag-5'>adc</b> 測(cè)地信號(hào)不為<b class='flag-5'>0</b>

    AN4725_適用于STM32L0系列的STM32Cube固件例程

    AN4725_適用于STM32L0系列的STM32Cube固件例程
    發(fā)表于 11-21 08:11 ?14次下載
    AN4725_適用于<b class='flag-5'>STM32L0</b>系列的<b class='flag-5'>STM32</b>Cube固件例程

    AN4628_評(píng)估STM32L0系列功耗

    AN4628_評(píng)估STM32L0系列功耗
    發(fā)表于 11-21 08:11 ?2次下載
    AN4628_評(píng)估<b class='flag-5'>STM32L0</b>系列功耗

    AN4718_如何基于STM32L0STM32L1系列設(shè)計(jì)VBAT系統(tǒng)

    AN4718_如何基于STM32L0STM32L1系列設(shè)計(jì)VBAT系統(tǒng)
    發(fā)表于 11-21 17:06 ?25次下載
    AN4718_如何基于<b class='flag-5'>STM32L0</b>和<b class='flag-5'>STM32L</b>1系列設(shè)計(jì)VBAT系統(tǒng)

    AN4654_從STM32L1到STM32L0的軟件移植

    AN4654_從STM32L1到STM32L0的軟件移植
    發(fā)表于 11-21 17:06 ?1次下載
    AN4654_從<b class='flag-5'>STM32L</b>1到<b class='flag-5'>STM32L0</b>的軟件移植

    AN4617_從STM32F0STM32L0的軟件移植

    AN4617_從STM32F0STM32L0的軟件移植
    發(fā)表于 11-21 17:06 ?5次下載
    AN4617_從<b class='flag-5'>STM32F0</b>到<b class='flag-5'>STM32L0</b>的軟件移植
    RM新时代网站-首页