RM新时代网站-首页

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

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

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

如何從Raspberry Pi Pico的模數(shù)轉(zhuǎn)換器捕獲數(shù)據(jù)計(jì)算?

電子設(shè)計(jì) ? 來源:電路城 ? 作者:電路城 ? 2021-04-28 10:42 ? 次閱讀

了解如何在Raspberry Pi Pico上以高達(dá)500 kHz的頻率采樣并根據(jù)捕獲的數(shù)據(jù)計(jì)算快速傅立葉變換。

硬件部件:

Raspberry Pi Pico× 1個(gè)

在此項(xiàng)目中,我們將使用一些特殊功能以極快的速度從Raspberry Pi Pico的模數(shù)轉(zhuǎn)換器ADC)捕獲數(shù)據(jù),然后對數(shù)據(jù)進(jìn)行快速傅立葉變換。這是許多項(xiàng)目的常見任務(wù),例如涉及音頻處理或廣播的項(xiàng)目。

很可能您已經(jīng)有了一個(gè)想要從中收集數(shù)據(jù)的傳感器。就我而言,我有一個(gè)麥克風(fēng)連接到Pico的A0輸入。如果您只是來這里學(xué)習(xí),則可以使模擬輸入懸空而無任何連接。

您可以在GitHub上找到完整程序。

1.背景

Raspberry Pi Pico如此有用的一個(gè)主要原因是其眾多的硬件功能使處理器從執(zhí)行常規(guī)I / O任務(wù)中解放出來。在我們的例子中,我們將使用Pico的直接內(nèi)存訪問(DMA)模塊。這是一項(xiàng)硬件功能,可以自動(dòng)化任務(wù),涉及以極快的速度將大量數(shù)據(jù)進(jìn)出內(nèi)存到IO。

可以將DMA模塊配置為在準(zhǔn)備好樣本后立即將它們從ADC中取出。以最快的速度,您可以在高達(dá)0.5 MHz的頻率下采樣!

收集所有這些數(shù)據(jù)后,您可能需要對其進(jìn)行一些處理。一個(gè)常見的任務(wù)是將您的信息從時(shí)域轉(zhuǎn)換到頻域以進(jìn)行進(jìn)一步處理。就我而言,我有一個(gè)麥克風(fēng),我想從該麥克風(fēng)收集音頻樣本,然后計(jì)算樣本中包含的最大頻率分量。最常用的算法是快速傅立葉變換。

2. ADC采樣代碼

如果您還沒有這樣做,我強(qiáng)烈建議您在GitHub上克隆Raspberry Pi的pico-examples庫。這是我用來開始的所有采樣代碼的地方。以下代碼的很大一部分來自此存儲(chǔ)庫中的dma_capture示例。

我將介紹軟件的一些關(guān)鍵要素,以解釋發(fā)生了什么。您可以在“代碼”部分找到完整的程序。

// set sample rate

adc_set_clkdiv(CLOCK_DIV);

這條線確定ADC收集樣本的速度?!?clkdiv”是指時(shí)鐘分頻,它使您可以分割48 MHz基本時(shí)鐘,以更低的速率進(jìn)行采樣。目前,一個(gè)樣本需要96個(gè)循環(huán)來收集。這樣得出的最大采樣率是每秒48、000、000個(gè)循環(huán)/每個(gè)樣本96個(gè)循環(huán)=每秒500、000個(gè)樣本。

為了降低采樣速度,可以增加時(shí)鐘分頻。將CLOCK_DIV設(shè)置為960將使每個(gè)樣本的循環(huán)數(shù)增加10倍,從而每秒產(chǎn)生50000個(gè)樣本。您猜到了,將CLOCK_DIV設(shè)置為9600可以得到每秒5 000個(gè)樣本。

