【STM32 系列】EXTI11觸發(fā)三ADC同步(并非同步)采樣 —— 超精準(zhǔn)設(shè)置采樣率
引言
前段時(shí)間測(cè)試 fft 計(jì)算頻率的準(zhǔn)確性時(shí),發(fā)現(xiàn)用定時(shí)器觸發(fā) ADC 采樣所設(shè)置的采樣率在某些頻率上十分的不準(zhǔn)確,并且會(huì)產(chǎn)生非常嚴(yán)重的頻譜泄露問題(具體可以看上一篇文章:頻譜泄露原因)。
下面是我封裝的一個(gè)設(shè)置定時(shí)器頻率的函數(shù):
點(diǎn)擊查看代碼
#include "set_samplingrate.h"
/**
* @brief 根據(jù)輸入?yún)?shù)設(shè)置定時(shí)器以調(diào)整采樣率
*
* 此函數(shù)依據(jù)給定的定時(shí)器時(shí)鐘頻率和期望的采樣率,計(jì)算并設(shè)置定時(shí)器的自動(dòng)重載寄存器值,
* 從而間接控制采樣達(dá)到期望采樣率。
*
* @param timerHandle 定時(shí)器句柄。
* @param Timer_ClockFreq 定時(shí)器的時(shí)鐘頻率。
* @param SamplingRate 期望的采樣率。
* @return 返回期望設(shè)置的采樣率。
*
* @note 函數(shù)依賴定時(shí)器句柄已正確初始化,且相關(guān)硬件寄存器和庫函數(shù)正常工作。
*/
float32_t Set_SamplingRate(TIM_HandleTypeDef* htim, float32_t Timer_ClockFreq, float32_t SamplingRate)
{
// 聲明變量用于存儲(chǔ)定時(shí)器經(jīng)過預(yù)分頻后的頻率
float32_t Timer_After_PSC_Freq;
Timer_After_PSC_Freq = Timer_ClockFreq / (float32_t)(htim->Init.Prescaler + 1);
// 計(jì)算并設(shè)置定時(shí)器的自動(dòng)重載寄存器值,來調(diào)整ARR以達(dá)到期望采樣率
__HAL_TIM_SET_AUTORELOAD(htim, (Timer_After_PSC_Freq / SamplingRate) - 1);
return SamplingRate;
}
點(diǎn)擊查看代碼
#ifndef __SET_SAMPLINGRATE_H
#define __SET_SAMPLINGRATE_H
#include "main.h"
extern float32_t Set_SamplingRate(TIM_HandleTypeDef* htim, float32_t Timer_ClockFreq, float32_t SamplingRate);
#endif
定時(shí)器觸發(fā)誤差來源
例如,博主使用的 H743 的 TIM3 的頻率為200MHz,經(jīng)過2分頻后得到100MHz,在通過以上函數(shù)設(shè)置640kHz采樣率,那么 CNT 的值就需要是156.25,但 CNT 的值只能是整形的156,那么最終得出的采樣率值為$ \frac{100MHz}{156}=641025.64Hz $,這個(gè)看似微小的差異,其實(shí)可以造成極大的誤差,此時(shí)就可以很清晰的看到頻譜泄露帶來的誤差影響,甚至加窗后也解決不了:


EXTI11外部觸發(fā)ADC采樣
CubeMX配置
ADC1、2、3都是如此配置,假如你是H7系列的話,還需要注意時(shí)鐘分頻的問題,具體看這篇文章:H7時(shí)鐘頻率設(shè)置ADC


EXTI11測(cè)試結(jié)果
測(cè)試方式:使用信號(hào)發(fā)生器發(fā)生方波/脈沖給到 EXTI11 引腳,設(shè)置的方波/脈沖的頻率就是采樣率
1.使用640ksps采樣率采樣1024個(gè)點(diǎn),采樣5k倍數(shù)的正弦波/方波/三角波...加窗后并進(jìn)行1024個(gè)點(diǎn)的 fft 運(yùn)算。
-
采樣5kHz正弦波:

-
采樣100kHz方波:

2.使用32768sps采樣率采樣32768個(gè)點(diǎn),采樣任意頻率的正弦波/方波/三角波...加窗后并進(jìn)行32768個(gè)點(diǎn)的 fft 運(yùn)算
-
采樣4137Hz方波:

-
采樣10109Hz正弦波:

可以看到,使用外部 EXTI 觸發(fā)設(shè)置的采樣率,計(jì)算的頻率非常的準(zhǔn)確,加窗后更是無敵,十分推薦使用。
隱藏問題
使用定時(shí)器可以同步觸發(fā)三個(gè) ADC 同時(shí)采樣,在使用三個(gè) ADC 同時(shí)采樣一個(gè)信號(hào)的時(shí)候,算得的相位差的誤差是相當(dāng)?shù)男。`差只有0.1%;但是使用 EXTI 觸發(fā)采樣時(shí),三個(gè)ADC并不是同時(shí)觸發(fā)的,使得就算采樣同一個(gè)信號(hào),算得的相位差誤差也會(huì)較大,就是由于這個(gè)特性引起的,目前還沒辦法解決。也是各有所長(zhǎng),按需使用吧。
博客導(dǎo)航
本文來自博客園,作者:膝蓋中箭衛(wèi)兵,轉(zhuǎn)載請(qǐng)注明原文鏈接:http://www.rzrgm.cn/Skyrim-sssuuu/p/18783762

浙公網(wǎng)安備 33010602011771號(hào)
https://orcid.org/0000-0001-5102-772X