TI中文支持网
TI专业的中文技术问题搜集分享网站

AMC7812B采集电压

我想使用amc7812b的16个通道进行ADC转换,如下是我对amc7812b芯片寄存器的一些配置,已经确认过读写寄存器没有问题,按照手册的说明应该是一直转换的,可是我给通道0一个1.8v的电压,然后去读取数据寄存器,发现里面的数据都是0,没有转换。为什么??寄存器的配置不对吗?

status_t AMC7812b_RT_Init(amc7812b_rt_handle_t *handle, LPI2C_Type *base)
{
    status_t status;
 assert(base);

    if (!base)
    {
        return kStatus_InvalidArgument;
    }

    handle->base = base;
 status = AMC7812b_RT_Write(handle, AMC7812B_CONFIG_REGISTER0, 0x2400);
 status = AMC7812b_RT_Write(handle, AMC7812B_Temperature_CONFIG_REGISTER, 0x00ff);
 status = AMC7812b_RT_Write(handle, AMC7812B_CHANNEL0_REGISTER, 0x6dff);
 status = AMC7812b_RT_Write(handle, AMC7812B_CHANNEL1_REGISTER, 0x7000);
 status = AMC7812b_RT_Write(handle, AMC7812B_CONFIG_REGISTER1, 0x0070);
 status = AMC7812b_RT_Write(handle, AMC7812B_CONFIG_REGISTER0, 0x3400);
    return status;
}

//调用函数读取数据寄存器0

AMC7812b_RT_Read(&amc7812b_Handle, AMC7812B_DATA0_REGISTER);
 for(int i=0; i<2; i++)
 {
  PRINTF("%2x", amc7812b_Handle.data_buf[i]);
 }
 PRINTF("\r\n");

status_t AMC7812b_RT_Write(amc7812b_rt_handle_t *handle, uint32_t register_address, uint16_t data)
{
 uint8_t mode[2];
 lpi2c_master_transfer_t *xfer = &(handle->xfer);
    status_t status;

    assert(handle);

    if (!handle)
    {
        return kStatus_InvalidArgument;
    }

    /* clear transfer structure and buffer */
    memset(xfer, 0, sizeof(*xfer));
    memset(handle->data_buf, 0, AMC7812b_RT_DATA_LEN);

 mode[0] = 0xff & (data>>8);
 mode[1] = 0xff & (data>>0);
 handle->xfer.slaveAddress = AMC7812B_RT_I2C_ADDRESS;
 handle->xfer.direction = kLPI2C_Write;
 handle->xfer.subaddress = register_address;
 handle->xfer.subaddressSize = 1;
 handle->xfer.data = mode;
 handle->xfer.dataSize = 2;
    handle->xfer.flags = kLPI2C_TransferDefaultFlag;
    status = LPI2C_MasterTransferBlocking(handle->base, &handle->xfer);
 return status;
}

status_t AMC7812b_RT_Read(amc7812b_rt_handle_t *handle, uint32_t register_address)
{
 status_t status;
    assert(handle);

    if (!handle)
    {
        return kStatus_InvalidArgument;
    }
 memset(handle->data_buf, 0, AMC7812b_RT_DATA_LEN);
 handle->xfer.slaveAddress = AMC7812B_RT_I2C_ADDRESS;
 handle->xfer.direction = kLPI2C_Read;
 handle->xfer.subaddress = register_address;
 handle->xfer.subaddressSize = 1;
 handle->xfer.data = handle->data_buf;
 handle->xfer.dataSize = 2;
    handle->xfer.flags = kLPI2C_TransferDefaultFlag;
    status = LPI2C_MasterTransferBlocking(handle->base, &handle->xfer);
 return status;
}

Amy Luo:

您好,
要等转换器转换完了,才能读到数据,在自动模式,在DAV pin有1us的低电平信号表示一轮转换完成。在数据手册33页Handshaking with the Host有说明。

user5884461:

回复 Amy Luo:

嗯,,我也确认过,用示波器看波形,发现一直是高电平,不会出现1us低电平,还有就是我读数据寄存器是在while死循环里面读的,发现一直打印输出的是0.。。而且我写配置寄存器0后,马上又去读取它,发现ICONV已经被cleared 0了,说明已经转换开始了,可是好像停不下来了。为什么??

user5884461:

回复 Amy Luo:

还有就是不需要配置阈值寄存器和报警寄存器吧。我就只要单纯的采集某点的电压而已。

Amy Luo:

回复 user5884461:

程序的工作时序有问题,需要先检查到DAV pin有1us的低电平信号或下降沿才能去读AD值。

user5884461:

回复 Amy Luo:

I2C时序吗?我都已经可以正常读写寄存器了,应该是没有问题。还是说配置各个寄存器之间有先后顺序和时间间隔的区别吗??你们有流程图可以提供吗?

user5884461:

回复 user5884461:

user5884461:

回复 user5884461:

这样的电路设计有问题吗?

user5884461:

回复 Amy Luo:

这样的电路设计有问题吗?

Amy Luo:

回复 user5884461:

那就用 direct mode,检测配置寄存器0里的DAVF bit是否为1,再去读取AD值。

user5884461:

回复 Amy Luo:

status_t AMC7812b_RT_Init(amc7812b_rt_handle_t *handle, LPI2C_Type *base)
{status_t status;assert(base);
if (!base){return kStatus_InvalidArgument;}
handle->base = base;status = AMC7812b_RT_Write(handle, AMC7812B_CONFIG_REGISTER0, 0x0400);status = AMC7812b_RT_Write(handle, AMC7812B_Temperature_CONFIG_REGISTER, 0x00ff);status = AMC7812b_RT_Write(handle, AMC7812B_CHANNEL0_REGISTER, 0x6dff);status = AMC7812b_RT_Write(handle, AMC7812B_CHANNEL1_REGISTER, 0x7000);status = AMC7812b_RT_Write(handle, AMC7812B_CONFIG_REGISTER1, 0x0070);status = AMC7812b_RT_Write(handle, AMC7812B_CONFIG_REGISTER0, 0x1400);return status;
}
还是不行,,我没有暂时没有判断DAVF bit,而是直接while循环读取寄存器0,打印出来还是一直为0.

赞(0)
未经允许不得转载:TI中文支持网 » AMC7812B采集电压
分享到: 更多 (0)