字電位器AD5293與MCU組合的工業(yè)模擬輸出自動(dòng)校準(zhǔn)方案)
開頭先交代一下背景。我之前在做一塊工業(yè)模擬量輸出板卡產(chǎn)線上最討厭的環(huán)節(jié)就是用螺絲刀去擰機(jī)械電位器做校準(zhǔn)。每個(gè)板子都要人工調(diào)整效率低不說一致性全看師傅手穩(wěn)不穩(wěn)而且機(jī)械電位器用久了氧化、磨損出廠校準(zhǔn)好的參數(shù)過半年就飄了。后來我把目光放到了數(shù)字電位器上用 AD5293BRUZ-20-RL7 配合 MKV46F256VLH16 做了一套自動(dòng)校準(zhǔn)方案才算是把這個(gè)問題徹底解決。如果你也在做校準(zhǔn)類儀表、模擬輸出模塊、可調(diào)基準(zhǔn)源或者任何需要“電阻值可自動(dòng)調(diào)整”的工業(yè)設(shè)備這篇內(nèi)容就是我從選型到量產(chǎn)踩完坑之后的一份完整復(fù)盤包含硬件接口、SPI控制、標(biāo)定流程以及工業(yè)現(xiàn)場(chǎng)常見的故障排查思路。1. 為什么最終選定了AD5293與MKV46F256這對(duì)組合1.1 校準(zhǔn)和工業(yè)應(yīng)用里可編程電阻到底替代了什么很多人第一次接觸“可編程電阻”會(huì)想這不就是一個(gè)數(shù)字電位器嗎對(duì)本質(zhì)上就是。但在校準(zhǔn)和工業(yè)控制場(chǎng)景里數(shù)字電位器承擔(dān)的角色遠(yuǎn)比消費(fèi)類產(chǎn)品里的音量調(diào)節(jié)要嚴(yán)肅得多。最典型的場(chǎng)景有兩個(gè)。第一模擬電路里的增益電阻或分壓電阻需要微調(diào)。比如一個(gè)0到10V的模擬輸出通道運(yùn)放反饋網(wǎng)絡(luò)里的電阻阻值總會(huì)有誤差導(dǎo)致滿量程偏差。傳統(tǒng)做法是在反饋網(wǎng)絡(luò)里串一個(gè)機(jī)械電位器產(chǎn)線工人手動(dòng)調(diào)。第二傳感器信號(hào)的零點(diǎn)校準(zhǔn)。比如壓力變送器、溫度變送器零點(diǎn)偏移需要靠調(diào)整電橋臂電阻來修正以前也是靠機(jī)械電位器。機(jī)械電位器的問題很明顯調(diào)好的位置會(huì)因?yàn)檎饎?dòng)、溫漂、氧化發(fā)生變化而且人工調(diào)試效率極低。可編程電阻的出現(xiàn)讓“電阻值”從硬件屬性變成了軟件可控的參數(shù)。MCU上電后自動(dòng)寫入一個(gè)數(shù)字碼值電阻就精確地穩(wěn)定在對(duì)應(yīng)位置不需要任何人去碰電路板。1.2 AD5293BRUZ-20-RL7 的核心參數(shù)解讀AD5293 是 ADI 推出的一款單通道數(shù)字電位器業(yè)界通常把它歸入“DigiPOT”系列。后綴BRUZ-20表示20kΩ標(biāo)稱阻值版本RL7表示卷帶包裝。它有兩個(gè)特點(diǎn)讓它在工業(yè)校準(zhǔn)場(chǎng)景里很突出精度高、接口可靠。先看阻值和分辨率。10位分辨率也就是1024個(gè)抽頭位置整個(gè)量程20kΩ。算一下LSPLeast Significant Position大約19.5Ω。對(duì)于校準(zhǔn)這種需求來說這個(gè)步進(jìn)在大多數(shù)增益微調(diào)場(chǎng)景里已經(jīng)足夠細(xì)膩。更重要的是它的初始電阻容差能做到±1%這個(gè)指標(biāo)在數(shù)字電位器里相當(dāng)能打。很多普通數(shù)字電位器容差是±20%甚至±30%只能用在音量調(diào)節(jié)±1%意味著可以直接放到反饋回路里做精密調(diào)節(jié)不需要額外的校準(zhǔn)電阻配合。再看供電范圍。AD5293支持較寬的模擬電源可以用單電源也可以用正負(fù)對(duì)稱電源供電。我實(shí)際項(xiàng)目中用的是±12V給模擬信號(hào)留了充分的擺幅空間。數(shù)字電源部分單獨(dú)接3.3V和MCU直接兼容。還有一點(diǎn)容易被忽略的是它的溫度系數(shù)大致在幾十ppm/°C的量級(jí)。機(jī)械電位器在溫度變化時(shí)阻值漂移遠(yuǎn)比這個(gè)大而AD5293的溫漂特性要穩(wěn)定得多這對(duì)于工業(yè)現(xiàn)場(chǎng)寬溫度范圍工作環(huán)境非常關(guān)鍵。1.3 MKV46F256VLH16 在系統(tǒng)里的角色MKV46F256VLH16 是 NXP Kinetis V 系列的一款MCUCortex-M4F內(nèi)核帶浮點(diǎn)運(yùn)算單元256KB Flash64KB RAMLQFP64封裝。Kinetis V系列本身定位就是電機(jī)控制和工業(yè)應(yīng)用所以它的定時(shí)器、PWM、ADC這些外設(shè)在工業(yè)場(chǎng)景下非常實(shí)用。在我的系統(tǒng)里MKV46F256VLH16承擔(dān)的工作有三塊。第一通過SPI接口控制AD5293的電阻值。第二采集外部參考電壓和反饋信號(hào)通過內(nèi)部ADC做閉環(huán)校準(zhǔn)判斷。第三和上位機(jī)或者主控通信接收配置命令并上報(bào)診斷信息。選這顆料的原因除了性能足夠、工業(yè)級(jí)溫度范圍之外還有一點(diǎn)是它的SPI模塊DSPI支持靈活的幀格式配置方便和AD5293的SPI協(xié)議對(duì)接。另外這芯片供貨穩(wěn)定、生命周期長(zhǎng)在工業(yè)項(xiàng)目里元器件停產(chǎn)是件很要命的事Kinetis V系列就屬于那種“你不會(huì)擔(dān)心明天買不到”的料。1.4 備選方案比較I2C數(shù)字電位器、DAC運(yùn)放、機(jī)械電位器為了說明這個(gè)組合的合理性我把幾個(gè)常見替代方案放在一起做了個(gè)對(duì)比。方案精度與容差可自動(dòng)控制溫漂表現(xiàn)主要問題機(jī)械電位器調(diào)整精度看人工否較差一致性差、老化、產(chǎn)線效率低8位數(shù)字電位器256級(jí)容差較大是一般分辨率不夠反饋回路精度受限I2C數(shù)字電位器高精度型號(hào)較少是一般工業(yè)現(xiàn)場(chǎng)I2C抗干擾不如SPIDAC運(yùn)放構(gòu)成可調(diào)基準(zhǔn)精度高是較好成本高、電路復(fù)雜、噪聲控制要求高AD5293MKV46F25610位、±1%是穩(wěn)定無這里多說一句I2C和SPI的差別。I2C是開漏結(jié)構(gòu)線上需要上拉電阻在工業(yè)強(qiáng)干擾環(huán)境下通信線容易受到共模干擾導(dǎo)致時(shí)序錯(cuò)誤。SPI是全雙工推挽輸出信號(hào)擺幅大、抗干擾能力強(qiáng)而且沒有地址沖突問題。所以從可靠性出發(fā)工業(yè)場(chǎng)景里我優(yōu)先選SPI接口的數(shù)字電位器。2. 硬件搭建AD5293與MKV46F256VLH16的接口設(shè)計(jì)2.1 電源與參考引腳的處理AD5293的供電結(jié)構(gòu)比較特殊它把模擬電源和數(shù)字電源分開。模擬電源VA/VA-給內(nèi)部電阻陣列和開關(guān)電路供電數(shù)字電源VDD給SPI接口和寄存器供電。這樣設(shè)計(jì)的好處是數(shù)字部分的噪聲不會(huì)直接耦合進(jìn)模擬電阻路徑。我在原理圖上用了±12V給模擬電源3.3V給數(shù)字電源。值得注意的一點(diǎn)數(shù)字電源VDD必須先于模擬電源上電或者在規(guī)格書允許的范圍內(nèi)同時(shí)上電否則可能導(dǎo)致芯片內(nèi)部閂鎖。實(shí)際做法很簡(jiǎn)單給AD5293的VDD加一個(gè)3.3V的LDO由MCU的使能信號(hào)控制MCU的3.3V系統(tǒng)電源穩(wěn)定后再開啟模擬電源的DC-DC。這樣從時(shí)序上保證安全性。旁路電容方面每個(gè)電源引腳都放了一個(gè)0.1uF陶瓷電容靠近引腳再并聯(lián)一個(gè)10uF的鉭電容做低頻去耦。很多人只放假電容但AD5293在切換抽頭時(shí)瞬間電流變化不小如果沒有大電容穩(wěn)住電源可能會(huì)看到輸出信號(hào)上有毛刺。2.2 SPI引腳連接與電平匹配我的系統(tǒng)里MKV46F256VLH16的IO電源就是3.3VAD5293的數(shù)字電源VDD也接3.3V所以SPI引腳電平完全兼容不需要額外的電平轉(zhuǎn)換電路。實(shí)際接線表如下AD5293引腳MKV46F256引腳功能SYNC片選PTD0GPIO/CS片選信號(hào)低有效SCLK時(shí)鐘PTD1SPI0 SCKSPI時(shí)鐘SDI數(shù)據(jù)輸入PTD2SPI0 SOUTMCU寫入AD5293SDO數(shù)據(jù)輸出PTD3SPI0 SINAD5293回讀數(shù)據(jù)VDD3.3V數(shù)字電源VA / VA-12V / -12V模擬電源VREF如使用外部基準(zhǔn)參考電壓我特別說明一下片選信號(hào)的處理。AD5293的SYNC引腳在SPI通信期間保持低電平一幀結(jié)束后拉高。如果拉高過早或者過晚都會(huì)導(dǎo)致幀同步錯(cuò)亂。常規(guī)做法是把SYNC引腳的拉高時(shí)間放在最后一個(gè)SCLK邊沿之后至少一個(gè)SCLK周期不要和最后一個(gè)時(shí)鐘沿同時(shí)發(fā)生。我之前有一次圖省事直接在SPI發(fā)送完成后立刻拉高結(jié)果偶爾出現(xiàn)寄存器寫入值不對(duì)的情況排查了很久才意識(shí)到是時(shí)序余量不夠。2.3 輸出緩沖與負(fù)載匹配直連還是加運(yùn)放數(shù)字電位器的滑動(dòng)端W引腳有一個(gè)重要特性它不能直接驅(qū)動(dòng)重負(fù)載。因?yàn)閮?nèi)部的開關(guān)陣列是通過MOS管實(shí)現(xiàn)的流過開關(guān)的電流過大會(huì)導(dǎo)致導(dǎo)通電阻變化直接影響分壓精度。如果你的后續(xù)電路輸入阻抗足夠高比如接入運(yùn)放的同相輸入端那AD5293的W引腳可以直接連接不需要額外緩沖。但如果負(fù)載阻抗在幾十kΩ以下或者負(fù)載電流超過規(guī)格書推薦值就必須加一級(jí)運(yùn)放緩沖。我遇到一個(gè)實(shí)際案例用AD5293做分壓器給外部?jī)x表提供0到5V參考電壓外部?jī)x表輸入阻抗只有10kΩ。直接把W引腳接到10kΩ負(fù)載實(shí)測(cè)分壓比在高端和低端明顯不一樣因?yàn)樨?fù)載電流改變了內(nèi)部開關(guān)的導(dǎo)通壓降。后來我去掉負(fù)載直接接運(yùn)放跟隨器問題立刻消失。這里的經(jīng)驗(yàn)是拿不準(zhǔn)負(fù)載情況時(shí)加運(yùn)放緩沖永遠(yuǎn)是更穩(wěn)妥的做法。用的是一個(gè)SGM8521這樣的低成本單運(yùn)放就行效果很好。2.4 上電復(fù)位與復(fù)位信號(hào)的考量AD5293上電后寄存器會(huì)恢復(fù)到一個(gè)默認(rèn)狀態(tài)。我查了數(shù)據(jù)手冊(cè)AD5293上電復(fù)位的默認(rèn)位置是中位也就是1024級(jí)中的第512級(jí)電阻值在10kΩ附近。這個(gè)特性既是優(yōu)點(diǎn)也是隱患。優(yōu)點(diǎn)是上電瞬間電阻值確定不會(huì)隨機(jī)隱患是如果你的電路設(shè)計(jì)是上電時(shí)要求電阻為最小值或最大值那默認(rèn)中位可能會(huì)讓設(shè)備進(jìn)入一個(gè)不安全的狀態(tài)。比如某些電源模塊的反饋電阻如果突然變成10kΩ輸出電壓可能瞬間沖高。我的做法是用MCU的一個(gè)GPIO控制AD5293的復(fù)位引腳如果不用硬件復(fù)位則在MCU初始化代碼里第一時(shí)間把目標(biāo)電阻值寫入然后才使能系統(tǒng)的輸出使能信號(hào)。也就是先讓電阻值穩(wěn)定在預(yù)期位置再讓模擬鏈路投入工作。這個(gè)順序在工業(yè)設(shè)備里很關(guān)鍵。3. 軟件控制從數(shù)字碼到電阻值3.1 AD5293的寄存器結(jié)構(gòu)與SPI幀格式AD5293雖然是SPI接口但它不是簡(jiǎn)單發(fā)送一個(gè)10位數(shù)據(jù)就完事。它內(nèi)部有多個(gè)寄存器需要通過命令字來區(qū)分是寫RDAC寄存器、讀回?cái)?shù)據(jù)還是進(jìn)行其他操作。一幀數(shù)據(jù)通常由16位組成前幾位是命令后面是數(shù)據(jù)。因?yàn)槲沂掷锏捻?xiàng)目用的固件經(jīng)過了幾輪迭代這里給出一個(gè)簡(jiǎn)化但結(jié)構(gòu)完整的示例。具體命令編碼和移位位數(shù)一定要以你手頭這顆料對(duì)應(yīng)批次的數(shù)據(jù)手冊(cè)為準(zhǔn)不同版本之間存在差異。// 偽代碼向AD5293寫入RDAC寄存器 #define AD5293_CMD_WRITE_RDAC (0x04 10) // 寫入RDAC寄存器的命令 #define AD5293_CMD_READ_RDAC (0x05 10) // 讀取RDAC寄存器的命令 void ad5293_write(uint16_t command, uint16_t data) { uint16_t frame command | (data 0x03FF); // AD5293是10位數(shù)據(jù) GPIO_WriteLow(CS_PIN); // SYNC拉低開始傳輸 SPI0_Write16(frame); // 發(fā)送16位幀 GPIO_WriteHigh(CS_PIN); // SYNC拉高結(jié)束傳輸 }括號(hào)里的移位位數(shù)和命令值需要特別謹(jǐn)慎核對(duì)。我踩過的坑是不同版本的驅(qū)動(dòng)代碼來自網(wǎng)上不同人寫的有人用的是AD5292的寄存器地址有人用的是AD5291的看起來很像但實(shí)際跑起來完全不對(duì)。最穩(wěn)妥的辦法就是打開數(shù)據(jù)手冊(cè)找到Register Map那一頁對(duì)著逐位核對(duì)。3.2 SPI模式與時(shí)鐘極性的設(shè)置AD5293的SPI模式要求是比較明確的CPOL0時(shí)鐘空閑低電平CPHA1數(shù)據(jù)在第二個(gè)邊沿采樣對(duì)應(yīng)SPI Mode 1。我一開始用的默認(rèn)配置是Mode 0結(jié)果讀寫時(shí)數(shù)據(jù)總是錯(cuò)位一位。MKV46F256VLH16的DSPI模塊配置需要設(shè)置CTAR寄存器中的CPOL和CPHA位。這不是什么高級(jí)技巧但在實(shí)際項(xiàng)目中非常容易忽視。因?yàn)槊靠钚酒腟PI Mode要求可能都不一樣同一個(gè)板子上掛了兩個(gè)SPI從設(shè)備一個(gè)要求Mode 0一個(gè)要求Mode 1切換的時(shí)候就必須記得重新配置CTAR。3.3 碼值與電阻值的換算關(guān)系A(chǔ)D5293的電阻公式對(duì)于10位數(shù)字電位器最常用的有兩個(gè)電位器模式分壓器模式和變阻器模式。在變阻器模式下W到A端的電阻R_WA可以表示為[ R_{WA}(D) \frac{D}{1023} \times R_{AB} R_W(LSB) ]其中D是寫入的碼值(R_{AB})是端到端標(biāo)稱電阻20kΩ(R_W(LSB))是開關(guān)導(dǎo)通電阻和LSB電阻之和大概幾十Ω的量級(jí)。我的項(xiàng)目中主要工作區(qū)間在D的中間段所以直接把低端導(dǎo)通電阻忽略掉工程上影響很小。但在接近0的位置比如想輸出一個(gè)很小的電阻值低端導(dǎo)通電阻的占比就不可忽略了。如果應(yīng)用要求從很低的阻值開始精確控制就必須先做一次端點(diǎn)標(biāo)定測(cè)出實(shí)際的零位電阻和滿量程電阻再用兩點(diǎn)校準(zhǔn)來修正計(jì)算。這里有一點(diǎn)值得提數(shù)字電位器不是線性的至少不是理想的線性。雖然標(biāo)稱分辨率是1024級(jí)但每一級(jí)的實(shí)際步進(jìn)會(huì)有些偏差尤其在接近電源軌的兩端。所以我說校準(zhǔn)類應(yīng)用里不能只算理論值一定要做實(shí)際標(biāo)定。3.4 回讀功能與閉環(huán)校驗(yàn)AD5293支持回讀RDAC寄存器的內(nèi)容也就是說你可以把上次寫入的碼值讀回來確認(rèn)寄存器內(nèi)容沒有被干擾改變。這功能在工業(yè)自檢里特別有用。我的固件里加入了一個(gè)周期性的校驗(yàn)任務(wù)每100ms把AD5293的碼值回讀一次和期望值比較如果不一致就報(bào)故障。有一次我們?cè)诂F(xiàn)場(chǎng)發(fā)現(xiàn)某臺(tái)設(shè)備輸出異常日志里的故障碼就指向AD5293寄存器值被篡改。后來排查發(fā)現(xiàn)是SPI線纜過長(zhǎng)在電機(jī)啟停時(shí)產(chǎn)生了尖峰干擾。回讀的軟件實(shí)現(xiàn)很簡(jiǎn)單發(fā)一個(gè)讀命令幀然后緊接著在同一個(gè)CS低電平時(shí)間段內(nèi)讀取SDO引腳上的數(shù)據(jù)。注意幀格式里要先發(fā)命令再讀數(shù)據(jù)時(shí)序上不要搞反。4. 校準(zhǔn)應(yīng)用落地一個(gè)模擬輸出通道的零點(diǎn)與滿量程校準(zhǔn)實(shí)例4.1 應(yīng)用場(chǎng)景和校準(zhǔn)目標(biāo)我們的模擬輸出卡有8個(gè)通道每個(gè)通道輸出0到10V。理想情況下DAC輸出0碼時(shí)輸出電壓為0V輸出滿碼時(shí)電壓為10V。但實(shí)際上由于DAC的失調(diào)誤差、運(yùn)放輸入失調(diào)電壓、反饋電阻容差每個(gè)通道的零點(diǎn)和滿量程都會(huì)偏差。設(shè)計(jì)目標(biāo)是在產(chǎn)線上不需要人工干預(yù)每個(gè)通道自動(dòng)完成校準(zhǔn)要求零點(diǎn)誤差小于1mV滿量程誤差小于5mV校準(zhǔn)完成后在-20到70°C范圍內(nèi)誤差不超指標(biāo)這個(gè)要求靠固定電阻是不可能量產(chǎn)的必須每個(gè)通道單獨(dú)校準(zhǔn)。AD5293在電路里充當(dāng)運(yùn)放反饋回路的微調(diào)電阻。4.2 閉環(huán)校準(zhǔn)流程整個(gè)校準(zhǔn)流程分三步類比于儀表行業(yè)常說的“三點(diǎn)校準(zhǔn)”思路但實(shí)際取點(diǎn)更多核心是分段逼近。第一步粗調(diào)。把AD5293設(shè)置在中位DAC輸出0碼讀取外部精密ADC測(cè)得的實(shí)際輸出電壓。如果偏正說明需要減小反饋電阻如果偏負(fù)則增大。第二步變步長(zhǎng)逼近。根據(jù)誤差符號(hào)調(diào)整碼值一開始每次改變32級(jí)誤差變小后改為8級(jí)最后改為1級(jí)。這種從大步長(zhǎng)到小步長(zhǎng)的逼近方式比直接二分法更快而且能避免在局部線性區(qū)反復(fù)震蕩。第三步滿量程微調(diào)。零點(diǎn)和滿量程會(huì)互相影響所以要先調(diào)零點(diǎn)再調(diào)滿量程再回來驗(yàn)證零點(diǎn)迭代兩三次就會(huì)收斂。關(guān)鍵代碼如下int32_t calibrate_zero(int32_t current_code) { int32_t code current_code; int32_t step 32; int32_t error_prev 0; while (step 1) { write_rdac(code); int32_t vout adc_read_output_voltage(); int32_t error vout - TARGET_ZERO_UV; if (error 0) { code - step; } else if (error 0) { code step; } else { break; } // 變步長(zhǎng)如果誤差方向改變縮小步長(zhǎng) if ((error 0) ! (error_prev 0)) { step / 4; if (step 1) step 1; } error_prev error; // 限幅保護(hù) if (code 1023) code 1023; if (code 0) code 0; } return code; }這個(gè)過程中外部ADC的精度決定了校準(zhǔn)結(jié)果的上限。我用了ADS1256這樣24位的Δ-Σ ADC做測(cè)量單靠MCU內(nèi)部12位ADC來校準(zhǔn)模擬輸出完全不夠用測(cè)量噪聲本身就超過目標(biāo)誤差了。4.3 溫度補(bǔ)償與零漂處理校準(zhǔn)完成后的參數(shù)不能直接燒死因?yàn)闇囟茸兓瘯r(shí)電路參數(shù)還會(huì)漂。工業(yè)設(shè)備工作溫度范圍寬那就需要做溫度補(bǔ)償。我的做法是在板上放一個(gè)溫度傳感器在-20°C、25°C、70°C三個(gè)溫度點(diǎn)分別做一次完整校準(zhǔn)把每一點(diǎn)的碼值記錄下來。實(shí)際運(yùn)行時(shí)根據(jù)當(dāng)前溫度對(duì)三個(gè)點(diǎn)做線性插值得到實(shí)時(shí)補(bǔ)償碼值。這里學(xué)到的經(jīng)驗(yàn)是AD5293本身的溫漂很小補(bǔ)償主要針對(duì)運(yùn)放和DAC的溫漂。所以如果系統(tǒng)里溫度變化大不要指望固件里一套固定參數(shù)走天下至少要做分段插值。4.4 實(shí)測(cè)結(jié)果以我們通道3的實(shí)測(cè)數(shù)據(jù)為例校準(zhǔn)前零點(diǎn)偏移了5.8mV滿量程偏差了12.3mV。經(jīng)過兩輪零點(diǎn)和滿量程迭代后零點(diǎn)誤差降到了0.3mV滿量程誤差降到了2.1mV。通道校準(zhǔn)前零點(diǎn)誤差校準(zhǔn)后零點(diǎn)誤差校準(zhǔn)前滿量程誤差校準(zhǔn)后滿量程誤差16.2mV-0.4mV15.1mV3.2mV2-4.8mV0.2mV-10.6mV-1.8mV35.8mV0.3mV12.3mV2.1mV4-7.1mV-0.5mV9.8mV-2.6mV原來產(chǎn)線上校準(zhǔn)一個(gè)通道需要人工操作大約3分鐘現(xiàn)在全自動(dòng)跑完8個(gè)通道只需要40秒。一致性也明顯提升返修率降了一個(gè)數(shù)量級(jí)。5. 工業(yè)現(xiàn)場(chǎng)最容易翻車的五個(gè)地方及排查思路5.1 模擬地與數(shù)字地鋪銅不是萬能的很多工程師畫板時(shí)習(xí)慣把整個(gè)底層鋪一塊完整地銅覺得地的問題就解決了。但在這種模擬混合電路里數(shù)字SPI信號(hào)的高頻翻轉(zhuǎn)電流會(huì)在公共地上產(chǎn)生壓降這個(gè)壓降會(huì)通過AD5293的模擬地引腳耦合進(jìn)電阻網(wǎng)絡(luò)。我的處理方式是在AD5293下方把模擬地和數(shù)字地分開在芯片附近的單點(diǎn)連接連接點(diǎn)選在電源地入口處。如果你去看ADI的評(píng)估板布局會(huì)發(fā)現(xiàn)他們也是這么做的。不要迷信完整地平面至少要在布局上把數(shù)字信號(hào)和模擬信號(hào)走向分開。5.2 SPI干擾導(dǎo)致寄存器值被改寫現(xiàn)場(chǎng)反饋過一個(gè)問題電機(jī)啟動(dòng)瞬間某些通道的輸出電壓跳變。排查過程是這樣的先查電源紋波排除±12V輸出紋波變化小于20mV再查運(yùn)放電路正常最后翻到AD5293回讀寄存器值發(fā)現(xiàn)碼值在電機(jī)啟動(dòng)瞬間變了。原因分析SPI線從MCU到AD5293走線較長(zhǎng)且沒有做阻抗匹配和濾波電機(jī)啟停時(shí)空間電磁干擾在SCLK線上感應(yīng)出脈沖被芯片誤判為時(shí)鐘信號(hào)導(dǎo)致寄存器被意外寫入。解決方案有兩層。硬件上在SPI線靠近AD5293引腳處串聯(lián)33Ω電阻并且縮短走線確保SPI線不經(jīng)過板邊、不穿過大電流環(huán)路。軟件上啟用前面提到的周期性回讀校驗(yàn)一旦發(fā)現(xiàn)碼值漂移立即重寫期望值并上報(bào)日志。這個(gè)排查過程持續(xù)了將近兩天教訓(xùn)是數(shù)字電位器受干擾的表現(xiàn)往往是輸出電壓“輕微跳動(dòng)”很容易被誤判為模擬電路問題沒有回讀功能的話很難定位。5.3 電源上下電順序不對(duì)導(dǎo)致閂鎖AD5293的規(guī)格書里對(duì)電源序列是有要求的。有一次我在實(shí)驗(yàn)室調(diào)試反復(fù)上下電幾十次之后有一顆AD5293的電阻輸出直接卡死在某個(gè)位置怎么寫入都改不了。后來查了故障分析報(bào)告確認(rèn)是模擬電源先于數(shù)字電源上電導(dǎo)致的閂鎖。解決方式就是前面硬件部分提到的用MCU的GPIO控制模擬電源的使能確保3.3V數(shù)字電源穩(wěn)定輸出后再開啟±12V。同時(shí)在上電初始化代碼里延時(shí)50ms后再進(jìn)行第一次SPI寫入給芯片留足內(nèi)部穩(wěn)定時(shí)間。5.4 固件升級(jí)瞬間電阻跳到中位的處理AD5293上電默認(rèn)到中位這個(gè)特性在平時(shí)是優(yōu)點(diǎn)但在固件升級(jí)、MCU強(qiáng)制復(fù)位的時(shí)候會(huì)變成麻煩。因?yàn)镸CU復(fù)位瞬間如果正在通信的半途中斷AD5293收到的可能是殘缺幀寄存器可能被寫成任意值。我在看門狗復(fù)位和固件跳轉(zhuǎn)到Bootloader前會(huì)先執(zhí)行一段“安全化”代碼把AD5293寫入一個(gè)預(yù)設(shè)的安全碼值同時(shí)設(shè)置一個(gè)GPIO把模擬輸出鏈路切換到安全狀態(tài)。即使MCU后邊因?yàn)楫惓V貑⒘酥辽偻獠吭O(shè)備不會(huì)因?yàn)殡娮柚低蛔兌艿經(jīng)_擊。另外硬件上可以在AD5293的SYNC引腳加一個(gè)上拉電阻。因?yàn)镾YNC內(nèi)部可能有弱上拉但外力干擾時(shí)仍可能被拉低加上一個(gè)10kΩ外部上拉會(huì)更穩(wěn)避免MCU復(fù)位期間SYNC浮空導(dǎo)致誤通信。5.5 物料選型和采購的坑AD5293有不同阻值版本20kΩ、50kΩ、100kΩ后綴不一樣引腳卻完全兼容。生產(chǎn)線上曾經(jīng)出現(xiàn)過貼錯(cuò)料的情況50kΩ的芯片貼到了20kΩ的位置校準(zhǔn)算法怎么跑都達(dá)不到目標(biāo)最后逐板查物料才定位。另外數(shù)字電位器不是所有型號(hào)都適合做精密應(yīng)用。普通數(shù)字電位器尾綴里如果帶“S”或者精度等級(jí)不同初始容差差異很大。采購一定要鎖定制訂的完整型號(hào)AD5293BRUZ-20-RL7中BRUZ是封裝和溫標(biāo)信息RL7是卷帶包裝。PCB設(shè)計(jì)階段就建議把物料編碼放入BOM并在板子上絲印標(biāo)注減少產(chǎn)線混料風(fēng)險(xiǎn)。做一個(gè)很小的補(bǔ)充吧。如果你之后也想做類似設(shè)計(jì)建議最初就畫一個(gè)“電阻值校準(zhǔn)記錄表”放在固件里每臺(tái)設(shè)備出廠時(shí)把每個(gè)通道的校準(zhǔn)碼值、校準(zhǔn)溫度、校準(zhǔn)時(shí)間都存儲(chǔ)下來。這樣一方面方便追溯另一方面如果某臺(tái)設(shè)備在現(xiàn)場(chǎng)出現(xiàn)溫漂異常可以直接和出廠數(shù)據(jù)對(duì)比判斷是老化問題還是環(huán)境變化調(diào)試效率會(huì)高很多。