GD32H75E ADC同步采樣與過采樣技術(shù)實戰(zhàn):從原理到代碼實現(xiàn)
1. 項目概述為什么GD32H75E的ADC值得深挖最近在做一個高精度數(shù)據(jù)采集的項目主控選型時盯上了兆易創(chuàng)新的GD32H75E。這顆基于Cortex-M7內(nèi)核的MCU性能參數(shù)很亮眼但真正讓我下決心用它還是因為其內(nèi)置的ADC模塊。官方手冊里關(guān)于“同步模式”和“過采樣技術(shù)”的描述讓我覺得這不僅僅是又一個普通的模數(shù)轉(zhuǎn)換器而是為高性能實時信號處理量身打造的工具。在實際調(diào)通整個采集鏈路后我發(fā)現(xiàn)這里面門道不少從最基礎(chǔ)的通道配置、時鐘樹對齊到高級的同步觸發(fā)與過采樣降噪每一步都有需要注意的細(xì)節(jié)。這篇文章我就把自己從零開始折騰GD32H75E ADC的全過程包括踩過的坑和總結(jié)出的最佳實踐系統(tǒng)地梳理一遍。無論你是剛接觸GD32H75E還是正在為多通道同步采樣或提高分辨率發(fā)愁希望這些一手經(jīng)驗?zāi)軒湍闵僮邚澛贰?. 核心模塊解析與設(shè)計思路2.1 ADC模塊架構(gòu)總覽與核心特性GD32H75E系列通常集成了多個ADC模塊具體數(shù)量需查閱對應(yīng)型號的數(shù)據(jù)手冊常見為2到3個獨(dú)立的ADC單元。每個ADC核心都是12位逐次逼近型SAR架構(gòu)但它的設(shè)計思路明顯偏向于滿足電機(jī)控制、數(shù)字電源、高端傳感器融合等復(fù)雜應(yīng)用場景。其核心特性可以概括為幾個方面首先是采樣速率在高速時鐘驅(qū)動下單次轉(zhuǎn)換時間可以做得非常短這對于捕獲快速變化的信號至關(guān)重要。其次是多通道支持每個ADC通常有16個以上的外部模擬通道可以通過掃描模式依次轉(zhuǎn)換。但最吸引人的是硬件同步機(jī)制多個ADC單元可以在一個主觸發(fā)信號如定時器事件的驅(qū)動下同時開始對各自指定的通道進(jìn)行采樣轉(zhuǎn)換這對于需要嚴(yán)格相位對齊的多路信號如三相電流測量是基礎(chǔ)保障。最后是過采樣與硬件平均功能它允許ADC在硬件層面進(jìn)行多次采樣并累加平均從而將有效分辨率提升到12位以上如16位同時抑制高頻噪聲這個功能如果軟件實現(xiàn)會消耗大量CPU時間而硬件實現(xiàn)則幾乎零開銷。我的設(shè)計思路是構(gòu)建一個雙ADC同步采樣系統(tǒng)ADC0和ADC1分別采集兩路相關(guān)的模擬信號例如一個采集電壓一個采集電流并利用過采樣技術(shù)將有效分辨率提升到16位最終通過DMA將數(shù)據(jù)搬運(yùn)到內(nèi)存中進(jìn)行實時處理。這個方案的關(guān)鍵在于精確的時序控制和資源配置。2.2 時鐘樹配置一切精度的起點(diǎn)ADC的精度和速度基石是時鐘。GD32H75E的ADC時鐘ADCCLK通常由高速的AHB時鐘HCLK經(jīng)過一個可編程的分頻器得到。這里第一個容易踩坑的點(diǎn)就出現(xiàn)了ADC時鐘頻率必須嚴(yán)格控制在數(shù)據(jù)手冊規(guī)定的范圍內(nèi)例如最大頻率可能是40MHz或60MHz具體需查證。超頻運(yùn)行會導(dǎo)致線性度下降、轉(zhuǎn)換結(jié)果不可靠。我的配置步驟如下首先確保系統(tǒng)時鐘SYSCLK和AHB時鐘HCLK已正確初始化。然后找到ADC的時鐘控制寄存器通常在RCU模塊中。假設(shè)HCLK為200MHz而ADC最大允許時鐘為40MHz那么分頻系數(shù)至少需要設(shè)置為5200/405。在代碼中這通常對應(yīng)設(shè)置一個預(yù)分頻器位域。注意分頻系數(shù)最好設(shè)置為2的整數(shù)次冪如2, 4, 8, 16。這是因為ADC內(nèi)部的某些時序邏輯可能與時鐘邊沿對齊非2的冪次分頻可能導(dǎo)致微妙的時序抖動在極高精度要求下會引入誤差。我通常選擇讓ADCCLK運(yùn)行在允許范圍內(nèi)的較低頻率如30MHz以換取更好的穩(wěn)定性和更低的功耗。此外ADC模塊還有一個獨(dú)立的“采樣保持時間”時鐘源用于控制對輸入信號電容充電的時間。這個時間必須足夠長以確保信號在采樣期間穩(wěn)定到所需的精度水平。時間長短與信號源內(nèi)阻和ADC輸入電容有關(guān)手冊會給出計算公式。對于內(nèi)阻較大的傳感器需要適當(dāng)延長這個時間。2.3 通道與掃描序列規(guī)劃GD32H75E的每個ADC都有多個規(guī)則通道Regular Channel和注入通道Injected Channel。規(guī)則通道用于常規(guī)的、按順序的掃描采樣而注入通道可以“插隊”在任何時候由特定觸發(fā)信號啟動中斷當(dāng)前的規(guī)則轉(zhuǎn)換序列具有更高的優(yōu)先級。在我的同步采樣設(shè)計中我使用規(guī)則通道組。需要為ADC0和ADC1分別規(guī)劃要采樣的通道。例如ADC0規(guī)則序列通道5溫度傳感器通道11直流母線電壓。ADC1規(guī)則序列通道1A相電流通道2B相電流。規(guī)劃好后需要通過寄存器設(shè)置每個ADC的規(guī)則序列寄存器SQR定義轉(zhuǎn)換的總通道數(shù)和每個位置對應(yīng)的通道編號。這里需要注意的是規(guī)則通道的轉(zhuǎn)換順序嚴(yán)格按照SQR寄存器中定義的序列進(jìn)行。同時要啟用掃描模式SCAN位讓ADC自動按序列轉(zhuǎn)換。實操心得在規(guī)劃序列時將轉(zhuǎn)換時間相近或需要同時關(guān)注的通道放在相鄰的序列位置有時可以簡化后續(xù)的數(shù)據(jù)處理邏輯。例如把三相電流的三個通道連續(xù)排列DMA搬運(yùn)到內(nèi)存后數(shù)據(jù)在數(shù)組里也是連續(xù)的便于進(jìn)行Park/Clarke變換等矩陣運(yùn)算。3. 同步采樣模式深度配置3.1 同步觸發(fā)源與主從模式設(shè)置同步采樣的精髓在于“同時開始”。GD32H75E的多個ADC可以工作在主從模式。通常選擇一個ADC作為主單元Master另一個或多個作為從單元Slave。主ADC的轉(zhuǎn)換啟動事件會通過內(nèi)部硬件連線同步觸發(fā)所有從ADC。最常用且精準(zhǔn)的觸發(fā)源是高級定時器如TIMER0的捕獲/比較事件。配置步驟如下配置定時器初始化一個定時器設(shè)置其更新UEV或某個通道比較CCx事件作為觸發(fā)輸出TRGO。例如配置TIMER0每100us產(chǎn)生一次更新事件。配置主ADC的觸發(fā)源將主ADC例如ADC0的轉(zhuǎn)換觸發(fā)方式設(shè)置為“外部觸發(fā)”并選擇觸發(fā)源為對應(yīng)的定時器事件如EXTTRIG_EDGE_TIMER0_TRGO。配置從ADC的觸發(fā)源與同步模式將從ADC例如ADC1的觸發(fā)源也設(shè)置為同一個外部事件。關(guān)鍵在于需要啟用ADC的“同步模式”控制位例如SYNCMODE位并設(shè)置為“從模式”使其等待主ADC的硬件同步信號。使能觸發(fā)確保兩個ADC的“外部觸發(fā)使能”位都已打開。這樣每當(dāng)定時器事件到來主ADC0啟動轉(zhuǎn)換的同時會立即發(fā)送一個同步脈沖給ADC1ADC1在接收到脈沖后也立即啟動轉(zhuǎn)換。理論上兩個ADC的采樣保持動作開始的時刻差異在納秒級滿足了同步性要求。3.2 同步時序細(xì)節(jié)與延遲補(bǔ)償盡管是硬件同步但細(xì)微的延遲仍然存在主要來源于ADC內(nèi)部模擬電路的路徑差異和數(shù)字邏輯的傳播延遲。對于大多數(shù)應(yīng)用這種延遲可以忽略。但在要求極端相位對齊如功率分析時需要考慮補(bǔ)償。GD32H75E的數(shù)據(jù)手冊中可能會提供一個參數(shù)稱為“同步延遲”或“觸發(fā)到采樣啟動延遲”。這是一個固定值通常很小。更重要的實踐是確保兩個ADC的配置完全對稱使用相同的ADCCLK頻率和分頻系數(shù)。設(shè)置相同的采樣保持時間。如果可能使用相同類型的通道例如都使用規(guī)則通道組且序列長度相同。有時為了補(bǔ)償已知的固定延遲可以故意將從ADC的觸發(fā)極性設(shè)置為“上升沿”而主ADC設(shè)置為“下降沿”或者利用定時器產(chǎn)生略有錯位的兩個脈沖分別觸發(fā)但這需要精確測量和反復(fù)調(diào)試屬于高階技巧。注意事項避免在同步轉(zhuǎn)換過程中頻繁切換ADC的配置如改變通道序列。最好在初始化階段就完成所有配置并在同步采樣期間保持穩(wěn)定。任何配置的更改都可能導(dǎo)致同步時序的短暫紊亂產(chǎn)生無效數(shù)據(jù)。3.3 DMA在同步采樣中的關(guān)鍵作用同步采樣會產(chǎn)生連續(xù)的數(shù)據(jù)流如果靠CPU中斷來讀取每個轉(zhuǎn)換結(jié)果開銷巨大且會引入不可控的抖動破壞同步性。因此必須使用DMA。配置DMA的步驟外設(shè)到內(nèi)存模式每個ADC對應(yīng)一個DMA通道或請求流。將DMA源地址設(shè)置為ADC的規(guī)則數(shù)據(jù)寄存器如RDATA目標(biāo)地址設(shè)置為內(nèi)存中的一個數(shù)組如adc0_buffer[]。數(shù)據(jù)寬度與對齊外設(shè)和內(nèi)存的數(shù)據(jù)寬度都設(shè)置為半字16位因為12位ADC結(jié)果通常右對齊存儲在16位寄存器中。循環(huán)模式與增量使能循環(huán)模式這樣當(dāng)DMA搬運(yùn)完設(shè)定的數(shù)據(jù)量后會自動重置并等待下一輪數(shù)據(jù)。設(shè)置外設(shè)地址固定內(nèi)存地址遞增。數(shù)據(jù)數(shù)量設(shè)置DMA需要搬運(yùn)的數(shù)據(jù)數(shù)量NTRANS。這個數(shù)量等于每個ADC規(guī)則序列的長度。例如ADC0序列有2個通道那么NTRANS就設(shè)為2。DMA會在每次ADC轉(zhuǎn)換完成一個序列2個數(shù)據(jù)后自動將這2個數(shù)據(jù)搬運(yùn)到內(nèi)存。雙緩沖技巧為了確保數(shù)據(jù)處理線程不會訪問正在被DMA寫入的內(nèi)存塊可以設(shè)置雙緩沖區(qū)。當(dāng)DMA寫滿緩沖區(qū)A時產(chǎn)生一個半傳輸完成或傳輸完成中斷在中斷服務(wù)程序中將數(shù)據(jù)處理的指針切換到緩沖區(qū)B同時DMA繼續(xù)向B或切換回A寫入。這樣可以實現(xiàn)無鎖、無丟失的數(shù)據(jù)流水線。4. 過采樣技術(shù)原理與實戰(zhàn)提升分辨率4.1 過采樣與噪聲整形的基本原理過采樣Oversampling是一種用采樣速率換取分辨率的信號處理技術(shù)。其核心原理基于一個假設(shè)ADC量化噪聲即由于有限分辨率產(chǎn)生的誤差是白噪聲并且在奈奎斯特帶寬內(nèi)均勻分布。如果我們以高于信號所需頻率Nyquist頻率的K倍進(jìn)行采樣那么量化噪聲的功率會分散到更寬的頻率范圍0 到 K*f_s/2。然后通過一個數(shù)字低通濾波器將信號帶寬以外的噪聲濾除再對數(shù)據(jù)進(jìn)行降采樣Decimation最終的有效分辨率就會提高。分辨率提升的公式為每增加4倍過采樣率有效分辨率提高1位。例如一個12位ADC進(jìn)行16倍4^2過采樣并處理后理論上可以得到14位有效分辨率進(jìn)行256倍4^4過采樣理論上可以得到16位有效分辨率。GD32H75E的硬件過采樣單元就是將“多次采樣累加”和“右移即降采樣”這兩個最耗CPU的操作用硬件實現(xiàn)了。你只需要配置過采樣倍數(shù)和右移位數(shù)硬件就會自動完成N次采樣、累加、求平均通過右移實現(xiàn)并輸出一個結(jié)果大大減輕了CPU負(fù)擔(dān)。4.2 硬件過采樣寄存器配置詳解配置硬件過采樣主要涉及幾個寄存器過采樣使能位OVSEN置1以啟用硬件過采樣模式。過采樣倍數(shù)OVSS選擇過采樣率通常是2, 4, 8, 16, 32, 64, 128, 256倍可選。例如選擇OVSS[2:0] 4代表16倍過采樣。右移位數(shù)OVSR這個配置決定了如何從累加和得到最終結(jié)果。它實際上等價于除以2^OVSR。為了得到正確的平均值右移位數(shù)OVSR必須滿足2^OVSR 過采樣倍數(shù)OVSS。例如16倍過采樣OVSS4那么右移位數(shù)應(yīng)為4因為2^416。這樣硬件將16次采樣值累加后右移4位就得到了算術(shù)平均值。過采樣分辨率模式OVSMD有些ADC提供“常規(guī)模式”和“高分辨率模式”。高分辨率模式下ADC會進(jìn)行更多位的內(nèi)部累加防止在累加大量數(shù)據(jù)時溢出適合超高倍數(shù)的過采樣。配置示例目標(biāo)是將12位ADC提升至16位有效分辨率。需要256倍過采樣。那么設(shè)置OVSS為8代表256倍OVSR為8右移8位即除以256。這樣ADC硬件會自動對每個通道進(jìn)行256次轉(zhuǎn)換將256個12位結(jié)果累加成一個20位12位 log2(256)8位的中間值然后右移8位最終輸出一個12位的“平均值”。但這個12位數(shù)值的噪聲遠(yuǎn)低于原始12位數(shù)據(jù)其有效位數(shù)ENOB接近16位。重要提示過采樣能抑制的是帶寬內(nèi)的隨機(jī)白噪聲如熱噪聲對于固定的偏移誤差Offset或增益誤差Gain Error是無效的。因此在使用過采樣前務(wù)必先進(jìn)行ADC的校準(zhǔn)消除固有的直流誤差。4.3 過采樣模式下的時序與性能權(quán)衡啟用過采樣后最直接的影響是單次轉(zhuǎn)換時間變長。因為硬件需要連續(xù)進(jìn)行N次采樣轉(zhuǎn)換??傓D(zhuǎn)換時間 ≈ 單次轉(zhuǎn)換時間 × 過采樣倍數(shù)。例如單次轉(zhuǎn)換時間為1us啟用256倍過采樣后得到一個有效數(shù)據(jù)點(diǎn)的周期就變成了256us等效采樣率從1MHz下降到了約3.9kHz。這是一個巨大的代價。因此過采樣技術(shù)的應(yīng)用場景非常明確用于轉(zhuǎn)換低頻或直流信號以極高的精度測量其幅度。比如測量溫度、壓力、慢變電壓、高精度電池電量檢測等。對于音頻信號或電機(jī)控制中的快速電流環(huán)過采樣通常不適用因為會嚴(yán)重限制帶寬。在同步采樣模式下使用過采樣需要特別注意兩個ADC的過采樣配置倍數(shù)、右移必須完全相同否則它們輸出數(shù)據(jù)率的時序會錯位導(dǎo)致后續(xù)數(shù)據(jù)處理無法對齊。同時觸發(fā)定時器的周期也要相應(yīng)調(diào)整必須大于等于ADC完成一次過采樣轉(zhuǎn)換所需的總時間。5. 完整代碼實現(xiàn)與配置流程5.1 系統(tǒng)初始化與ADC校準(zhǔn)任何高精度ADC應(yīng)用的第一步都是校準(zhǔn)。GD32H75E的ADC通常支持內(nèi)部自校準(zhǔn)功能用于修正電容陣列的誤差。// 偽代碼示例基于標(biāo)準(zhǔn)外設(shè)庫風(fēng)格 void ADC_Calibration(ADC_TypeDef* ADCx) { // 1. 確保ADC處于禁用狀態(tài)且穩(wěn)定 ADC_DISABLE(ADCx); delay_ms(1); // 2. 設(shè)置校準(zhǔn)模式通常為單端輸入校準(zhǔn) ADC_CALIBRATION_MODE_CONFIG(ADCx, ADC_CALIBRATION_SINGLE_ENDED); // 3. 啟動校準(zhǔn) ADC_CALIBRATION_ENABLE(ADCx); // 4. 等待校準(zhǔn)完成 while(ADC_CALIBRATION_STATUS_GET(ADCx)); // 5. 可選讀取校準(zhǔn)因子并存儲用于后續(xù)軟件補(bǔ)償 // uint32_t calib_factor ADC_CALIBRATION_FACTOR_GET(ADCx); }系統(tǒng)時鐘初始化、GPIO將對應(yīng)引腳配置為模擬輸入模式和DMA的初始化在此省略這些都是標(biāo)準(zhǔn)操作。重點(diǎn)是校準(zhǔn)必須在ADC其他功能配置之前進(jìn)行且供電電壓穩(wěn)定。5.2 雙ADC同步與過采樣配置代碼以下是配置ADC0為主、ADC1為從并進(jìn)行16倍過采樣的核心代碼片段// 1. 配置ADC通用控制寄存器適用于所有ADC單元 // 設(shè)置ADCCLK分頻假設(shè)HCLK200MHz目標(biāo)ADCCLK25MHz RCU_CFG1 | RCU_CFG1_ADCPSC_8; // 8分頻200/825MHz // 2. 配置ADC0主 ADC_CTL0(ADC0) 0; // 先清零 ADC_CTL0(ADC0) | ADC_CTL0_ADCON; // 使能ADC // 設(shè)置掃描模式、連續(xù)轉(zhuǎn)換由外部觸發(fā)控制啟停 ADC_CTL0(ADC0) | ADC_CTL0_SCAN | ADC_CTL0_CONTINUOUS; // 配置外部觸發(fā)源為TIMER0的TRGO事件上升沿觸發(fā) ADC_CTL1(ADC0) | ADC_EXTTRIG_REGULAR_TIMER0_TRGO | ADC_CTL1_ETSRC; ADC_CTL1(ADC0) | ADC_CTL1_ETERC; // 使能外部觸發(fā) // 配置規(guī)則通道序列2個通道CH5, CH11 ADC_RSQ0(ADC0) (1 20); // 規(guī)則序列長度2 (RL[3:0]1表示2個轉(zhuǎn)換) ADC_RSQ2(ADC0) (5 0); // 序列第1個CH5 ADC_RSQ2(ADC0) | (11 5); // 序列第2個CH11 // 配置過采樣16倍右移4位 ADC_OVSAMPCTL(ADC0) | ADC_OVSAMPCTL_OVSEN; // 使能過采樣 ADC_OVSAMPCTL(ADC0) | (4 ADC_OVSAMPCTL_OVSS_OFFSET); // OVSS4 (16x) ADC_OVSAMPCTL(ADC0) | (4 ADC_OVSAMPCTL_OVSR_OFFSET); // OVSR4 (右移4位) // 3. 配置ADC1從 ADC_CTL0(ADC1) | ADC_CTL0_ADCON; ADC_CTL0(ADC1) | ADC_CTL0_SCAN | ADC_CTL0_CONTINUOUS; // 關(guān)鍵觸發(fā)源選擇與主ADC相同但工作模式設(shè)置為從同步模式 ADC_CTL1(ADC1) | ADC_EXTTRIG_REGULAR_TIMER0_TRGO | ADC_CTL1_ETSRC; ADC_CTL1(ADC1) | ADC_CTL1_ETERC; ADC_CTL1(ADC1) | ADC_CTL1_SYNCM; // 設(shè)置為同步模式從模式 // 規(guī)則通道序列CH1, CH2 ADC_RSQ0(ADC1) (1 20); // RL1 (2 conversions) ADC_RSQ2(ADC1) (1 0) | (2 5); // 過采樣配置必須與主ADC一致 ADC_OVSAMPCTL(ADC1) | ADC_OVSAMPCTL_OVSEN; ADC_OVSAMPCTL(ADC1) | (4 ADC_OVSAMPCTL_OVSS_OFFSET); ADC_OVSAMPCTL(ADC1) | (4 ADC_OVSAMPCTL_OVSR_OFFSET); // 4. 配置DMA for ADC0 ADC1 // 此處省略詳細(xì)的DMA初始化代碼重點(diǎn) // - 外設(shè)地址ADC_RDATA(ADC0) 和 ADC_RDATA(ADC1) // - 內(nèi)存地址各自的數(shù)據(jù)緩沖區(qū) // - 數(shù)據(jù)寬度半字16位 // - 循環(huán)模式外設(shè)地址固定內(nèi)存地址遞增 // - 數(shù)據(jù)數(shù)量2對應(yīng)規(guī)則序列長度 // 5. 使能ADC的DMA請求 ADC_CTL1(ADC0) | ADC_CTL1_DMA; ADC_CTL1(ADC1) | ADC_CTL1_DMA; // 6. 配置觸發(fā)定時器TIMER0 // 產(chǎn)生一個100us周期的更新事件作為TRGO TIMER_CAR(TIMER0) SystemCoreClock / 10000 - 1; // 10kHz - 100us TIMER_CTL0(TIMER0) | TIMER_CTL0_UPEN; // 使能更新事件 TIMER_CTL1(TIMER0) | TIMER_CTL1_MMC(0x20); // 選擇更新事件作為TRGO // 7. 最后使能定時器ADC開始等待觸發(fā) TIMER_CTL0(TIMER0) | TIMER_CTL0_CEN;5.3 數(shù)據(jù)讀取與處理流程配置完成后ADC會在每個定時器周期同步轉(zhuǎn)換DMA自動將數(shù)據(jù)搬運(yùn)到指定數(shù)組。假設(shè)我們定義了雙緩沖區(qū)#define BUFFER_SIZE 2 volatile uint16_t adc0_buf_A[BUFFER_SIZE]; volatile uint16_t adc0_buf_B[BUFFER_SIZE]; volatile uint16_t adc1_buf_A[BUFFER_SIZE]; volatile uint16_t adc1_buf_B[BUFFER_SIZE]; volatile uint16_t *adc0_active_buf adc0_buf_A; volatile uint16_t *adc1_active_buf adc1_buf_A; volatile uint8_t buffer_ready 0;在DMA的半傳輸完成HT和傳輸完成TC中斷中切換活動緩沖區(qū)指針并設(shè)置標(biāo)志位void DMA_ChannelX_IRQHandler(void) { if(DMA_INTF(DMAy, DMA_CHx) DMA_FLAG_HT) { // 半傳輸完成表示一個緩沖區(qū)已滿切換到另一個 if(adc0_active_buf adc0_buf_A) { adc0_active_buf adc0_buf_B; adc1_active_buf adc1_buf_B; } else { adc0_active_buf adc0_buf_A; adc1_active_buf adc1_buf_A; } buffer_ready 1; // 通知主循環(huán)處理數(shù)據(jù) DMA_INTC(DMAy, DMA_CHx) | DMA_FLAG_HT; // 清除中斷標(biāo)志 } // ... 處理傳輸完成中斷如果需要 }主循環(huán)中檢測到buffer_ready標(biāo)志后即可處理非活動緩沖區(qū)即剛被DMA寫滿的緩沖區(qū)中的數(shù)據(jù)。由于進(jìn)行了16倍過采樣此時adc0_buf_A[0]已經(jīng)是CH5信號16次采樣的平均值噪聲水平顯著降低。6. 調(diào)試技巧與常見問題排查6.1 同步性驗證與診斷方法如何驗證兩個ADC是否真正同步一個簡單的方法是讓它們采樣同一個直流電壓源。如果配置完全對稱且同步成功那么兩個ADC讀取到的數(shù)值應(yīng)該幾乎完全相同在1-2個LSB的誤差范圍內(nèi)。如果差值很大說明同步可能有問題。更嚴(yán)謹(jǐn)?shù)姆椒ㄊ怯靡粋€信號發(fā)生器產(chǎn)生一個方波同時輸入給兩個ADC的某個通道。用邏輯分析儀或示波器探測ADC的“轉(zhuǎn)換結(jié)束”EOC信號引腳如果MCU引出的話或者探測一個在EOC中斷中翻轉(zhuǎn)的GPIO。觀察兩個ADC的EOC信號是否同時出現(xiàn)。如果時間差在一個ADCCLK周期內(nèi)可以認(rèn)為是良好的同步。如果發(fā)現(xiàn)不同步檢查以下方面時鐘一致性確認(rèn)兩個ADC的ADCCLK來源和分頻設(shè)置完全一致。觸發(fā)源確認(rèn)主從ADC的觸發(fā)源選擇寄存器位是完全相同的編碼。同步模式位確認(rèn)從ADC的同步模式SYNCM已正確使能。軟件啟動干擾確保沒有在循環(huán)中調(diào)用ADC_SOFTWARE_START_ENABLE這類函數(shù)它會覆蓋硬件觸發(fā)。6.2 過采樣效果不佳的可能原因過采樣后發(fā)現(xiàn)噪聲并沒有明顯降低或者有效位數(shù)提升不理想??赡艿脑蛴性肼暦前自肼曔^采樣對周期性噪聲如電源紋波或與采樣時鐘相關(guān)的噪聲抑制效果有限。需要先優(yōu)化硬件如加強(qiáng)電源濾波、使用屏蔽、在信號輸入端加入RC低通濾波器抗混疊濾波。采樣保持時間不足如果信號源內(nèi)阻較大ADC的采樣電容沒有足夠的時間充電到穩(wěn)定值每次采樣本身就有誤差過采樣只是平均了這些誤差無法提升精度。需要增加ADC采樣周期寄存器SMPT的值。校準(zhǔn)未做或不準(zhǔn)偏移和增益誤差會直接帶入過采樣結(jié)果。務(wù)必在初始化和溫度變化較大時執(zhí)行校準(zhǔn)。累加溢出在極高倍數(shù)過采樣時硬件累加器可能溢出。確保使能了“高分辨率模式”如果支持或者降低過采樣倍數(shù)。數(shù)字濾波不匹配硬件過采樣內(nèi)置的是簡單的移動平均累加后右移。對于特定噪聲譜可能需要更復(fù)雜的數(shù)字濾波器如FIR進(jìn)行后處理??梢栽贛CU內(nèi)對過采樣后的數(shù)據(jù)流再進(jìn)行一次軟件濾波。6.3 DMA數(shù)據(jù)錯位與緩沖區(qū)管理陷阱這是多通道同步采樣中最常見的問題?,F(xiàn)象是數(shù)據(jù)緩沖區(qū)中的通道順序混亂或者ADC0和ADC1的數(shù)據(jù)無法對應(yīng)。排查清單規(guī)則序列寄存器SQR配置反復(fù)核對ADC_RSQ2、ADC_RSQ1等寄存器確保通道編號和順序與預(yù)期完全一致。一個常見的錯誤是忽略了寄存器中位域的位置。DMA傳輸數(shù)量NTRANS這個值必須等于規(guī)則序列轉(zhuǎn)換的通道總數(shù)。如果設(shè)為1DMA只搬運(yùn)第一個通道的數(shù)據(jù)后就停止了后續(xù)通道數(shù)據(jù)會丟失或覆蓋。內(nèi)存緩沖區(qū)對齊確保為每個ADC分配的緩沖區(qū)大小足夠容納一次完整掃描的所有數(shù)據(jù)。如果ADC0有2個通道DMA設(shè)置為傳輸2個半字那么緩沖區(qū)至少需要uint16_t buf[2]。數(shù)據(jù)對齊方式ADC數(shù)據(jù)可能是左對齊或右對齊。GD32H75E通常是右對齊。DMA搬運(yùn)時目標(biāo)內(nèi)存是uint16_t類型直接存儲即可。但在進(jìn)行數(shù)值計算時如果需要完整的12位數(shù)據(jù)可能需要將讀取的16位數(shù)右移4位如果結(jié)果是左對齊格式則需查手冊確認(rèn)。雙緩沖區(qū)指針管理在DMA中斷中切換緩沖區(qū)指針時務(wù)必確保操作是原子的或者中斷優(yōu)先級足夠高不會被其他中斷打斷防止指針在切換過程中被主程序訪問導(dǎo)致數(shù)據(jù)錯亂。使用volatile關(guān)鍵字聲明緩沖區(qū)指針和標(biāo)志位是必須的。調(diào)試時可以先將過采樣倍數(shù)設(shè)為1即關(guān)閉過采樣用較低的采樣率在DMA完成中斷里通過串口打印出原始數(shù)據(jù)人工檢查每個通道的數(shù)據(jù)是否按預(yù)期順序出現(xiàn)數(shù)值是否合理。這是驗證ADC基礎(chǔ)配置和DMA鏈路是否正常的最直接方法。

