動(dòng)全解析:從時(shí)序配置到波形輸出實(shí)戰(zhàn))
1. 項(xiàng)目概述從數(shù)字到模擬的橋梁搭建搞嵌入式開發(fā)或者信號(hào)處理的朋友對(duì)DAC數(shù)模轉(zhuǎn)換器肯定不陌生。但很多時(shí)候我們可能只是調(diào)用一個(gè)庫(kù)函數(shù)比如DAC_SetChannel1Data(DAC_Align_12b_R, value)然后就能在示波器上看到電壓變化了。這背后特別是當(dāng)DAC通過(guò)SPI總線與主控芯片通信時(shí)到底發(fā)生了什么寄存器是怎么配置的時(shí)序如何保證輸出電壓和發(fā)送的數(shù)值到底是什么關(guān)系這些問(wèn)題恰恰是理解一個(gè)系統(tǒng)底層運(yùn)作的關(guān)鍵。這次我們就以“SPI總線輸出電壓值”這個(gè)實(shí)驗(yàn)為切入點(diǎn)親手“扒開”數(shù)模轉(zhuǎn)換的黑盒子。這個(gè)實(shí)驗(yàn)的核心目的不僅僅是讓一個(gè)DAC芯片輸出一個(gè)電壓那么簡(jiǎn)單而是要徹底搞懂基于SPI接口的DAC芯片例如TI的DAC7311、ADI的AD5320等的完整驅(qū)動(dòng)流程。從SPI的初始化、時(shí)序波形分析到DAC數(shù)據(jù)格式的組成、內(nèi)部寄存器的配置再到最終輸出電壓的計(jì)算與驗(yàn)證形成一個(gè)閉環(huán)。這對(duì)于理解任何通過(guò)數(shù)字總線控制的模擬器件都具有普適的參考價(jià)值。無(wú)論你是正在學(xué)習(xí)DSP或單片機(jī)課程的學(xué)生還是工作中需要驅(qū)動(dòng)一款新DAC的工程師這個(gè)實(shí)驗(yàn)所涉及的思路和調(diào)試方法都能讓你擺脫對(duì)現(xiàn)有驅(qū)動(dòng)庫(kù)的依賴獲得從零開始駕馭一顆芯片的能力。接下來(lái)我們就從芯片選型和電路連接開始一步步拆解這個(gè)過(guò)程。2. 核心硬件與原理剖析2.1 DAC芯片選型與SPI接口本質(zhì)市面上常見的單通道、低功耗、電壓輸出型DAC很多都采用SPI接口因?yàn)樗泳€簡(jiǎn)單通常3-4根線速率也能滿足大多數(shù)應(yīng)用。我們以一款典型的12位DACDAC7311為例來(lái)講解。它的關(guān)鍵參數(shù)是12位分辨率供電電壓2.7V至5.5V輸出范圍0V至Vref內(nèi)部或外部參考電壓。為什么是SPISPISerial Peripheral Interface是一種全雙工、同步的串行通信協(xié)議。它的核心在于“主從”模式和“時(shí)鐘同步”。主設(shè)備我們的DSP或MCU產(chǎn)生時(shí)鐘信號(hào)SCLK從設(shè)備DAC芯片在時(shí)鐘邊沿的指揮下一位一位地接收或發(fā)送數(shù)據(jù)。除了SCLK還有兩根關(guān)鍵數(shù)據(jù)線MOSI (Master Out Slave In)主設(shè)備輸出從設(shè)備輸入。這是我們向DAC發(fā)送命令和數(shù)據(jù)的主通道。CS/ (Chip Select)片選信號(hào)低電平有效。這是總線的“開關(guān)”只有當(dāng)CS拉低時(shí)DAC才會(huì)“聆聽”SPI總線上的指令否則它處于高阻態(tài)不理會(huì)任何通信。這一點(diǎn)對(duì)于總線上掛載多個(gè)設(shè)備至關(guān)重要。有些DAC還有一根MISO線用于回讀狀態(tài)或數(shù)據(jù)但對(duì)于單純的電壓輸出型DAC常常不需要所以我們會(huì)看到三線制CS, SCLK, MOSI的接法。注意SPI有四種時(shí)鐘模式CPOL和CPHA的組合決定了數(shù)據(jù)在時(shí)鐘的哪個(gè)邊沿被采樣。DAC7311的數(shù)據(jù)手冊(cè)明確要求數(shù)據(jù)在SCLK下降沿被鎖存采樣。這意味著我們需要將主控的SPI模式配置為時(shí)鐘空閑時(shí)為高電平CPOL1在第二個(gè)邊沿即下降沿采樣數(shù)據(jù)CPHA1。這對(duì)應(yīng)SPI模式3。配置錯(cuò)誤會(huì)導(dǎo)致DAC無(wú)法識(shí)別數(shù)據(jù)這是第一個(gè)容易踩坑的地方。2.2 輸出電壓的計(jì)算原理LSB與滿量程這是理解DAC工作的數(shù)學(xué)基礎(chǔ)。對(duì)于一個(gè)12位的DAC意味著它可以將一個(gè)參考電壓Vref等分為 2^12 4096 份。每一份所代表的電壓值稱為最低有效位電壓LSB。計(jì)算公式為L(zhǎng)SB Vref / 4096假設(shè)我們使用DAC7311的內(nèi)部2.5V參考電壓那么 LSB 2.5V / 4096 ≈ 0.00061035 V ≈ 0.610 mV這意味著我們每向DAC發(fā)送的數(shù)字量增加1其輸出電壓理論上就增加0.61mV。這個(gè)LSB值直接決定了DAC的輸出精度和分辨率。那么輸出電壓Vout與輸入的12位數(shù)字碼Digital Code 我們記為D范圍0-4095的關(guān)系是Vout D * LSB D * (Vref / 4096)例如我們希望輸出1.25V的電壓 D Vout / LSB 1.25V / (2.5V/4096) 1.25 / 0.00061035 ≈ 2048 所以我們需要向DAC發(fā)送數(shù)字量2048十六進(jìn)制0x800。實(shí)操心得在實(shí)際計(jì)算時(shí)特別是涉及浮點(diǎn)數(shù)運(yùn)算時(shí)建議先在PC上或計(jì)算器算好D值再以整型形式寫入程序。避免在嵌入式設(shè)備上進(jìn)行浮點(diǎn)除法節(jié)省計(jì)算資源。同時(shí)要清楚D是整數(shù)范圍是0-4095如果你計(jì)算出的D是2048.5你需要做四舍五入處理這就會(huì)引入最多0.5個(gè)LSB的量化誤差這是數(shù)字系統(tǒng)固有的。2.3 實(shí)驗(yàn)箱電路連接要點(diǎn)在實(shí)驗(yàn)箱上連接通常已經(jīng)做好但理解這些連接對(duì)排查問(wèn)題無(wú)比重要電源與地確保DAC的VDD供電如3.3V和GND引腳正確連接。模擬部分對(duì)電源噪聲敏感最好在芯片的電源引腳附近放置一個(gè)0.1uF的陶瓷去耦電容。參考電壓確認(rèn)Vref引腳接的是內(nèi)部參考還是外部參考。實(shí)驗(yàn)箱通常使用芯片內(nèi)部參考如2.5V此時(shí)該引腳可能需要接一個(gè)對(duì)地的濾波電容例如10uF鉭電容并聯(lián)0.1uF陶瓷電容以穩(wěn)定參考電壓這是輸出低噪聲電壓的關(guān)鍵。SPI線路將主控的SPI_MOSI、SPI_SCLK、SPI_CS分別連接到DAC的SDIN、SCLK、CS/引腳。務(wù)必核對(duì)數(shù)據(jù)手冊(cè)的引腳定義。輸出測(cè)量DAC的VOUT引腳連接到實(shí)驗(yàn)箱的模擬輸出接口同時(shí)用示波器探頭或萬(wàn)用表表筆連接于此以便觀察輸出電壓。3. 軟件驅(qū)動(dòng)與數(shù)據(jù)幀解析3.1 SPI外設(shè)初始化配置以常見的STM32或TI C2000系列DSP為例初始化SPI需關(guān)注以下寄存器或庫(kù)函數(shù)參數(shù)工作模式配置為主機(jī)全雙工模式。數(shù)據(jù)幀格式選擇8位或16位數(shù)據(jù)幀。對(duì)于DAC7311它需要接收16位的數(shù)據(jù)幀盡管有效數(shù)據(jù)是12位所以我們通常選擇16位數(shù)據(jù)長(zhǎng)度。時(shí)鐘極性與相位如前所述設(shè)置為CPOL1 CPHA1即SPI模式3。時(shí)鐘頻率Baud Rate根據(jù)DAC芯片支持的最大SCLK頻率DAC7311典型值為30MHz和主控能力設(shè)置一個(gè)合適的速率。對(duì)于實(shí)驗(yàn)先使用較低速率如1MHz便于用示波器觀察波形。片選CS控制通常有兩種方式。一是使用SPI外設(shè)自帶的硬件NSS引腳并配置為硬件管理。二是使用一個(gè)普通的GPIO引腳來(lái)模擬CS信號(hào)。我強(qiáng)烈推薦第二種方式軟件控制CS因?yàn)樗`活可以在數(shù)據(jù)發(fā)送前后精確控制CS的拉低和拉高時(shí)機(jī)符合大多數(shù)DAC的時(shí)序要求。初始化代碼片段以STM32 HAL庫(kù)風(fēng)格示意hspi1.Instance SPI1; hspi1.Init.Mode SPI_MODE_MASTER; hspi1.Init.Direction SPI_DIRECTION_2LINES; //全雙工 hspi1.Init.DataSize SPI_DATASIZE_16BIT; //16位數(shù)據(jù)幀 hspi1.Init.CLKPolarity SPI_POLARITY_HIGH; //CPOL1 hspi1.Init.CLKPhase SPI_PHASE_2EDGE; //CPHA1 hspi1.Init.NSS SPI_NSS_SOFT; //軟件控制NSS(CS) hspi1.Init.BaudRatePrescaler SPI_BAUDRATEPRESCALER_32; //假設(shè)系統(tǒng)時(shí)鐘80MHz 80/322.5MHz hspi1.Init.FirstBit SPI_FIRSTBIT_MSB; //高位先發(fā) hspi1.Init.TIMode SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation SPI_CRCCALCULATION_DISABLE; if (HAL_SPI_Init(hspi1) ! HAL_OK) { Error_Handler(); } // 同時(shí)初始化用于模擬CS的GPIO引腳為推挽輸出模式并默認(rèn)置高。3.2 DAC數(shù)據(jù)幀格式與命令解析這是驅(qū)動(dòng)DAC的核心。你不能簡(jiǎn)單地把12位數(shù)據(jù)發(fā)過(guò)去必須按照芯片數(shù)據(jù)手冊(cè)規(guī)定的幀格式進(jìn)行組裝。DAC7311的16位數(shù)據(jù)幀如下所示位Bit15 (MSB)14131211109876543210 (LSB)功能PD1PD0D11D10D9D8D7D6D5D4D3D2D1D0XXD11-D0 (位12到位3)這就是我們要輸出的12位數(shù)字量。注意它是左對(duì)齊的。例如數(shù)字量0x800二進(jìn)制1000 0000 0000對(duì)應(yīng)輸出中點(diǎn)電壓Vref/2。在組幀時(shí)你需要將12位數(shù)據(jù)左移4位data_12bit 4使其占據(jù)Bit12到Bit3的位置。PD1, PD0 (位15, 14)功率控制位。這非常關(guān)鍵00: 正常模式DAC輸出有效。01: 輸出端接1kΩ到GND。10: 輸出端接100kΩ到GND。11: 高阻態(tài)輸出關(guān)閉。在實(shí)驗(yàn)開始時(shí)我們必須將其設(shè)置為00否則DAC不會(huì)輸出電壓。這是一個(gè)常見的“坑”如果忘記設(shè)置你會(huì)測(cè)量不到任何電壓或者電壓不對(duì)。Bit1, Bit0 (LSB)無(wú)關(guān)位Don‘t care通常填充0。因此一個(gè)完整的、用于設(shè)置輸出電壓的16位命令字Command Word的組裝過(guò)程如下uint16_t dac_code 2048; // 我們要發(fā)送的12位數(shù)字量例如2048 uint16_t command_word; // 將12位數(shù)據(jù)左移4位使其對(duì)齊到D11-D0位同時(shí)PD10, PD00 (正常模式)低2位填0 command_word (0x00 14) | ((dac_code 0x0FFF) 4) | 0x00; // 更清晰的寫法 command_word (dac_code 4); // 因?yàn)镻D位為0低2位為0左移后自然滿足。 // 但為了代碼清晰建議顯式寫出 command_word (0b00 14) | (dac_code 4);3.3 完整的輸出電壓函數(shù)實(shí)現(xiàn)結(jié)合軟件CS控制、SPI發(fā)送和數(shù)據(jù)組裝一個(gè)健壯的DAC設(shè)置函數(shù)如下/** * brief 通過(guò)SPI設(shè)置DAC7311輸出電壓 * param voltage_mV: 期望輸出的電壓值單位毫伏 * retval 無(wú) */ void DAC7311_SetVoltage(float voltage_mV) { uint16_t dac_code; uint16_t command_word; float vref_mV 2500.0; // 內(nèi)部參考電壓2.5V 2500mV // 1. 計(jì)算12位數(shù)字碼 (防止浮點(diǎn)運(yùn)算可優(yōu)化為定點(diǎn)數(shù)) // Vout (D / 4096) * Vref D (Vout / Vref) * 4096 dac_code (uint16_t)((voltage_mV / vref_mV) * 4096.0f 0.5f); // 加0.5實(shí)現(xiàn)四舍五入 // 2. 限幅保護(hù)防止溢出 if (dac_code 4095) { dac_code 4095; } // 3. 組裝16位命令字 (正常模式數(shù)據(jù)左移4位) command_word (dac_code 4); // PD10, PD00, 低2位0 // 4. 拉低CS片選信號(hào) HAL_GPIO_WritePin(DAC_CS_GPIO_Port, DAC_CS_Pin, GPIO_PIN_RESET); // 5. 通過(guò)SPI發(fā)送16位數(shù)據(jù) HAL_SPI_Transmit(hspi1, (uint8_t*)command_word, 1, HAL_MAX_DELAY); // 注意第三個(gè)參數(shù)是發(fā)送的數(shù)據(jù)單元數(shù)量這里是1個(gè)16位數(shù)據(jù) // 6. 拉高CS片選信號(hào)鎖存數(shù)據(jù) HAL_GPIO_WritePin(DAC_CS_GPIO_Port, DAC_CS_Pin, GPIO_PIN_SET); }注意事項(xiàng)HAL_SPI_Transmit函數(shù)的第三個(gè)參數(shù)Size在數(shù)據(jù)格式設(shè)置為16位時(shí)代表的是16位數(shù)據(jù)的個(gè)數(shù)。我們發(fā)送一個(gè)命令字所以這里填1。如果錯(cuò)誤地填成2則會(huì)發(fā)送兩個(gè)16位數(shù)據(jù)導(dǎo)致時(shí)序錯(cuò)誤。4. 實(shí)驗(yàn)過(guò)程與波形觀測(cè)4.1 基礎(chǔ)實(shí)驗(yàn)輸出固定直流電壓代碼編寫在主循環(huán)中調(diào)用DAC7311_SetVoltage(1250.0)目標(biāo)輸出1.25V。編譯下載將程序編譯并下載到實(shí)驗(yàn)箱的DSP/MCU中。硬件連接確保示波器探頭地線夾在實(shí)驗(yàn)板GND探頭尖端接觸DAC的VOUT引腳。上電運(yùn)行給實(shí)驗(yàn)箱上電運(yùn)行程序。示波器觀測(cè)將示波器觸發(fā)模式設(shè)置為“單次”或“正?!庇|發(fā)源設(shè)為DAC的CS信號(hào)下降沿觸發(fā)。調(diào)整時(shí)基使能同時(shí)看到CS、SCLK、MOSI三個(gè)波形。你應(yīng)該能看到當(dāng)CS拉低后SCLK開始產(chǎn)生16個(gè)時(shí)鐘脈沖同時(shí)MOSI線上同步出現(xiàn)16位數(shù)據(jù)。用示波器的解碼功能SPI解碼可以直接解析出發(fā)送的16進(jìn)制數(shù)值核對(duì)是否與command_word例如0x8000一致。切換到直流電壓檔測(cè)量VOUT引腳的電壓應(yīng)為穩(wěn)定的1.25V左右存在微小誤差。4.2 進(jìn)階實(shí)驗(yàn)一輸出正弦波這是檢驗(yàn)DAC動(dòng)態(tài)性能的好方法。我們通過(guò)查表法生成一個(gè)正弦波序列。生成數(shù)據(jù)表在PC上用Python或MATLAB生成一個(gè)周期正弦波的采樣點(diǎn)12位量化。import numpy as np points 64 # 一個(gè)周期的點(diǎn)數(shù) amplitude 2047 # 峰值對(duì)應(yīng)數(shù)字量2047 (接近Vref) offset 2048 # 直流偏置使波形在Vref/2上下變化 sine_table [] for i in range(points): value int(offset amplitude * np.sin(2 * np.pi * i / points)) if value 4095: value 4095 if value 0: value 0 sine_table.append(value) print(sine_table)編寫輸出程序?qū)ine_table數(shù)組存入MCU的Flash或RAM中。使用一個(gè)定時(shí)器中斷以固定的頻率例如1kHz觸發(fā)。在中斷服務(wù)函數(shù)中依次取出表中的值調(diào)用DAC7311_SetVoltage函數(shù)或直接發(fā)送對(duì)應(yīng)的命令字。觀測(cè)結(jié)果用示波器觀察VOUT引腳應(yīng)能看到一個(gè)光滑的正弦波。調(diào)整定時(shí)器的中斷頻率可以改變輸出正弦波的頻率。注意受限于SPI寫入速度和DAC的建立時(shí)間輸出波形的最高頻率是有限的。4.3 進(jìn)階實(shí)驗(yàn)二驗(yàn)證線性度與建立時(shí)間線性度測(cè)試編寫程序讓DAC輸出從0到滿量程例如0mV, 100mV, 200mV, ..., 2500mV的階梯電壓。用高精度萬(wàn)用表6位半測(cè)量每個(gè)點(diǎn)對(duì)應(yīng)的實(shí)際電壓值V_actual。記錄數(shù)據(jù)并計(jì)算誤差Error V_actual - V_ideal。繪制誤差曲線可以直觀看到DAC的積分非線性INL和微分非線性DNL趨勢(shì)。建立時(shí)間測(cè)試讓DAC輸出從一個(gè)低電壓如0.5V階躍到一個(gè)高電壓如2.0V。使用示波器的單次觸發(fā)和余輝功能捕獲VOUT的跳變過(guò)程。測(cè)量輸出電壓從終值的10%上升到90%所需的時(shí)間這就是上升時(shí)間。而建立時(shí)間通常指輸出進(jìn)入并保持在終值附近一個(gè)特定誤差帶如±0.5 LSB內(nèi)所需的時(shí)間。這需要示波器有高分辨率模式。這個(gè)參數(shù)反映了DAC對(duì)快速變化信號(hào)的響應(yīng)能力。5. 調(diào)試技巧與常見問(wèn)題排查在實(shí)際操作中你幾乎一定會(huì)遇到問(wèn)題。下面是一個(gè)快速排查清單現(xiàn)象可能原因排查步驟與解決方法完全無(wú)輸出0V1. 電源或地未接通。2. DAC未上電或損壞。3.PD1/PD0位被設(shè)置為關(guān)閉模式11或端接模式。4. CS信號(hào)一直為高DAC未選中。5. SPI根本未工作。1. 檢查電源引腳電壓。2. 觸摸芯片是否發(fā)熱3.檢查發(fā)送的命令字確保Bit15-14是00。4. 用示波器看CS引腳波形確認(rèn)有低電平脈沖。5. 用示波器同時(shí)看SCLK和MOSI確認(rèn)有時(shí)鐘和數(shù)據(jù)。輸出固定電壓錯(cuò)誤1. 參考電壓Vref不正確。2. 數(shù)據(jù)幀格式錯(cuò)誤如位對(duì)齊錯(cuò)誤。3. SPI模式CPOL/CPHA錯(cuò)誤。4. 數(shù)字碼計(jì)算錯(cuò)誤。1. 測(cè)量Vref引腳電壓是否為預(yù)期的2.5V。2.用示波器SPI解碼功能核對(duì)發(fā)出的16位數(shù)據(jù)是否與預(yù)期命令字完全一致。重點(diǎn)看12位數(shù)據(jù)是否在正確的比特位上。3. 檢查SPI初始化配置對(duì)照數(shù)據(jù)手冊(cè)的時(shí)序圖看數(shù)據(jù)采樣邊沿是否匹配。4. 重新計(jì)算數(shù)字碼并打印調(diào)試。輸出有噪聲或毛刺1. 電源噪聲大。2. 參考電壓不穩(wěn)。3. SPI信號(hào)線對(duì)模擬輸出造成干擾。4. 負(fù)載過(guò)重或動(dòng)態(tài)響應(yīng)不足。1. 在VDD和GND間加并0.1uF和10uF電容。2. 在Vref引腳加對(duì)地濾波電容。3. 在PCB布局上讓SPI走線遠(yuǎn)離模擬輸出走線。軟件上可在DAC更新后將SPI總線時(shí)鐘關(guān)閉或降低頻率。4. 檢查輸出端負(fù)載阻抗是否在DAC驅(qū)動(dòng)能力范圍內(nèi)。波形輸出頻率上不去或畸變1. SPI時(shí)鐘頻率或主控速度太慢。2. DAC建立時(shí)間不夠。3. 中斷服務(wù)函數(shù)執(zhí)行時(shí)間過(guò)長(zhǎng)。4. 使用了浮點(diǎn)計(jì)算在中斷中。1. 提高SPI波特率在DAC允許范圍內(nèi)。2. 確認(rèn)輸出波形的頻率要求未超過(guò)DAC建立時(shí)間的倒數(shù)。3.優(yōu)化中斷服務(wù)函數(shù)僅做查表和發(fā)送將計(jì)算如浮點(diǎn)轉(zhuǎn)定點(diǎn)移到主循環(huán)提前完成。4. 使用預(yù)先計(jì)算好的定點(diǎn)數(shù)查表避免在中斷中做任何乘除浮點(diǎn)運(yùn)算。SPI解碼顯示數(shù)據(jù)錯(cuò)誤1. 示波器解碼設(shè)置錯(cuò)誤位順序、幀長(zhǎng)度。2. 信號(hào)質(zhì)量差過(guò)沖、振鈴。3. 地線環(huán)路引入噪聲。1. 確認(rèn)示波器SPI解碼設(shè)置為MSB First16位幀時(shí)鐘極性相位與代碼一致。2. 檢查信號(hào)線上是否可串聯(lián)小電阻如22Ω阻尼振鈴。3. 使用示波器探頭自帶的接地彈簧而非長(zhǎng)接地夾減少環(huán)路面積。一個(gè)關(guān)鍵的調(diào)試習(xí)慣示波器是你的眼睛。遇到任何問(wèn)題第一步就是把CS、SCLK、MOSI三根線接到示波器上打開SPI協(xié)議解碼。它能最直觀地告訴你主控到底有沒有發(fā)、發(fā)了什么、時(shí)序?qū)Σ粚?duì)。這比盲目修改代碼要高效得多。6. 從實(shí)驗(yàn)到項(xiàng)目擴(kuò)展思考與應(yīng)用掌握了基本的SPI DAC驅(qū)動(dòng)后你可以將其應(yīng)用到更復(fù)雜的場(chǎng)景中這標(biāo)志著從實(shí)驗(yàn)到實(shí)際項(xiàng)目的跨越多通道同步輸出如果需要產(chǎn)生兩路相關(guān)的模擬信號(hào)例如I/Q信號(hào)可以使用多通道DAC芯片如DAC7312是雙通道并注意其是否有獨(dú)立的鎖存器。為了實(shí)現(xiàn)精確同步最好使用帶“同步更新”功能的DAC或者通過(guò)一個(gè)額外的GPIO控制所有DAC的LDAC/LOAD引腳在數(shù)據(jù)寫入所有通道后同時(shí)拉低該引腳使所有通道同步更新輸出。提高輸出精度與穩(wěn)定性參考電壓源內(nèi)部參考電壓通常溫漂和精度一般如±5mV。對(duì)于高精度應(yīng)用使用外部高精度、低溫漂的基準(zhǔn)電壓源芯片如REF5025可以極大提升系統(tǒng)性能。輸出緩沖DAC內(nèi)部輸出運(yùn)放驅(qū)動(dòng)能力有限。對(duì)于驅(qū)動(dòng)低阻抗負(fù)載或長(zhǎng)線纜需要在輸出端添加一個(gè)精密運(yùn)算放大器作為電壓跟隨器提供低輸出阻抗和電流驅(qū)動(dòng)能力。構(gòu)建波形發(fā)生器結(jié)合DMA直接存儲(chǔ)器訪問(wèn)和定時(shí)器可以實(shí)現(xiàn)極高性能的任意波形發(fā)生器。將波形數(shù)據(jù)存放在數(shù)組中配置DMA在定時(shí)器的觸發(fā)下自動(dòng)將數(shù)組中的數(shù)據(jù)通過(guò)SPI搬移到DAC無(wú)需CPU干預(yù)。這樣可以輸出非常高頻率且穩(wěn)定的波形。閉環(huán)控制中的應(yīng)用在運(yùn)動(dòng)控制、電源管理等系統(tǒng)中DAC常用于設(shè)定目標(biāo)值如目標(biāo)速度、目標(biāo)電壓。MCU通過(guò)算法如PID計(jì)算出控制量經(jīng)由DAC轉(zhuǎn)換為模擬電壓驅(qū)動(dòng)功率模塊。此時(shí)DAC的線性度、建立時(shí)間和分辨率將直接影響整個(gè)控制系統(tǒng)的精度和響應(yīng)速度。通過(guò)這個(gè)“數(shù)模轉(zhuǎn)換實(shí)驗(yàn)”我們完成的遠(yuǎn)不止讓一個(gè)引腳輸出可變電壓。我們深入了SPI通信協(xié)議的底層理解了DAC數(shù)據(jù)手冊(cè)的關(guān)鍵參數(shù)掌握了混合信號(hào)電路調(diào)試的核心方法并搭建了一個(gè)可以擴(kuò)展到真實(shí)應(yīng)用場(chǎng)景的軟硬件框架。下次當(dāng)你再面對(duì)一顆陌生的DAC或任何其他SPI設(shè)備時(shí)這套“查手冊(cè)、配時(shí)序、組數(shù)據(jù)、抓波形、測(cè)性能”的組合拳將會(huì)是你最得力的工具。