void sample(uint8_t *capture_buf) {

adc_fifo_drain();

adc_run(false);

dma_channel_configure(dma_chan, &cfg,

capture_buf, // dst

&adc_hw-》fifo, // src

NSAMP, // transfer count

true // start immediately

);

gpio_put(LED_PIN, 1);

adc_run(true);

dma_channel_wait_for_finish_blocking(dma_chan);

gpio_put(LED_PIN, 0);

}

該功能實(shí)際上是從ADC收集樣本。處理器復(fù)位ADC,排空緩沖區(qū),然后開始采樣。它還將在采樣期間打開LED,以便您查看正在發(fā)生的情況。

3. FFT代碼

// get NSAMP samples at FSAMP

sample(cap_buf);

// fill fourier transform input while subtracting DC component

uint64_t sum = 0;

for (int i=0;i《NSAMP;i++) {sum+=cap_buf[i];}

float avg = (float)sum/NSAMP;

for (int i=0;i《NSAMP;i++) {fft_in[i]=(float)cap_buf[i]-avg;}

上面的這一部分用ADC的采樣填充cap_buf數(shù)組,然后對其進(jìn)行預(yù)處理以進(jìn)行傅立葉變換庫。對于許多應(yīng)用程序,在對數(shù)據(jù)進(jìn)行傅里葉變換之前,先從數(shù)據(jù)序列中減去平均值是有利的。否則,任何直流電平(信號(hào)偏移會(huì)超過零)將導(dǎo)致輸出頻點(diǎn)接近零而具有巨大的幅度。我使用的庫KISS FFT期望信號(hào)具有浮點(diǎn)類型,因此我在減去均值的同時(shí)也轉(zhuǎn)換了樣本。

// compute fast fourier transform

kiss_fftr(cfg , fft_in, fft_out);

// compute power and calculate max freq component

float max_power = 0;

int max_idx = 0;

// any frequency bin over NSAMP/2 is aliased (nyquist sampling theorum)

for (int i = 0; i 《 NSAMP/2; i++) {

float power = fft_out[i].r*fft_out[i].r+fft_out[i].i*fft_out[i].i;

if (power》max_power) {

max_power=power;

max_idx = i;

}

}

float max_freq = freqs[max_idx];

printf(“Greatest Frequency Component: %0.1f Hz\n”,max_freq);

下一部分將計(jì)算FFT,然后計(jì)算輸出數(shù)據(jù)中的最大頻率分量。FFT的輸出是復(fù)數(shù)值,因此要獲得可用的功率值,可以取復(fù)結(jié)果的大小。

還要注意的是,與其循環(huán)遍歷FFT的所有NSAMP輸出值,我們僅對NSAMP / 2進(jìn)行裝箱。由于奈奎斯特采樣定理,任何大于采樣率1/2的頻率都將被混疊在一起,因此這些bin對我們沒有用。這是信號(hào)處理的基本結(jié)果,如果您不熟悉,則值得進(jìn)一步研究!

就音頻而言,人耳通??梢月牭礁哌_(dá)20 kHz左右的頻率。我使用的CLOCK_DIV值為960,產(chǎn)生的采樣率為50 kHz。因此,我可以捕獲的最大非混疊頻率為25 kHz,這應(yīng)該綽綽有余!

// BE CAREFUL: anything over about 9000 here will cause things

// to silently break. The code will compile and upload, but due

// to memory issues nothing will work properly

#define NSAMP 1000

需要指出的最后一點(diǎn)代碼是NSAMP或收集的樣本數(shù)。在信號(hào)處理中,在較高和較低數(shù)量的樣本之間存在一個(gè)基本的權(quán)衡。更多的樣本將花費(fèi)更長的時(shí)間來收集和處理,但是會(huì)產(chǎn)生更高分辨率的傅里葉變換。更少的樣本將導(dǎo)致更短的采樣周期和更快的處理,但是您的傅立葉變換將更加精細(xì)。

