AD7606B是AD7606模數數據采集系統(DAS)的增強版。AD7606B可用作AD7606的引腳替代直接引腳,稱為硬件模式,其優點如表1所示。但是,軟件模式下的AD7606B具有以下高級特性:
基于每個通道的獨立范圍選擇,包括 ±2.5 V 范圍選項
系統增益/相位/失調片內校準
額外的過采樣率(OSR = 128 和 256)
可選的 1、2 或 4 個串行數據輸出配置
診斷和監測
參數 | AD7606 | AD7606B (硬件模式) | AD7606B (軟件模式) |
典型輸入阻抗 | 1兆安 | 5兆安 | 5兆安 |
最大吞吐率 | 200 千秒 | 800 千秒 | 800 千秒 |
溫度范圍 | ?40°C 至 +85°C | ?40°C 至 +125°C | ?40°C 至 +125°C |
在駕駛范圍 | 2.3 V 至 5.25 V | 1.71 V 至 3.6 V | 1.71 V 至 3.6 V |
絕對最大輸入電壓 | ±16.5 V | ±21 V | ±21 V |
模擬輸入范圍 | ±10 V 或 ±5 V1 | ±10 V 或 ±5 V1 |
±10 V、±5 V 或 ±2.5 V2 |
系統增益、相位和失調片內校準 | 不適用 | 無法訪問 | 可用2 |
過采樣率 |
從無過采樣 到 OSR = 64 |
從無操作系統 到 OSR = 64 |
從無操作系統 到 OSR = 256 |
開路檢測 | 不適用 | 無法訪問 | 可用2 |
串行數據輸出線 | 2 | 2 |
可選: 1、2 或 4 |
診斷 | 不適用 | 無法訪問 | 可用 |
1不是基于每個通道。
2以每個通道為基礎。
軟件或寄存器模式通過將三個過采樣數字輸入(OS2、OS1和OS0)連接高電平來啟用,從而允許訪問配置寄存器映射以利用前面所述的功能。有關向后兼容性、如何在硬件模式和軟件模式下從AD1559遷移到AD7606B以及如何在串行(SDI引腳)和并行接口(WR引腳)中寫入寄存器映射的完整詳細信息,請參見AN-7606應用筆記。
本應用筆記介紹了AD7606B在軟件模式下提供的各種高級特性及其對系統級的影響。有關AD7606B的完整詳細信息,請參見AD7606B數據手冊。請結合本應用筆記查閱本數據手冊。
通知
本應用筆記中包含的軟件片段版權歸ADI公司2021所有?。保留所有權利。本軟件歸ADI公司及其許可方所有。本軟件按“原樣”提供,不作任何形式的陳述、保證、擔保或責任。該軟件的使用受 Clear BSD 許可證的條款和條件的約束。有關固件示例代碼的更多信息,請訪問AD7606 Mbed IIO應用維基頁面。
初始化AD7606B
上電時進入軟件模式
要在軟件模式下初始化AD7606B,請確保滿足以下條件:
所有三個過采樣引腳(OS2、OS1 和 OS0)必須連接到邏輯高電平。
PAR/SER 引腳連接得低或高,具體取決于所使用的數據接口,分別是并行或串行。
RANGE引腳可以連接為低電平或高電平,因為在軟件模式下會被忽略。范圍通過每個通道的相應寄存器進行選擇。
在上一個列表中提到的初始化過程之后,AD7606B配置為軟件模式,寄存器處于默認狀態。在本應用筆記和“通知”部分,以軟件串行模式下使用AD7606B為例。
初始化后,電壓引腳通常如下:
AVCC = 5.0 V
在駕駛= 3.3 V、2.5 V 或 1.8 V
REGCAP = 1.9 V
精煉/重新輸出 = 2.5 V
REFCAPA, REFCAPB = 4.4 V
驗證上述引腳上的電壓時,發出復位可確保AD7606B上正確加載默認參數。若要發出重置,請使用以下代碼:
int32_t ad7606_reset(struct ad7606_dev *dev)
{
int32_t ret; ret = gpio_set_value(dev->gpio_reset, 1); udelay(3); ret = gpio_set_value(dev->gpio_reset, 0); ad7606_reset_settings(dev);
return ret;
}
AD7606B 通過寄存器讀取進行檢查
AD7606B初始化后,寄存器值均為默認值,如AD7606B數據手冊所示。用戶可以檢查 DEVICE_ID、SILICON_REVISION 或 RESET_DETECT 位 內存映射,例如,確認收到有效的完全或部分重置。以下代碼中顯示了單個AD7606B寄存器讀取功能作為基準。將寄存器地址替換為包含DEVICE_ID位、SILICON_REVISION位或RESET_DETECT位的寄存器。串行外設接口(SPI)模式2可用于微控制器(MCU)或數字信號處理器(DSP)與AD7606B之間的直接連接。
int32_t ad7606_spi_reg_read(struct ad7606_dev
*dev,
uint8_t reg_addr,
uint8_t *reg_data)
{
uint8_t buf[3];
uint32_t sz = 2;
int32_t ret;
buf[0] = AD7606_RD_FLAG_MSK(reg_addr);
buf[1] = 0x00;
ret = spi_write_and_read(dev->spi_desc,buf, sz);
if (ret < 0)
return ret;
dev->reg_mode = true;
buf[0] = AD7606_RD_FLAG_MSK(reg_addr);
buf[1] = 0x00;
ret = spi_write_and_read(dev->spi_desc,buf, sz);
if (ret < 0)
return ret;
if (reg_data)
*reg_data = buf[1];
return ret;
}
寄存器配置
在電壓正確且SPI正常工作后,必須根據所需的應用寫入寄存器以加載工作配置,例如范圍、過采樣或診斷等參數。無操作系統驅動程序中包含的某些函數(如 ad7606_ set_oversampling() 或 ad7606_set_ch_range())有助于寫入寄存器,如過采樣或范圍配置。反過來,這些函數使用 ad7606_spi_reg_write() 函數,該函數通常用于寫入任何設備寄存器。若要寫入寄存器,請使用以下代碼:
int32_t ad7606_spi_reg_write(struct ad7606_dev *dev,
uint8_t reg_addr,
uint8_t reg_data)
{
uint8_t buf[3];
int32_t ret;
uint32_t sz = 2;
/* Dummy read to place the chip in register mode. */
if (!dev->reg_mode) {
ret = ad7606_spi_reg_read(dev, reg_addr, NULL);
}
buf[0] = AD7606_WR_FLAG_MSK(reg_addr);
buf[1] = reg_data;
ret = spi_write_and_read(dev->spi_desc, buf, sz);
return ret;
}
校準功能
雖然AD7606B選擇了硬件模式,但該器件的引腳和功能與AD7606完全兼容。如AN-7606應用筆記所述,AD1559B帶來的優勢是更高的輸入阻抗、更高的吞吐速率、更寬的溫度范圍和更低的數字電源電壓工作范圍。但是,通過將三個過采樣引腳(引腳 3、引腳 4 和引腳 5)連接高電平進入軟件模式,可以實現許多高級功能,從而帶來系統級優勢,如以下部分所述。
模擬輸入范圍
在AD7606上,數字輸入RANGE引腳(引腳8)上的極性決定了八個模擬輸入通道的輸入范圍。如果該引腳連接到邏輯高電平,則所有通道的模擬輸入范圍均為±10 V。如果該引腳連接到邏輯低電平,則所有通道的模擬輸入范圍均為±5 V。該引腳上的邏輯變化會立即影響模擬輸入范圍。
同樣,在硬件模式下的AD7606B上,所有通道的模擬輸入范圍通過RANGE引腳選擇。但是,在軟件模式下,模擬輸入范圍是按通道選擇的。為此,使用寄存器0x03到寄存器0x06分別設置每個通道的范圍。
例如,在圖1所示的RANGE_CH2_CH0寄存器(地址03x1)中,四個MSB確定通道2上的模擬輸入范圍,四個LSB確定通道1上的模擬輸入范圍。模擬輸入電壓可選擇±2.5 V、±5 V或±10 V單端。
圖1.RANGE_CH1_CH2 注冊,地址0x03
這種每通道模擬輸入范圍選擇允許在每個通道上設置不同的范圍,例如,如果電壓和電流通道在能源監控應用中需要不同的范圍,這可能是有益的。每通道模擬輸入范圍選擇還可用于在測量和保護通道上設置不同的范圍,例如,在能量保護應用中。
系統失調誤差校準
軟件模式下的AD7606B具有寄存器,用于補償系統中存在的失調誤差,無論這些誤差是由于傳感器的固有失調誤差還是傳感器之間的不匹配引起的。 每個模擬輸入端的前端電阻(Vx和VxGND),例如圖2所示的濾波電阻(RFILTER)。
圖2.片內增益/失調校準
每個通道的8位長寄存器(地址0x11到地址0x18)允許AD7606B以數字方式將?128 LSB(寫入寄存器0x00)到+127 LSB(寫入寄存器0xFF)的失調添加到模數轉換器(ADC)轉換數據,以補償此類系統失調誤差。
換言之,添加到ADC代碼的失調(以LSB為單位)等于CHx_OFFSET寄存器減去128。表2顯示了CHx_OFFSET寄存器數據寫入以及從ADC代碼增加/減去相應失調的示例。
CH1_OFFSET注冊 | 偏移校準 |
0x00 | ?128 LSB |
0x45 | ?59 LSB |
0x80(默認) | 0 LSB |
0x83 | +3 LSB |
0xFF | +127 LSB |
如圖2所示,通過將兩個輸入連接在一起并將它們連接到模擬地(AGND),可以通過讀取ADC代碼獲得系統失調。然后可以通過寫入相應的寄存器來校準該系統偏移。
例如,如果連接在通道1上的傳感器的失調相當于10 LSB(多個ADC數據讀取的平均值,以消除噪聲引起的分布),或者當輸入接地時,前端電阻上的不匹配導致ADC代碼為10 LSB,則必須在每次轉換時從ADC代碼中減去10 LSB以消除該失調。由于128是失調寄存器上的默認值,因此使用1x0(11d(十進制))寫入CH0_OFFSET寄存器(地址76x118),AD7606B有效地從每個ADC轉換代碼中減去10個LSB。因此,該系統失調誤差可以通過片內寄存器進行內部補償,從而消除了在后端通過軟件進行補償的負擔。要了解有關如何對CHx_OFFSET寄存器進行編程的更多信息,請參考AD7606B產品頁面中的AD7606x軟件型號。
圖3.CH1_OFFSET寄存器、地址0x11、默認值0x80
要執行失調誤差校準,請使用以下代碼:
int32_t ad7606_set_ch_offset(struct ad7606_dev
*dev, uint8_t ch, int8_t offset)
{
int ret;
uint8_t value = (uint8_t)(offset - 0x80);
if (ch >= dev->num_channels)
return -EINVAL;
ret = ad7606_spi_reg_write(dev,
AD7606_REG_OFFSET_CH(ch), value);
dev->offset_ch[ch] = offset;
return ret;
}
系統增益誤差校準
根據每個通道上選擇的模擬輸入范圍,可編程增益放大器(PGA)配置為選擇適當的增益(反饋電阻(RFB)/輸入電阻(RIN)) 調整模擬輸入信號以滿足ADC的輸入范圍。
圖4.模擬輸入電路,AD7606的RIN為1 MΩ,而AD7606B的RIN為5 MΩ
在內部,AD7606B對R具有嚴格的控制FB和 R在,使得該理想增益通過工廠調整精確設置,假設前端沒有電阻。但是,如果在前端放置一個外部電阻,例如用于保護或額外濾波,則實際增益不再是理想的RFB/R在.
添加 R濾波器串聯到 R在修改除數,通過添加額外的增益誤差來改變實際系統增益。R 越大濾波器使用時,引入的增益誤差越大,如圖5所示。對于給定的 R濾波器,因為 R在AD7606B的增益誤差(5 MΩ)比AD7606(1 MΩ)大得多,增益誤差由R濾波器與AD7606相比,AD7606B的尺寸要小得多。因此,AD7606B對放置外部R引入的增益誤差不太敏感。濾波器到設備。
圖5.R引入的系統增益誤差濾波器AD7606或AD7606B(校準使能或禁用)通過片內校準
了解AD7606數據手冊和AD7606B數據手冊中提供的典型輸入電阻后,如果有可用資源,可以對控制器側的后端校準(現場可編程門陣列(FPGA)、DSP)進行編程。但是,如果在軟件模式下使用AD7606B,則每個通道的片內寄存器可以自動補償此系統增益誤差。由于AD7606B的輸入阻抗在每個器件上都是內部準確的,因此其自動增益校準始終比基于輸入阻抗典型值編程的任何后端校準更精確,從而減輕了在控制器端進行所有校準計算的負擔。圖6所示,在AD7606B上針對特定范圍的R進行校準的示例濾波器值。
圖6.應用后端校準(假設RIN等于典型輸入阻抗值)與應用片上校準相比的總誤差
圖7.具有每通道增益校準功能的模擬信號鏈,可減輕后端數字控制器的負擔
要使用增益校準功能,分配寄存器0x09到寄存器0x10以對R進行編程濾波器在每個通道上使用,最高可達65 kΩ,分辨率為1024 Ω。使用此功能,系統增益誤差可以保持在0.02%以下,與R無關濾波器,如圖 5 所示。如果使用后端校準,則由于輸入阻抗的不確定性,請考慮額外的誤差幅度。
例如,27 kΩ R引入的系統增益誤差濾波器通道5前端使用,通過將0x1B(27d)寫入CH5_GAIN寄存器(地址0x0D)進行自動補償,如圖8所示。要了解有關如何對CHx_GAIN寄存器進行編程的更多信息,請參考AD7606B產品頁面中的AD7606x軟件模型。
圖8.CH5_GAIN 寄存器,地址0x0D
為了配置通道的增益,以下代碼執行前面提到的功能:
int32_t ad7606_set_ch_gain(struct ad7606_dev
*dev, uint8_t ch,
uint8_t gain)
{
int ret;
if (ch >= dev->num_channels)
return -EINVAL;
gain = field_get(AD7606_GAIN_MSK, gain);
ret = ad7606_spi_reg_writewrite(dev,
AD7606_REG_GAIN_CH(ch), gain);
dev->>gain_ch[ch] = gain;
return ret;
系統相位誤差校準
當通過電流互感器測量同一電源線上的電壓和電流時,兩個通道之間存在相位不匹配。如果 R 不匹配,則可能會發生類似的事情濾波器和濾波電容(C濾波器) 之間 必須同時采樣的兩個通道。
AD7606B可通過延遲內部采樣時刻來內部補償系統相位誤差。在圖 9 所示的示例中,存在輕微的延遲 (tPHASE_REG) 在通道 1 和通道 4 之間。如果知道此時間延遲,則通過編程 它返回到CH4_PHASE寄存器(地址0x1C),通道4實際上是采樣的tPHASE_REGV1之后的時間,補償兩個通道之間的相位失配并提供同相輸出。
請注意,延遲任何通道都意味著延長BUSY 引腳高電平時間,即轉換時間(t卷積) 的擴展與編程最延遲的通道一樣多,因此,最大吞吐速率可能會受到影響。
圖9.系統相位校準功能
每個通道有一個相位寄存器,地址0x19到地址0x20,允許以1.25 μs的分辨率單獨補償每個通道上的相位誤差,并且每個通道中相對于CONVST引腳信號的時間延遲高達318.75 μs。
要檢查此功能,請執行以下步驟:
向所有信號鏈輸入施加一個交流電源(或具有精確相位控制的多通道校準器),如50 Hz或60 Hz。
捕獲足夠的通道代碼,以通過快速傅里葉變換 (FFT)、離散傅里葉變換 (DFT) 或其他方法計算通道到通道組的延遲匹配。
以1.25 μs的步長計算CHx_PHASE_OFFSET寄存器值。
將相位匹配誤差寄存器寫入AD7606B。
若要寫入相位匹配錯誤寄存器,請使用以下代碼:
int32_t ad7606_set_ch_phase(struct ad7606_dev
*dev, uint8_t ch, uint8_t phase)
{
int ret;
if (ch >= dev->num_channels)
return -EINVAL;
ret = ad7606_spi_reg_write(dev,
AD7606_REG_PHASE_CH(ch), phase);
dev->phase_ch[ch] = phase;
return ret;
}
開路檢測
如AN-1559應用筆記所述,因為AD7606B具有更大的R在比AD7606(5 MΩ對比1 MΩ)更容易檢測傳感器何時斷開 通過使用給定的下拉電阻(R帕金森) 允許與傳感器并聯。R的增加在當傳感器斷開連接時,ADC輸出代碼較低。
圖 10.帶 R 的模擬前端帕金森
進入AD7606B的軟件模式時,有一個開路檢測功能,默認情況下禁用,有兩種可能的模式:手動和自動開路檢測。
手動模式
默認情況下,開路檢測功能處于禁用狀態,但將0x01寫入OPEN_DETECT_QUEUE寄存器(地址0x2C)可啟用手動開路檢測模式。
圖 11.OPEN_DETECT_QUEUE 寄存器,地址0x2C
在手動模式下,如果ADC代碼重復多次轉換,則在假設傳感器已斷開連接之前,可以通過更改PGA共模來驗證斷開連接。PGA的共模電壓由OPEN_DETECT_ENABLE寄存器(地址0x23)中相應的CHx_OPEN_DETECT_EN位控制,每個通道,如圖12所示。如果更改給定通道上的PGA共模會更改ADC輸出代碼,則表示傳感器已斷開連接。否則,傳感器仍連接到模擬輸入。
圖 12.OPEN_DETECT_ENABLE 寄存器,地址0x23
此方法仍然需要一些后端工作。檢測N個重復采樣(低于閾值),更改PGA共模,然后驗證ADC輸出代碼是否隨共模變化而變化。通過啟用自動模式可以消除這種負擔,該模式允許AD7606B自動檢測何時發生開路。若要在手動模式下實現開路檢測算法,請使用以下代碼:
/* Enter into manual open circuit detection mode */
do {
if (ad7606_spi_reg_write(device, AD7606_REG_OPEN_DETECT_QUEUE, 1) == SUCCESS) {
/* Read the ADC on selected chnnel (first reading post open circuit detection start) */
prev_adc_code = single_data_read(device,
channel->ch_num - 1,
attr_polarity_val[channel->ch_num - 1]);
/* Perform N conversions and monitor the code delta */
for (cnt = 0; cnt < MANUAL_OPEN_DETECT_CONV_CNTS; cnt++) {
/* Check if code is within 350LSB (nearest ZS code) */
if (prev_adc_code>= 0 && prev_adc_code < MANUAL_OPEN_DETECT_ENTRY_TRHLD)
{
/* Perform next conversion and read the result */
curr_adc_code = single_data_read(device,
channel->ch_num - 1,
attr_polarity_val[channel->ch_num - 1]);
/* Check if delta b/w current and previus reading is within 10 LSB code */
if (abs(curr_adc_code - prev_adc_code) > MANUAL_OPEN_DETECT_CONV_TRSHLD) {
open_detect_done = true;
break;
}
/* Get the previous code */
prev_adc_code = curr_adc_code;
} else {
open_detect_done = true;
break;
}
}
/* Break if open circuit detection aborted (in case above conditions not met) */
if (open_detect_done)
break;
/* Set common mode high (enabling open circuit detect on selected channel) */
if (ad7606_spi_reg_write(device,
AD7606_REG_OPEN_DETECT_ENABLE,
(1 << ((channel->ch_num) - 1))) == SUCCESS) {
/* Perform next conversions (~2-3) and read the result (with common mode set high) */
for (cnt = 0; cnt < MANUAL_OPEN_DETECT_CM_CNV_CNT; cnt++) {
udelay(100);
curr_adc_code = single_data_read(device,
channel->ch_num - 1,
attr_polarity_val[channel->ch_num - 1]);
}
/* Check if delta b/w common mode high code and previous N conversion code is >
threshold */
if ((curr_adc_code - prev_adc_code) < MANUAL_OPEN_DETECT_THRESHOLD_RPD50K) {
open_detect_done = true;
break;
}
} else {
return -EINVAL;
}
/* Break if open circuit detection aborted (in case above conditions not met) */
if (open_detect_done)
break;
/* Set common mode low (disabling open circuit detect on channel) */
if (ad7606_spi_reg_write(device,
AD7606_REG_OPEN_DETECT_ENABLE,
0) == SUCCESS) {
/* Perform next conversion and read the result (with common mode set low) */
curr_adc_code = single_data_read(device,
channel->ch_num - 1,
attr_polarity_val[channel->ch_num - 1]);
/* Check if delta b/w common mode low code and previous N conversion code is <
threshold */
if (abs(curr_adc_code - prev_adc_code) < MANUAL_OPEN_DETECT_THRESHOLD_RPD50K) {
open_detect_flag = true;
open_detect_done = true;
}
} else {
return -EINVAL;
}
} else {
return -EINVAL;
}
} while (0);
自動模式
在自動模式下,以前的方法是在芯片上實現的,消除了檢測傳感器斷開連接的后端軟件的負擔。自動模式通過在標志觸發之前寫入轉換次數 (N) 來啟用,如圖 11 所示。然后,可以通過OPEN_DETECT_ENABLE寄存器單獨啟用或禁用每個通道檢查器(圖 12)。
該算法在圖13的圖表中進行了簡化,在后臺運行,如果在特定通道中觸發錯誤標志,則可以在OPEN_檢測到寄存器(地址0x24)或STATUS報頭(如果附加到ADC數據)或STATUS寄存器中檢查該算法。
圖 13.自動開路檢測算法
以下代碼在自動模式下實現開路檢測算法。自動檢測開路所需的時間取決于其他元件,如外部RC元件和過采樣率。要計算此時間,建議訪問AD7606B產品頁面并下載“工具和仿真”部分提供的設計工具。該工具允許用戶了解有關本應用筆記中描述的其他校準功能的更多信息。
/* Enter into open circuit auto open detect mode */
if (ad7606_spi_reg_write(device,
AD7606_REG_OPEN_DETECT_QUEUE,
open_detect_queue_cnts[channel->ch_num - 1]) == SUCCESS) {
/* Enable open circuit detection on selected channel */
if (ad7606_spi_reg_write(device,
AD7606_REG_OPEN_DETECT_ENABLE,
(1 << ((channel->ch_num) - 1))) == SUCCESS) {
/* Monitor the open detect flag for max N+15 (open detect queue count) conversions.
* Note: In ideal scenario, the open detect flash should be monitored continuously while
* background N conversions are in progress */
for (conv_cnts = 0;
conv_cnts < (open_detect_queue_cnts[channel->ch_num - 1] +
AUTO_OPEN_DETECT_QUEUE_EXTRA_CONV_CNT);
conv_cnts++) {
if (ad7606_convst(device) == SUCCESS) {
udelay(100);
/* Monitor the open detect flag */
if (ad7606_spi_reg_read(device,
AD7606_REG_OPEN_DETECTED,
&open_detect_flag) == SUCCESS) {
open_detect_flag >>= (channel->ch_num - 1);
open_detect_flag &= 0x1;
rw_status = SUCCESS;
if (open_detect_flag) {
break;
}
} else {
rw_status = FAILURE;
break;
}
} else {
rw_status = FAILURE;
break;
}
}
}
監視和診斷功能
過壓 (OV)/欠壓 (UV)
AD7606B上的每個模擬輸入V1至V8和V1GND至V8GND均內置比較器電路,用于監控過壓和欠壓事件。默認情況下,此電路處于禁用狀態。這些比較器中的任何一個都可以通過AIN_OV_UV_DIAG_ENABLE寄存器(地址0x25)單獨使能,以便監控模擬輸入電壓,并在超過OV閾值或UV閾值時觸發警報。
圖 14.每個模擬輸入上的過壓和欠壓電路
電路使能時,當任何模擬輸入引腳上的電壓超過AD7606B數據手冊中顯示的OV閾值時,AIN_OV_DIAG_ERROR寄存器(地址0x26)顯示哪個或多個通道發生過壓事件。
當任何模擬輸入引腳上的電壓低于AD7606B數據手冊中所示的UV閾值時,AIN_UV_ DIAG_ERROR寄存器(地址0x27)顯示哪個或哪些通道發生欠壓事件。
這些監控標志允許用戶或控制器快速了解電路保護應用中的模擬輸入何時超過滿量程電壓,并超過可能對電路其余部分構成潛在風險的電壓電平,從而允許控制器采取任何措施幫助保護系統。
接口檢查
使用接口檢查確保數據從AD7606B正確傳輸到數字控制器。通過DIGITAL_DIAG_ENABLE寄存器(地址7x0)上的第21位進行接口檢查,無論是定期還是在發生可能導致數據傳輸錯誤的事件時,使AD7606B時鐘輸出固定數據值而不是轉換結果。這樣,如果接收的數據與AD7606B發送的固定數據匹配,則驗證通信是否執行時沒有數據損壞。
圖 15.AD7606B(目標)和主機控制器之間的數據傳輸線
有關數字接口檢查的更多信息,請參見AD7606B數據手冊。
SPI 讀/寫無效
嘗試讀回無效寄存器地址時,將設置SPI_READ_ERR位(地址 0x22,位 4)。可以通過設置SPI_READ_ERR_EN位(地址 0x21,位 4)來啟用無效回讀地址檢測。如果觸發了 SPI 讀取錯誤,則通過覆蓋該位或禁用檢查器來清除該錯誤。
嘗試寫入無效寄存器地址或只讀寄存器時,將設置SPI_WRITE_ERR位(地址0x22,位 3)。可以通過設置 SPI_WRITE_ERR_EN 位(地址 0x21,位 3)來啟用無效寫入地址檢測。如果觸發了 SPI 寫入錯誤,則通過覆蓋該位或禁用檢查器來清除該錯誤。
忙得不可開交
通過DIGITAL_DIAG_ENABLE寄存器(地址0x21,第5位)使能時,BUSY_STUCK_HIGH_ERR_EN監控位允許AD7606B在AD7606因任何不太可能的原因停止執行轉換(BUSY 線路卡住)時,通過置位BUSY_STUCK_HIGH_ERR位(地址0x22,第5位)向控制器發出警報。如果發生這種情況,則此位的斷言表示自動發出部分復位以恢復正常操作。
有關BUSY 卡住高電平監控功能的更多信息,請參見AD7606B數據手冊。
診斷多路復用器
所有3個輸入通道均在PGA前面包含一個診斷多路復用器,用于監控表7606中所述的內部節點,以確保AD3B正常工作。例如,表1顯示了通道<>上診斷多路復用器寄存器的位解碼。選擇內部節點時,輸入引腳上的輸入電壓將從PGA中取消選擇。
地址0x28 | 通道 1 上的信號 | ||
位 2 | 位 1 | 位 0 | |
0 | 0 | 0 | V1 版 |
0 | 0 | 1 | 溫度傳感器 |
0 | 1 | 0 | 4 × V裁判 |
0 | 1 | 1 | 4 × 奧爾多 |
1 | 0 | 0 | 4 × DLDO |
1 | 0 | 1 | 在駕駛 |
1 | 1 | 0 | 阿格德 |
1 | 1 | 1 | 之抄送 |
溫度傳感器
溫度傳感器可通過診斷多路復用器進行選擇,并通過ADC進行轉換,如AD7606B數據手冊所示。溫度傳感器電壓是測量的,與芯片溫度成正比,如下式所示。
通常,溫度傳感器的采樣電壓在室溫下約為0.69 V。
基準電壓源、模擬低壓差 (ALDO)、數字低壓差 (DLDO)、V駕駛邏輯電源電壓、AGND和AV抄送模擬電源電壓可以以相同的方式進行自我檢測。
使用以下代碼讀取溫度傳感器。
ssize_t get_chn_temperature(void *device,
char *buf,
size_t len,
const struct iio_ch_info *channel)
{
int32_t adc_chn_data = 0;
float temperature;
float voltage;
/* Configure the channel multiplexer to select temperature read */
if (ad7606_spi_write_mask(device,
AD7606_REG_DIAGNOSTIC_MUX_CH(channel->ch_num - 1),
AD7606_DIAGN_MUX_CH_MSK(channel->ch_num - 1),
AD7606_DIAGN_MUX_CH_VAL((channel->ch_num - 1),
TEMPERATURE_MUX)) == SUCCESS) {
/* Allow to settle Mux channel */
udelay(100);
/* Sample the channel and read conversion result */
adc_chn_data = single_data_read(device, channel->ch_num - 1,
attr_polarity_val[channel->ch_num - 1]);
/* Convert ADC data into equivalent voltage */
voltage = convert_adc_raw_to_voltage(adc_chn_data,
attr_scale_val[channel->ch_num - 1]);
/* Obtain the temperature using equation specified in device datasheet */
temperature = ((voltage - 0.69068) / 0.019328) + 25.0;
return (ssize_t)sprintf(buf, "%f", temperature);
}
return -EINVAL;
}
圖 16.忙 卡在高處
審核編輯:郭婷
-
電源
+關注
關注
184文章
17206瀏覽量
247778 -
溫度傳感器
+關注
關注
48文章
2854瀏覽量
155316 -
DAS
+關注
關注
0文章
103瀏覽量
31014
發布評論請先 登錄
相關推薦
評論