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.忙 卡在高处
审核编辑:郭婷
全部0条评论
快来发表一下你的评论吧 !