相關(guān)新聞

Design Compiler:邏輯庫名與邏輯庫文件名及其指定方式

Design Compiler:邏輯庫名與邏輯庫文件名及其指定方式

相關(guān)閱讀 Design Compilerhttps://blog.csdn.net/weixin_45791458/category_12738116.html?spm1001.2014.3001.5482 邏輯庫的定義 邏輯庫由半導(dǎo)體供應(yīng)商維護(hù)和分發(fā),包含每個單元的特性和功能信息,例如單元名稱、引腳名稱、面積、時序弧和引腳負(fù)載。它們…

2026/8/1 22:53:56 閱讀更多
GeoServer跨域CORS插件安裝與配置全攻略:從原理到安全實踐

GeoServer跨域CORS插件安裝與配置全攻略:從原理到安全實踐

1. 項目緣起:為什么GeoServer的跨域設(shè)置是個“老大難”問題? 如果你和我一樣,長期在WebGIS領(lǐng)域摸爬滾打,那么對“跨域”這兩個字一定又愛又恨。愛的是,它代表了現(xiàn)代Web應(yīng)用靈活、開放的特性;恨的是&#x…

2026/8/2 4:44:56 閱讀更多
不是所有人都能看到所有數(shù)據(jù):理解企業(yè)權(quán)限模型

