簡體   English   中英

如何使用 RISC-V GD32VF103CBT6 開發板卸載精確的 ADC 過采樣

[英]how to offload precise ADC oversampling with RISC-V GD32VF103CBT6 Development Board

我希望使用RISC-V GD32VF103CBT6 開發板制作一個非常基本的音頻效果設備。 我已經設法用另一個 MCU 進行了一些基於硬件中斷的采樣,但我對 RISC-V 板的文檔有點困惑。 用戶手冊第 11 章 我一點也不知道如何將那里的指令轉換為實際的 C/C++ 代碼。 可悲的是,他們的github repo幾乎沒有任何示例,而且似乎沒有一個可以處理高速采樣。 這個 github repo中還有一個數據表,但我也無法在其中找到任何具體的代碼示例或揭示指令。

我想做的是:

  • 執行用戶手冊中描述的校准,該校准必須先於采樣操作。
  • 使用其過采樣功能從外部引腳收集音頻信號電壓的 12 位音頻樣本,以高采樣率將多個 12 位樣本匯總為單個 16 位樣本。 最終,我想要以 48khz-96khz 的 16 位采樣音頻。
  • 我需要幫助指示 MCU 使用其內置硬件功能收集這些樣本。
  • 我想連續采樣,盡可能多地卸載內置硬件功能,這樣我就可以留下足夠的處理開銷來做一些簡單的信號處理。

第 11.4.1 節明確表示

在開始 A/D 轉換之前應進行校准。 校准由軟件通過設置位 CLB=1 來啟動。 在整個校准序列期間,CLB 位保持為 1。 一旦校准完成,它就會被硬件清零。 內部模擬校准可以通過設置 ADC_CTL1 寄存器中的 RSTCLB 位來復位。

Calibration software procedure:
1) Ensure that ADCON=1.
2) Delay 14 ADCCLK to wait for ADC stability
3) Set RSTCLB (optional)
4) Set CLB=1.5.Wait until CLB=0.

問題 1:如何按照這些說明設置這些 memory 寄存器 我需要一個代碼示例,制造商沒有提供。

問題 2:如何在 C/C++ 中delay 14 ADDCCLK 似乎循環將非常低效。 我應該打電話給sleep()嗎? 對 ADDCCLK 的任何解釋也很有幫助。

這似乎也很重要,但我不知道它預示着什么:

時鍾 controller 提供的 ADCCLK 時鍾為同步 APB2 時鍾。 RCU controller 具有用於 ADC 時鍾的專用可編程預分頻器。

完全不確定,但我認為這是我想要的轉換模式:

連續轉換模式

此模式可以在常規通道組上運行。 當 ADC_CTL1 寄存器中的 CTN 位置位時,將啟用連續轉換模式。 在此模式下,ADC 在 RSQ0[4:0] 中指定的通道上執行轉換。 當 ADCON 設置為高電平時,一旦相應的軟件觸發或外部觸發有效,ADC 就會對指定通道進行采樣和轉換。 轉換數據將存儲在 ADC_RDATA 寄存器中。

在常規通道上進行連續轉換的軟件程序。 為了擺脫檢查,可以使用 DMA 來傳輸轉換后的數據:

1.Set the CTN and DMA bit in the ADC_CTL1 register
2.Configure RSQ0 with the analog channel number
3.Configure ADC_SAMPTx register
4.Configure ETERC and ETSRC bits in the ADC_CTL1 register if in need
5.Prepare the DMA module to transfer data from the ADC_RDATA.
6.Set the SWRCST bit, or generate an external trigger for the regular group

ADCCLK指 ADC 的輸入時鍾。 可以看看你的數據表。 大多數μC都有一個μC時鍾架構的框圖,通常有一個主系統時鍾,然后不同的外設有一個可以編程的預分頻器,它將系統時鍾除以2的某個冪。

所以14 ADCCLK周期意味着它不是 14 個 CPU 周期,而是 14 個 ADC-Input-Clock 邊沿。 例如,如果 ADC 預分頻器設置為 64,那么您必須等待 64*14 個 CPU 時鍾周期。

如何等待:
大多數情況下(我不知道您的設備上是否存在這種情況)外圍設備有一個忙標志,只要當前操作正在進行,就會設置該標志。 所以可能你可以輪詢這個標志(例如while (ADC0_FLAGS & ADC_ISBUSY); )。

另一種選擇可能是檢查是否存在表示操作完成的中斷。 但至少對於校准來說,最簡單的方法是開始校准,然后使用waitdelay function,這只會浪費一點時間。

我個人會在系統啟動時開始校准,然后做其他初始化工作。 設置結束時可能會延遲幾毫秒,以確保板上的所有組件都正確上電。 在那之后,ADC應該已經完成了很長時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM