實(shí)戰(zhàn):溫度傳感器、DAC與OPA的配置與避坑指南)
1. 項(xiàng)目概述深入解讀CH32F20x系列MCU的模擬外設(shè)最近在做一個(gè)需要高精度溫度采集和模擬信號(hào)調(diào)理的項(xiàng)目選型時(shí)把目光投向了國產(chǎn)的CH32F20x系列MCU。這個(gè)系列尤其是CH32F205/207/203這幾款以其高性價(jià)比和豐富的外設(shè)資源在圈內(nèi)口碑不錯(cuò)。但說實(shí)話剛開始看數(shù)據(jù)手冊(cè)時(shí)關(guān)于其內(nèi)置溫度傳感器、DAC數(shù)模轉(zhuǎn)換器和OPA運(yùn)算放大器這部分總覺得有些細(xì)節(jié)沒說透比如溫度傳感器的精度到底受什么影響、DAC輸出如何穩(wěn)定、OPA怎么配置才能發(fā)揮最佳性能。網(wǎng)上的資料要么太零散要么就是直接照著手冊(cè)念對(duì)于實(shí)際開發(fā)中可能遇到的坑提得很少。我花了不少時(shí)間結(jié)合數(shù)據(jù)手冊(cè)、勘誤文檔以及自己的實(shí)測把這幾個(gè)模擬外設(shè)的特性、工作原理、配置方法和避坑要點(diǎn)都梳理了一遍。這篇文章就是這些經(jīng)驗(yàn)的總結(jié)目標(biāo)很明確讓你在用到CH32F20x的模擬功能時(shí)能快速上手少走彎路。無論你是正在評(píng)估這顆芯片還是已經(jīng)用上了但在調(diào)試中遇到了問題相信下面的內(nèi)容都能給你提供直接的幫助。2. 核心外設(shè)深度解析與設(shè)計(jì)考量CH32F20x系列作為一款主打高性能和集成度的MCU其模擬外設(shè)的設(shè)計(jì)意圖是讓用戶在單芯片上完成信號(hào)采集、處理和輸出的閉環(huán)減少外部元件降低系統(tǒng)成本和PCB面積。理解每個(gè)外設(shè)的設(shè)計(jì)邏輯是正確使用它們的前提。2.1 溫度傳感器不僅僅是“有”這個(gè)功能很多MCU都宣稱內(nèi)置溫度傳感器但CH32F20x的這顆需要你特別關(guān)注其“測量方法”而非“絕對(duì)精度”。數(shù)據(jù)手冊(cè)會(huì)給出一個(gè)典型值比如±1.5°C但這個(gè)精度是在特定條件下例如特定的VREF、特定的采樣時(shí)間、特定的環(huán)境校準(zhǔn)出來的。它的核心價(jià)值在于測量芯片結(jié)溫的相對(duì)變化而不是提供一個(gè)實(shí)驗(yàn)室級(jí)別的絕對(duì)溫度值。它的工作原理是利用半導(dǎo)體PN結(jié)的正向壓降與溫度的線性關(guān)系。在芯片內(nèi)部一個(gè)特殊的PN結(jié)被用作傳感元件其電壓V_BE會(huì)隨溫度變化。內(nèi)部電路將這個(gè)電壓通過一個(gè)模擬開關(guān)連接到ADC的輸入通道通常是ADC_IN16或ADC_IN17具體需查對(duì)應(yīng)型號(hào)的數(shù)據(jù)手冊(cè)。因此溫度測量本質(zhì)上是一次ADC轉(zhuǎn)換。這意味著測量結(jié)果的質(zhì)量直接受到ADC參考電壓穩(wěn)定性、采樣時(shí)間、電源噪聲乃至軟件濾波算法的影響。在設(shè)計(jì)上它最適合的應(yīng)用場景包括系統(tǒng)過熱保護(hù)監(jiān)控MCU自身溫度在結(jié)溫超過安全閾值如85°C或105°C時(shí)觸發(fā)降頻、關(guān)閉外設(shè)或報(bào)警。環(huán)境溫度趨勢監(jiān)測在設(shè)備內(nèi)部如果MCU與環(huán)境熱耦合較好可以用它來近似反映環(huán)境溫度的變化趨勢用于風(fēng)扇調(diào)速等。校準(zhǔn)其他傳感器作為輔助參考對(duì)其他溫度傳感器如熱敏電阻的讀數(shù)進(jìn)行粗略的補(bǔ)償。注意切勿將其用于需要高精度絕對(duì)溫度測量的場合如恒溫控制、醫(yī)療測溫等。它的主要誤差來源包括出廠校準(zhǔn)偏差、ADC的積分非線性INL、差分非線性DNL誤差以及電源電壓波動(dòng)對(duì)VREF的影響。2.2 DAC雙通道的靈活輸出引擎CH32F20x集成了兩個(gè)12位分辨率的DAC通道這算是中高端MCU的標(biāo)配。但它的亮點(diǎn)在于輸出模式的靈活性和與內(nèi)部其他模塊的聯(lián)動(dòng)能力。每個(gè)DAC通道都可以獨(dú)立配置為多種工作模式理解這些模式的區(qū)別是高效使用的關(guān)鍵。輸出模式解析正常模式DAC輸出由寫入數(shù)據(jù)保持寄存器DHRx的值直接決定。這是最常用的模式用于產(chǎn)生靜態(tài)電壓或由軟件緩慢更新的電壓信號(hào)。噪聲生成模式DAC輸出由一個(gè)偽隨機(jī)數(shù)生成器線性反饋移位寄存器LFSR控制。你可以設(shè)置LFSR的掩碼來改變?cè)肼暤念l譜特性。這個(gè)模式常用于測試系統(tǒng)的噪聲抑制能力或者生成特定的白噪聲信號(hào)。三角波生成模式DAC輸出會(huì)在用戶定義幅值通過設(shè)置MAMPx位內(nèi)自動(dòng)遞增/遞減生成三角波。這個(gè)模式完全由硬件完成不占用CPU資源非常適合生成周期性的掃描信號(hào)例如用于傳感器特性曲線掃描。關(guān)鍵設(shè)計(jì)考量參考電壓選擇DAC的輸出范圍取決于其參考電壓VREF。CH32F20x的DAC通常與ADC共享VREF引腳。你可以選擇內(nèi)部參考電壓如果芯片提供通常精度一般或者連接一個(gè)高精度、低溫漂的外部基準(zhǔn)源如REF3025。這是決定DAC輸出絕對(duì)精度的最關(guān)鍵因素。輸出緩沖器DAC輸出端集成了可開關(guān)的輸出緩沖放大器。開啟緩沖器后DAC具有更強(qiáng)的帶負(fù)載能力可驅(qū)動(dòng)容性負(fù)載但會(huì)引入一定的偏移誤差和非線性。關(guān)閉緩沖器則能獲得更好的直流精度和線性度但驅(qū)動(dòng)能力很弱只能接高阻抗負(fù)載如運(yùn)放的同相輸入端。我的經(jīng)驗(yàn)是如果后級(jí)是運(yùn)放電路通常關(guān)閉緩沖器如果直接驅(qū)動(dòng)負(fù)載則必須開啟。與DMA、定時(shí)器的聯(lián)動(dòng)DAC支持通過DMA自動(dòng)更新輸出數(shù)據(jù)。你可以將一段波形數(shù)據(jù)如正弦波表存放在內(nèi)存中由定時(shí)器觸發(fā)DMA傳輸?shù)紻AC從而高效地生成任意復(fù)雜波形。這是實(shí)現(xiàn)高質(zhì)量信號(hào)發(fā)生器的核心。2.3 OPA片內(nèi)信號(hào)調(diào)理的瑞士軍刀集成OPA是CH32F20x系列一個(gè)非常實(shí)用的特性。它把信號(hào)調(diào)理電路從外部搬到了芯片內(nèi)部不僅節(jié)省了空間和成本還減少了因PCB布局和外部元件離散性引入的噪聲和誤差。這個(gè)片內(nèi)OPA通常被設(shè)計(jì)為通用運(yùn)算放大器支持多種經(jīng)典電路配置電壓跟隨器用于阻抗匹配將高阻抗信號(hào)源轉(zhuǎn)換為低阻抗輸出。同相/反相放大器對(duì)模擬信號(hào)進(jìn)行固定增益的放大或衰減。差分放大器配合內(nèi)部多路復(fù)用器可以用于測量差分信號(hào)抑制共模噪聲。濾波器通過外部連接電阻和電容可以構(gòu)成有源低通、高通或帶通濾波器。在實(shí)際項(xiàng)目中的應(yīng)用優(yōu)勢直接連接傳感器例如可以直接將熱電偶、橋式壓力傳感器的微小差分輸出連接到OPA的輸入端進(jìn)行第一級(jí)放大再送入ADC極大地簡化了前端電路。DAC輸出緩沖與調(diào)理雖然DAC自帶緩沖器但有時(shí)需要額外的增益或電平移位。可以用OPA來緩沖和調(diào)理DAC的輸出信號(hào)形成完整的可編程模擬輸出通道。降低系統(tǒng)噪聲由于OPA在芯片內(nèi)部其與ADC、DAC之間的信號(hào)路徑極短受外部電磁干擾EMI的影響遠(yuǎn)小于使用外部運(yùn)放。實(shí)操心得片內(nèi)OPA的性能參數(shù)如增益帶寬積、壓擺率、輸入失調(diào)電壓通常不如頂級(jí)的外部獨(dú)立運(yùn)放。數(shù)據(jù)手冊(cè)會(huì)給出典型值。在設(shè)計(jì)中務(wù)必根據(jù)你的信號(hào)頻率、精度要求來評(píng)估其是否滿足需求。對(duì)于直流或低頻高精度應(yīng)用需要注意其輸入失調(diào)電壓和溫漂對(duì)于高速信號(hào)則需要關(guān)注其壓擺率和帶寬。3. 外設(shè)配置與協(xié)同工作實(shí)戰(zhàn)理解了單個(gè)外設(shè)的特性后如何讓它們協(xié)同工作完成一個(gè)具體的任務(wù)才是工程實(shí)現(xiàn)的關(guān)鍵。下面我們以一個(gè)典型的應(yīng)用場景為例“使用內(nèi)部溫度傳感器監(jiān)測芯片溫度并通過DAC輸出一個(gè)與溫度成比例的電壓同時(shí)用OPA對(duì)這個(gè)電壓進(jìn)行緩沖放大”。3.1 硬件連接與初始化順序假設(shè)我們使用CH32F207并選擇內(nèi)部VREF作為ADC和DAC的參考電壓。電源與參考電壓確保VREF引腳連接了足夠的去耦電容通常是一個(gè)10uF的鉭電容并聯(lián)一個(gè)100nF的陶瓷電容并且電源穩(wěn)定。這是所有模擬電路精度的基礎(chǔ)。ADC初始化用于溫度傳感器使能ADC和GPIO時(shí)鐘溫度傳感器通道對(duì)應(yīng)的GPIO雖然信號(hào)在內(nèi)部但相關(guān)ADC模塊時(shí)鐘需開啟。配置ADC為獨(dú)立模式設(shè)置分辨率12位、數(shù)據(jù)對(duì)齊方式右對(duì)齊。設(shè)置采樣時(shí)間。對(duì)于溫度傳感器這類高內(nèi)阻信號(hào)源必須延長采樣時(shí)間建議設(shè)置為ADC采樣周期中允許的最大值例如239.5個(gè)周期讓采樣電容充分充電這是提高測量穩(wěn)定性的最重要一步。校準(zhǔn)ADC先執(zhí)行上電校準(zhǔn)如果有的話。選擇溫度傳感器對(duì)應(yīng)的ADC輸入通道如ADC_IN16。DAC初始化使能DAC和對(duì)應(yīng)GPIO端口時(shí)鐘DAC_OUT1/2對(duì)應(yīng)的PA4/PA5。配置GPIO為模擬模式非常重要避免數(shù)字信號(hào)干擾。配置DAC通道例如通道1。選擇觸發(fā)源如果使用軟件觸發(fā)則選擇“軟件觸發(fā)”。設(shè)置輸出緩沖器狀態(tài)根據(jù)負(fù)載決定開或關(guān)。使能DAC通道。如果需要使能DAC的DMA功能并配置DMA通道。OPA初始化使能OPA時(shí)鐘。配置OPA的工作模式。例如配置為跟隨器模式或同相放大器模式。這通常通過配置OPA的控制寄存器完成包括選擇同相輸入源來自內(nèi)部多路選擇器或外部引腳、反相輸入連接方式內(nèi)部反饋或外部引腳等。連接外部反饋網(wǎng)絡(luò)如果需要。對(duì)于同相放大器需要在OPA輸出引腳和反相輸入引腳之間連接電阻同時(shí)在反相輸入和地之間連接另一個(gè)電阻。這些電阻需要焊接在PCB上。使能OPA。初始化順序建議先初始化ADC和DAC最后初始化OPA。因?yàn)镺PA可能依賴于前級(jí)信號(hào)如DAC輸出已經(jīng)穩(wěn)定。3.2 溫度讀取與DAC輸出聯(lián)動(dòng)代碼示例以下是基于HAL庫或類似固件庫的核心代碼邏輯框架// 1. 讀取溫度傳感器ADC值 uint16_t Read_TemperatureSensor(void) { ADC_ChannelConfTypeDef sConfig {0}; uint16_t raw_adc_value 0; // 選擇溫度傳感器通道 sConfig.Channel ADC_CHANNEL_16; // 根據(jù)實(shí)際型號(hào)調(diào)整 sConfig.Rank 1; sConfig.SamplingTime ADC_SAMPLETIME_239CYCLES_5; // 使用長采樣時(shí)間 if (HAL_ADC_ConfigChannel(hadc1, sConfig) ! HAL_OK) { Error_Handler(); } HAL_ADC_Start(hadc1); if (HAL_ADC_PollForConversion(hadc1, 10) HAL_OK) { raw_adc_value HAL_ADC_GetValue(hadc1); } HAL_ADC_Stop(hadc1); return raw_adc_value; } // 2. 將ADC值轉(zhuǎn)換為溫度近似計(jì)算需根據(jù)手冊(cè)公式校準(zhǔn) float Convert_ADC_to_Temperature(uint16_t adc_value, float vref_mv) { // 公式參考數(shù)據(jù)手冊(cè)Vsense (ADC_VALUE * VREF) / 4095 // 溫度 T (Vsense - V25) / Avg_Slope 25 // 其中 V25 是25°C時(shí)的傳感器電壓Avg_Slope是平均斜率mV/°C // 這些參數(shù)在數(shù)據(jù)手冊(cè)的電氣特性章節(jié)可以找到典型值例如 // V25 1.43V, Avg_Slope 4.3 mV/°C 這些值必須用你手中的芯片實(shí)測校準(zhǔn) const float V25 1.43f; const float Avg_Slope 0.0043f; // 單位 V/°C float vsense (adc_value * vref_mv / 1000.0f) / 4095.0f; float temperature (vsense - V25) / Avg_Slope 25.0f; return temperature; } // 3. 根據(jù)溫度設(shè)置DAC輸出例如溫度每升高1°CDAC輸出增加10mV void Set_DAC_By_Temperature(float temperature) { // 設(shè)計(jì)輸出關(guān)系Vout (Temperature - 20.0) * 0.01 1.0 (V) // 假設(shè)VREF 3.3V DAC為12位 float target_voltage (temperature - 20.0f) * 0.01f 1.0f; // 限制電壓在0-VREF之間 if (target_voltage 0) target_voltage 0; if (target_voltage 3.3f) target_voltage 3.3f; // 計(jì)算DAC數(shù)值 uint16_t dac_value (uint16_t)((target_voltage / 3.3f) * 4095.0f); // 寫入DAC數(shù)據(jù)保持寄存器 HAL_DAC_SetValue(hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, dac_value); // 如果需要軟件觸發(fā)更新如果配置為軟件觸發(fā)模式 // HAL_DAC_Start(hdac, DAC_CHANNEL_1); } // 主循環(huán)中的調(diào)用示例 float vref_internal 3.3f; // 假設(shè)使用內(nèi)部3.3V參考實(shí)際需測量或使用更準(zhǔn)的基準(zhǔn) while (1) { uint16_t adc_val Read_TemperatureSensor(); float temp Convert_ADC_to_Temperature(adc_val, vref_internal); Set_DAC_By_Temperature(temp); HAL_Delay(1000); // 每秒更新一次 }3.3 OPA作為DAC緩沖器的配置要點(diǎn)在上面的例子中DAC的輸出可能驅(qū)動(dòng)能力不足或需要隔離。我們可以配置片內(nèi)OPA為電壓跟隨器連接在DAC輸出和最終負(fù)載之間。硬件連接在PCB設(shè)計(jì)時(shí)將DAC的輸出引腳如PA4連接到OPA的同相輸入端引腳OPAx_INP將OPA的輸出引腳OPAx_OUT連接到負(fù)載。同時(shí)將OPA的輸出引腳通過一根短線連接到其反相輸入端引腳OPAx_INN這樣就構(gòu)成了電壓跟隨器。軟件配置// 配置OPA為跟隨器模式 OPA_HandleTypeDef hopa; hopa.Instance OPA1; // 使用OPA1實(shí)例 hopa.Init.Mode OPA_MODE_FOLLOWER; // 跟隨器模式 hopa.Init.PowerSupplyRange OPA_POWERSUPPLY_LOW; // 根據(jù)電源選擇 hopa.Init.PowerMode OPA_POWERMODE_NORMAL; // ... 其他參數(shù) if (HAL_OPA_Init(hopa) ! HAL_OK) { Error_Handler(); } HAL_OPA_Start(hopa); // 啟動(dòng)OPA效果此時(shí)OPA的輸出電壓將緊緊跟隨DAC的輸出電壓但提供了極低的輸出阻抗可以驅(qū)動(dòng)更大的容性負(fù)載或電阻負(fù)載而不會(huì)影響DAC本身的精度。4. 精度提升技巧與常見問題排查即使按照手冊(cè)配置在實(shí)際電路中也可能無法達(dá)到理想的性能。下面分享一些提升精度和穩(wěn)定性的實(shí)戰(zhàn)技巧以及常見問題的排查思路。4.1 溫度傳感器讀數(shù)跳變大怎么辦這是最常見的問題。現(xiàn)象是連續(xù)讀取的溫度ADC值波動(dòng)很大換算后的溫度上下跳動(dòng)好幾度。排查步驟1檢查電源和地。用示波器探頭設(shè)置為交流耦合觀察MCU的VDD和VSS引腳看是否有高頻噪聲。模擬電路的精度直接依賴于電源的純凈度。確保電源電路有足夠的濾波電容并且PCB布局上模擬電源部分采用了星型接地或單點(diǎn)接地遠(yuǎn)離數(shù)字電源的噪聲源。排查步驟2優(yōu)化ADC采樣時(shí)間。如3.1節(jié)所述務(wù)必增加采樣時(shí)間。溫度傳感器內(nèi)部等效電阻較大采樣電容充電慢。將采樣時(shí)間設(shè)置為最大值能顯著改善。排查步驟3軟件濾波。硬件穩(wěn)定后在軟件端實(shí)施濾波算法。最簡單的就是滑動(dòng)平均濾波。連續(xù)采樣N次比如16次或32次然后取平均值。更高級(jí)的可以用一階低通數(shù)字濾波器。#define FILTER_LEN 16 uint16_t adc_filter_buffer[FILTER_LEN] {0}; uint8_t filter_index 0; uint32_t adc_sum 0; // 在讀取ADC的函數(shù)中 raw_adc_value HAL_ADC_GetValue(hadc1); adc_sum - adc_filter_buffer[filter_index]; // 減去最舊的值 adc_filter_buffer[filter_index] raw_adc_value; // 存入新值 adc_sum raw_adc_value; filter_index (filter_index 1) % FILTER_LEN; uint16_t filtered_adc_value adc_sum / FILTER_LEN; // 計(jì)算平均值排查步驟4參考電壓穩(wěn)定性。如果使用VDDA作為VREF其噪聲會(huì)直接引入測量誤差。考慮使用獨(dú)立、安靜的外部基準(zhǔn)源如REF3033為VREF引腳供電。4.2 DAC輸出有毛刺或噪聲DAC輸出在代碼更新數(shù)值時(shí)出現(xiàn)尖峰或者本應(yīng)穩(wěn)定的直流輸出上有高頻噪聲。毛刺問題這通常發(fā)生在DAC數(shù)據(jù)更新時(shí)刻稱為“更新毛刺Update Glitch”。解決方案是啟用DAC的輸出緩沖器。緩沖器內(nèi)部的放大器可以抑制這種毛刺。如果緩沖器已經(jīng)開啟但仍有毛刺可以在DAC輸出端對(duì)地加一個(gè)小電容如100pF進(jìn)行濾波但注意電容過大會(huì)影響響應(yīng)速度。高頻噪聲問題檢查電源同樣用示波器看VREF和VDDA的噪聲。檢查PCB布局DAC輸出走線是否過長是否靠近時(shí)鐘線、高速數(shù)據(jù)線等噪聲源理想情況下DAC輸出應(yīng)使用短的走線直接連接到負(fù)載或OPA輸入端并用地線包圍進(jìn)行屏蔽。使用OPA緩沖如3.3節(jié)所述使用片內(nèi)OPA作為跟隨器可以有效隔離后端負(fù)載變化對(duì)DAC芯片內(nèi)部的影響。硬件濾波在DAC輸出端添加一個(gè)RC低通濾波器。例如一個(gè)1kΩ電阻串聯(lián)在輸出通路上后接一個(gè)100nF電容到地。這能濾除高頻噪聲但會(huì)降低帶寬。4.3 OPA輸出異常飽和、振蕩或精度差輸出飽和始終為高電平或低電平檢查供電確認(rèn)OPA的供電電壓是否正常且滿足信號(hào)擺幅要求。輸入信號(hào)電壓是否在OPA的共模輸入電壓范圍之內(nèi)輸出信號(hào)是否超出了電源軌檢查反饋網(wǎng)絡(luò)如果是放大器配置檢查連接在OPA輸出和反相輸入端之間的反饋電阻是否焊接良好阻值是否正確。開路的反饋會(huì)導(dǎo)致運(yùn)放開環(huán)增益極大極易飽和。輸出振蕩高頻自激這是運(yùn)放電路的典型問題。片內(nèi)OPA的相位裕度可能不高當(dāng)驅(qū)動(dòng)容性負(fù)載時(shí)容易振蕩。解決方案在OPA輸出端串聯(lián)一個(gè)小的電阻如10-100Ω再連接到容性負(fù)載。這個(gè)電阻與負(fù)載電容構(gòu)成了一個(gè)極點(diǎn)有助于穩(wěn)定系統(tǒng)。檢查PCB布局反饋?zhàn)呔€是否過長應(yīng)盡可能短而直。直流精度差輸出有固定偏差輸入失調(diào)電壓Vos這是集成運(yùn)放的固有缺陷。對(duì)于直流放大應(yīng)用這個(gè)誤差會(huì)被放大。數(shù)據(jù)手冊(cè)會(huì)給出最大失調(diào)電壓。如果誤差超出可接受范圍有幾種辦法一是在軟件中進(jìn)行校準(zhǔn)測量零點(diǎn)輸出并減去二是如果芯片支持查找是否有內(nèi)部失調(diào)電壓校準(zhǔn)寄存器部分MCU的OPA提供此功能三是對(duì)于要求極高的應(yīng)用可能需要考慮使用外部低失調(diào)運(yùn)放。4.4 校準(zhǔn)讓數(shù)據(jù)更可信對(duì)于精度要求稍高的應(yīng)用軟件校準(zhǔn)是必不可少的步驟。溫度傳感器校準(zhǔn)單點(diǎn)校準(zhǔn)在已知的、穩(wěn)定的環(huán)境溫度T_known例如25°C的恒溫箱下讀取此時(shí)的ADC值A(chǔ)DC_known。則溫度計(jì)算公式可修正為T (ADC_raw - ADC_known) / Slope T_known。其中Slope可以使用手冊(cè)典型值或通過兩點(diǎn)校準(zhǔn)求得。兩點(diǎn)校準(zhǔn)在溫度T1和T2下T1和T2相差盡量大分別讀取ADC1和ADC2。計(jì)算斜率Slope (T2 - T1) / (ADC2 - ADC1)。然后將斜率和其中一個(gè)點(diǎn)代入公式。兩點(diǎn)校準(zhǔn)能同時(shí)修正斜率和偏移誤差效果更好。DAC輸出校準(zhǔn)使用一個(gè)高精度的數(shù)字萬用表測量DAC在幾個(gè)關(guān)鍵代碼值如0 2048 4095下的實(shí)際輸出電壓。記錄測量值與理論值比較。可以在軟件中建立一個(gè)查找表LUT或擬合一個(gè)線性/多項(xiàng)式校正函數(shù)在輸出前對(duì)DAC代碼進(jìn)行補(bǔ)償。系統(tǒng)級(jí)校準(zhǔn)如果DACOPA作為一個(gè)模擬輸出通道可以將最終輸出連接回ADC的另一個(gè)輸入通道構(gòu)成一個(gè)自校準(zhǔn)環(huán)路。MCU控制DAC輸出一個(gè)已知電壓然后用ADC讀回來計(jì)算出整個(gè)鏈路的增益和偏移誤差并在軟件中補(bǔ)償。這種方法可以實(shí)現(xiàn)閉環(huán)校準(zhǔn)精度最高。5. 進(jìn)階應(yīng)用與性能壓測當(dāng)你掌握了基礎(chǔ)功能后可以嘗試一些更復(fù)雜的應(yīng)用并測試這些模擬外設(shè)的性能邊界。5.1 構(gòu)建一個(gè)簡易的波形發(fā)生器利用DAC的DMA定時(shí)器觸發(fā)模式可以輕松實(shí)現(xiàn)波形發(fā)生器。生成波形表在PC上或用MCU計(jì)算一個(gè)周期的波形數(shù)據(jù)如正弦波、三角波、方波存入數(shù)組。對(duì)于12位DAC數(shù)組元素為uint16_t類型。#define WAVE_TABLE_SIZE 256 uint16_t sine_wave[WAVE_TABLE_SIZE]; for (int i 0; i WAVE_TABLE_SIZE; i) { sine_wave[i] (uint16_t)(2048 * (1.0 sin(2 * PI * i / WAVE_TABLE_SIZE))); // 輸出范圍 0-3.3V }配置DMA將DMA配置為從內(nèi)存波形數(shù)組到外設(shè)DAC數(shù)據(jù)寄存器的循環(huán)傳輸模式。配置定時(shí)器選擇一個(gè)定時(shí)器如TIM6作為觸發(fā)源。定時(shí)器的更新頻率決定了波形輸出的頻率。輸出頻率 定時(shí)器觸發(fā)頻率 / 波形表長度。配置DAC將DAC觸發(fā)源設(shè)置為該定時(shí)器。使能DAC的DMA請(qǐng)求。啟動(dòng)啟動(dòng)DMA啟動(dòng)定時(shí)器。此時(shí)DAC就會(huì)以設(shè)定的頻率自動(dòng)、循環(huán)地輸出波形表中的數(shù)據(jù)CPU完全被解放。性能考量輸出波形的最高頻率受限于DAC的建立時(shí)間、DMA傳輸速度和定時(shí)器頻率。對(duì)于CH32F20x在72MHz系統(tǒng)時(shí)鐘下輸出幾十kHz的正弦波是可行的。要輸出更高頻率需要減少波形表點(diǎn)數(shù)但這會(huì)降低波形質(zhì)量。5.2 使用OPA和ADC實(shí)現(xiàn)高精度差分測量假設(shè)要測量一個(gè)橋式傳感器的差分輸出mV級(jí)。配置OPA為差分放大器將傳感器的正端接OPA同相輸入OPAx_INP負(fù)端接OPA反相輸入OPAx_INN。通過外部電阻網(wǎng)絡(luò)設(shè)置OPA的增益。例如選擇Rf100kΩ Rg10kΩ則增益G 1 Rf/Rg 11。在軟件中配置OPA為外部反饋模式并選擇正確的輸入通道。連接ADC將OPA的輸出連接到ADC的一個(gè)輸入通道。軟件處理首先在傳感器無負(fù)載或已知負(fù)載時(shí)讀取一個(gè)ADC值作為“零位”基準(zhǔn)。然后在測量時(shí)讀取新的ADC值減去零位基準(zhǔn)再根據(jù)ADC參考電壓和OPA的增益換算成實(shí)際的傳感器電壓差。注意必須考慮OPA的輸入失調(diào)電壓和溫漂。對(duì)于高精度測量需要進(jìn)行系統(tǒng)校準(zhǔn)在差分輸入端施加幾個(gè)已知的精確電壓如0V 1mV 2mV記錄ADC輸出建立校準(zhǔn)曲線。5.3 極限性能測試與數(shù)據(jù)手冊(cè)參數(shù)驗(yàn)證你可以設(shè)計(jì)一些簡單的測試來驗(yàn)證芯片是否達(dá)到數(shù)據(jù)手冊(cè)標(biāo)稱的性能DAC的INL/DNL測試編寫一個(gè)程序讓DAC從0到4095步進(jìn)輸出每一個(gè)碼值。用一個(gè)高精度至少16位的ADC板卡或另一臺(tái)高精度萬用表測量每個(gè)碼值對(duì)應(yīng)的實(shí)際電壓。將測量數(shù)據(jù)導(dǎo)入電腦用軟件計(jì)算積分非線性INL和差分非線性DNL。這能直觀地看到DAC的線性度。OPA的增益帶寬積測試將OPA配置為固定增益如10倍的同相放大器。輸入一個(gè)固定幅度如100mVpp的正弦小信號(hào)用信號(hào)發(fā)生器和示波器配合逐漸增加輸入信號(hào)頻率觀察輸出信號(hào)幅度下降到-3dB即幅度變?yōu)樵瓉淼?.707倍時(shí)的頻率。這個(gè)頻率點(diǎn)大約就是該增益下的帶寬。可以驗(yàn)證其是否與手冊(cè)中的增益帶寬積參數(shù)相符GBW 增益 * 帶寬。溫度傳感器的長期穩(wěn)定性測試將芯片置于恒溫環(huán)境中如25°C恒溫箱連續(xù)讀取溫度傳感器ADC值數(shù)小時(shí)甚至數(shù)天觀察其波動(dòng)范圍。這可以評(píng)估傳感器和ADC的噪聲水平。通過這些深入的測試和應(yīng)用你不僅能更好地使用CH32F20x的模擬外設(shè)還能對(duì)其真實(shí)性能有更準(zhǔn)確的把握從而在未來的產(chǎn)品設(shè)計(jì)中做出更可靠的決策。記住數(shù)據(jù)手冊(cè)給出的是典型值或最大值實(shí)際性能因芯片個(gè)體、供電、PCB布局和溫度而異動(dòng)手測試永遠(yuǎn)是工程師最可靠的工具。