不是所有人都能看到所有數(shù)據(jù):理解企業(yè)權(quán)限模型

從客戶管理案例出發(fā),拆開角色、數(shù)據(jù)范圍、字段權(quán)限和操作權(quán)限 上一篇,我們把客戶表和跟進(jìn)記錄做成了銷售儀表盤。儀表盤讓管理者能看到客戶總數(shù)、階段分布、來源分布和待跟進(jìn)明細(xì)。系統(tǒng)變得更有用了,但也馬上帶來一個更現(xiàn)實的問題&#xff1a…

2026/8/2 4:44:56 閱讀更多
Linux密碼安全深度解析:從/etc/shadow到SHA512破解與防御實戰(zhàn)

Linux密碼安全深度解析:從/etc/shadow到SHA512破解與防御實戰(zhàn)

1. 項目概述:從一份文件到安全意識的覺醒在Linux系統(tǒng)管理的日常工作中,/etc/shadow文件就像一座守護(hù)用戶密碼的堡壘,它安靜地躺在/etc目錄下,卻承載著整個系統(tǒng)訪問控制的核心秘密。這個項目標(biāo)題——“l(fā)inux 密碼文件 /etc/shadow&…

2026/8/2 4:34:42 閱讀更多
3分鐘搞定!QQ空間歷史說說完整備份終極指南