對于Pico,我發(fā)現(xiàn)分配過多的內(nèi)存會(huì)導(dǎo)致難以調(diào)試的失敗。如果您將NSAMP設(shè)置得太大,您的Pico將沒有足夠的內(nèi)存來分配給保存樣本的陣列。該代碼仍然可以編譯和上傳,但是您可能會(huì)得到一些奇怪的行為。在我的示例中,將NSAMP保持在9000以下似乎很好。

3.編譯和上傳

如果尚未下載,請下載Raspberry Pi Pico入門。這是一個(gè)堅(jiān)實(shí)的資源,可為您提供設(shè)置構(gòu)建系統(tǒng),編譯C / C ++代碼并將其上傳到Pico所需的一切。

以下所有說明均適用于macOS / Linux,但我想Windows上的CMake也有類似的過程。

要編譯我的代碼,請先在GitHub上下載我的存儲(chǔ)庫。

導(dǎo)航到adc_fft目錄

創(chuàng)建一個(gè)名為“ build”的目錄

在其中導(dǎo)航,然后鍵入“ cmake 。./”

輸入“ make”,如果正確安裝了Pico構(gòu)建系統(tǒng),則所有內(nèi)容均應(yīng)編譯

將您的Pico放入引導(dǎo)加載程序模式,然后將adc_fft.uf2文件拖放到出現(xiàn)的驅(qū)動(dòng)器

那應(yīng)該是全部!您可以通過USB監(jiān)視程序的輸出。它將在從A0采樣的數(shù)據(jù)中輸出最大頻率分量,并且LED應(yīng)該快速閃爍。
責(zé)任編輯:pj

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

    關(guān)注

    68

    文章

    19259

    瀏覽量

    229648
  • adc
    adc
    +關(guān)注

    關(guān)注

    98

    文章

    6495

    瀏覽量

    544457
  • 模數(shù)轉(zhuǎn)換器

    關(guān)注

    26

    文章

    3200

    瀏覽量

    126810