3分鐘搞定!QQ空間歷史說說完整備份終極指南

3分鐘搞定!QQ空間歷史說說完整備份終極指南 【免費(fèi)下載鏈接】GetQzonehistory 獲取QQ空間發(fā)布的歷史說說 項目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾想過,那些年發(fā)過的QQ空間說說,那些記錄青春的文字…

2026/8/2 0:04:01 閱讀更多
3分鐘搞定!QQ空間歷史說說完整備份終極指南

3分鐘搞定!QQ空間歷史說說完整備份終極指南

3分鐘搞定!QQ空間歷史說說完整備份終極指南 【免費(fèi)下載鏈接】GetQzonehistory 獲取QQ空間發(fā)布的歷史說說 項目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾想過,那些年發(fā)過的QQ空間說說,那些記錄青春的文字…

2026/8/2 0:04:01 閱讀更多
AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O分配PCB板是應(yīng)用材料(Applied Materials)公司生產(chǎn)的一款用于半導(dǎo)體設(shè)備的I/O信號分配電路板。該型號(0100-02186)的核心特點(diǎn)如下:專用于Endura等半導(dǎo)體工藝腔室。集成信號路由與分配功能。連接控制…

2026/8/2 2:51:21 閱讀更多
Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動機(jī)是日本日清(Nissei)品牌的一款工業(yè)用三相異步電機(jī),適用于自動化設(shè)備及通用機(jī)械驅(qū)動。該型號(FFMN-32L-10-T0 40AX)的核心特點(diǎn)如下:三相交流異步電動機(jī)。額定…

2026/8/2 2:52:49 閱讀更多