收藏 人收藏

    評論

    相關(guān)推薦

    數(shù)模和模數(shù)轉(zhuǎn)換器

    數(shù)模和模數(shù)轉(zhuǎn)換器數(shù)模和模數(shù)轉(zhuǎn)換器能將模擬量轉(zhuǎn)換為數(shù)字量的電路稱為模數(shù)轉(zhuǎn)換器,簡稱A/D轉(zhuǎn)換器或ADC;能將數(shù)字量
    發(fā)表于 09-16 15:59

    NXP 高速模數(shù)轉(zhuǎn)換器

    NXP 高速模數(shù)轉(zhuǎn)換器
    發(fā)表于 08-14 12:34

    SAR模數(shù)轉(zhuǎn)換器AD7989-1和AD7989-5

    。 PulSAR組合包括18位和16位模數(shù)精密轉(zhuǎn)換器,吞吐速率100 kSPS到1 MSPS.  以上兩款模數(shù)轉(zhuǎn)換器均提供一條豐富多樣的引腳兼容型性能升級(jí)/降級(jí)途徑,適用于多種市場,
    發(fā)表于 11-29 11:09

    5962-9581501HXA高端AD模數(shù)轉(zhuǎn)換器

    AD10242TZ/883B高端AD模數(shù)轉(zhuǎn)換器IC ADC 12BIT 41MSPS DL 68CLCC5962-9581501HXA高端AD模數(shù)轉(zhuǎn)換器IC ADC 12BIT 2 CH
    發(fā)表于 07-15 11:10

    什么是光學(xué)模數(shù)轉(zhuǎn)換器?原理是什么?有哪些技術(shù)指標(biāo)?

    什么是光學(xué)模數(shù)轉(zhuǎn)換器?光學(xué)模數(shù)轉(zhuǎn)換器的主要技術(shù)指標(biāo)光學(xué)模數(shù)轉(zhuǎn)換器的研究進(jìn)展光學(xué)模數(shù)轉(zhuǎn)換器的應(yīng)用
    發(fā)表于 04-20 06:52

    模數(shù)轉(zhuǎn)換器(ADC)的配置有哪些流程?

    模數(shù)轉(zhuǎn)換器(ADC)是什么?模數(shù)轉(zhuǎn)換器(ADC)的配置有哪些流程?配置流程的代碼是什么?
    發(fā)表于 07-14 08:43

    STM32之ADC模數(shù)轉(zhuǎn)換器介紹

    ADC模數(shù)轉(zhuǎn)換器是什么?ADC模數(shù)轉(zhuǎn)換器的相關(guān)寄存有哪些?
    發(fā)表于 11-08 08:47

    什么是模數(shù)轉(zhuǎn)換器?

    什么是模數(shù)轉(zhuǎn)換器?
    發(fā)表于 01-24 07:46

    使用raspberry pi Pico的原因

    使用raspberry pi Pico的原因在硬件產(chǎn)品(單片機(jī))的開發(fā)中我們往往需要借助一些額外的儀器/設(shè)備進(jìn)行產(chǎn)品的輔助測試, 假設(shè)我們需要一個(gè)IO+ADC類型輔助設(shè)備, 以往的做法是 原理圖
    發(fā)表于 02-07 09:16

    Raspberry Pi 4/3B的Pico開發(fā)板

    英國 Raspberry Pi 設(shè)計(jì)的全新微控制芯片?!?b class='flag-5'>從控制電器到操作燈光顯示,Raspberry
    發(fā)表于 07-26 07:14

    嵌入式模數(shù)轉(zhuǎn)換器的原理及應(yīng)用

    嵌入式模數(shù)轉(zhuǎn)換器的原理及應(yīng)用   前言   在數(shù)據(jù)采集系統(tǒng)中,模數(shù)轉(zhuǎn)換器是其中至關(guān)重要的環(huán)節(jié),模數(shù)轉(zhuǎn)換器的精度以及系統(tǒng)的成本直接
    發(fā)表于 12-29 11:14 ?1131次閱讀
    嵌入式<b class='flag-5'>模數(shù)轉(zhuǎn)換器</b>的原理及應(yīng)用

    電流積分模數(shù)轉(zhuǎn)換器(ADC),什么是電流積分模數(shù)轉(zhuǎn)換器(AD

    電流積分模數(shù)轉(zhuǎn)換器(ADC),什么是電流積分模數(shù)轉(zhuǎn)換器(ADC) 模數(shù)轉(zhuǎn)換器(Analog to digital Converter,簡稱ADC)是模擬與數(shù)字世界的接口,為了適應(yīng)計(jì)算
    發(fā)表于 03-24 13:31 ?3163次閱讀

    使用Raspberry Pi Pico的LED序列

    電子發(fā)燒友網(wǎng)站提供《使用Raspberry Pi Pico的LED序列.zip》資料免費(fèi)下載
    發(fā)表于 11-14 11:07 ?0次下載
    使用<b class='flag-5'>Raspberry</b> <b class='flag-5'>Pi</b> <b class='flag-5'>Pico</b>的LED序列

    遠(yuǎn)程編程Raspberry Pi Pico

    電子發(fā)燒友網(wǎng)站提供《遠(yuǎn)程編程Raspberry Pi Pico.zip》資料免費(fèi)下載
    發(fā)表于 06-16 15:25 ?0次下載
    遠(yuǎn)程編程<b class='flag-5'>Raspberry</b> <b class='flag-5'>Pi</b> <b class='flag-5'>Pico</b>

    Raspberry Pi Pico 2

    、可選的RISC?V內(nèi)核、增強(qiáng)的安全特性,以及升級(jí)的接口功能。該器件由RP235x微控制平臺(tái)提供支持,此平臺(tái)也由Raspberry Pi設(shè)計(jì)。Pico 2將RP2350與4MB板載Q
    的頭像 發(fā)表于 11-25 15:10 ?542次閱讀
    <b class='flag-5'>Raspberry</b> <b class='flag-5'>Pi</b> <b class='flag-5'>Pico</b> 2
    RM新时代网站-首页