【问题标题】:VL53L0x sensor Ranging error. How to solve the error?VL53L0x 传感器测距错误。如何解决错误?
【发布时间】:2021-08-14 17:07:31
【问题描述】:

我正在尝试将 vl53l0x 传感器与我的 atSamE51A19 控制器连接。我可以将数据发送到传感器。由于它已建立连接,我发送识别码并响应。但进一步的初始化和测距不起作用。

我在我的 sam 板上使用 stm 库实现。 [stmArduinoLib][1] 我所做的唯一更改是在读写功能中。它使用的是 stm 基本函数,但我使用的是不同的函数。

    /****************** Write and read functions from I2C *************************/

VL53L0X_Error VL53L0X::VL53L0X_WriteMulti(VL53L0X_DEV Dev, uint8_t index, uint8_t *pdata, uint32_t count)
{
    int status;

    status = VL53L0X_I2CWrite(index, pdata, (uint16_t) count);
    if (status == 0)
    {
        status = VL53L0X_ERROR_CONTROL_INTERFACE;
    }
    else
    {
        status = VL53L0X_ERROR_NONE;
    }
    return status;      
}

VL53L0X_Error VL53L0X::VL53L0X_ReadMulti(VL53L0X_DEV Dev, uint8_t index, uint8_t *pdata, uint32_t count)
{
    int status;

    if (count >= VL53L0X_MAX_I2C_XFER_SIZE)
    {
        status = VL53L0X_ERROR_INVALID_PARAMS;
    }

    status = VL53L0X_I2CRead(index, pdata, (uint16_t) count);

    return status;  
}

VL53L0X_Error VL53L0X::VL53L0X_WrByte(VL53L0X_DEV Dev, uint8_t index, uint8_t data)
{
    int status;

    status = WriteRegister(index, data);    //VL53L0X_I2CWrite(index, &data, 1);

    if (status == 0)
    {
        status = VL53L0X_ERROR_CONTROL_INTERFACE;
    }
    else
    {
        status = VL53L0X_ERROR_NONE;
    }

    return status;  
}

VL53L0X_Error VL53L0X::VL53L0X_WrWord(VL53L0X_DEV Dev, uint8_t index, uint16_t data)
{
    int status;
    int32_t status_int;
    alignas(2) uint8_t buffer[2];

    buffer[0] = data >> 8;
    buffer[1] = data & 0x00FF;

    status_int = VL53L0X_I2CWrite(index, (uint8_t*) buffer, 2);

    // buffer[0] = MSB
    // buffer[1]
    // buffer[2]
    // buffer[3] = LSB
    if (status_int == 0)
    {
        status = VL53L0X_ERROR_CONTROL_INTERFACE;
    }
    else
    {
        status = VL53L0X_ERROR_NONE;
    }

    return status;  
}

VL53L0X_Error VL53L0X::VL53L0X_WrDWord(VL53L0X_DEV Dev, uint8_t index, uint32_t data)
{
    int status;
    int32_t status_int;
    alignas(2) uint8_t buffer[4];

    buffer[0] = (data >> 24) & 0xFF;                // MSB
    buffer[1] = (data >> 16) & 0xFF;
    buffer[2] = (data >> 8) & 0xFF;
    buffer[3] = (data >> 0) & 0xFF;                 // LSB
    status_int = VL53L0X_I2CWrite(index, buffer, 4);

    if (status_int == 0)
    {
        status = VL53L0X_ERROR_CONTROL_INTERFACE;
    }
    else
    {
        status = VL53L0X_ERROR_NONE;
    }

    return status;  
}

VL53L0X_Error VL53L0X::VL53L0X_RdByte(VL53L0X_DEV Dev, uint8_t index, uint8_t *data)
{
    int status = VL53L0X_ERROR_NONE;

    status = ReadRegister(index, *data);    //
    if (status)
    {
        status = VL53L0X_ERROR_NONE;
        return status;
    }
    else
    {
        status = VL53L0X_ERROR_CONTROL_INTERFACE;
    }
    return status;
}

VL53L0X_Error VL53L0X::VL53L0X_RdWord(VL53L0X_DEV Dev, uint8_t index, uint16_t *data)
{
    int status = 0;
    uint8_t buffer[2] =
    { 0, 0 };

    status = VL53L0X_I2CRead(index, buffer, 2);
    if (status == 0)
    {
        *data = (uint16_t) (buffer[0] << 8) | (buffer[1] & 0xFF);       // | ? +
    }

    return status;          
}

VL53L0X_Error VL53L0X::VL53L0X_RdDWord(VL53L0X_DEV Dev, uint8_t index, uint32_t *data)
{
    int status;
    uint8_t buffer[4] =
    { 0, 0, 0, 0 };

    status = VL53L0X_I2CRead(index, buffer, 4);
    if (!status)                                    // use OR
    {
        *data = ((uint32_t) buffer[0] << 24) | ((uint32_t) buffer[1] << 16) | ((uint32_t) buffer[2] << 8) | (uint32_t) buffer[3];
    }
    return status;

}

VL53L0X_Error VL53L0X::VL53L0X_UpdateByte(VL53L0X_DEV Dev, uint8_t index, uint8_t AndData, uint8_t OrData)
{
    int status;
    uint8_t buffer = 0;

    /* read data direct onto buffer */
    status = VL53L0X_I2CRead(index, &buffer, 1);
    if (!status)
    {
        buffer = (buffer & AndData) | OrData;
        status = VL53L0X_I2CWrite(index, &buffer, (uint8_t) 1);
    }

    if (status == 0)
    {
        status = VL53L0X_ERROR_CONTROL_INTERFACE;
    }
    else
    {

        status = VL53L0X_ERROR_NONE;
    }
    return status;
}

VL53L0X_Error VL53L0X::VL53L0X_I2CWrite(uint8_t RegisterAddr, uint8_t *pBuffer, uint16_t NumByteToWrite)
{
    return WriteRegisters(RegisterAddr, pBuffer, NumByteToWrite);
}

VL53L0X_Error VL53L0X::VL53L0X_I2CRead(uint8_t RegisterAddr, uint8_t *pBuffer, uint16_t NumByteToRead)
{
    alignas(2) uint8_t vpBuffer[5];
    /*  dev_i2c->beginTransmission(((uint8_t) (((DeviceAddr) >> 1) & 0x7F)));
     */

    if (ReadRegisters(RegisterAddr, vpBuffer, NumByteToRead))
    {
        pBuffer = vpBuffer;
        return 0;
    }

    return 1;
}

在这个函数中,我不是每次都发送设备地址,只是发送索引和数据。在构造函数中,我只设置了一次地址。当我使用 Status = VL53L0X_PerformRefSpadManagement(Device, &amp;refSpadCount, &amp;isApertureSpads); 这个函数时,我得到的唯一错误。在初始化中。不知道如何解决这个问题。试图将模式更改为无帮助的连续模式。注意:传感器在 arduino 上工作正常。 [1]:https://github.com/stm32duino/VL53L0X

【问题讨论】:

    标签: arm embedded atmel stm32f4discovery


    【解决方案1】:

    我找到了一个新的可能解决这个问题的方法,因为我花了2天时间解决它,所以我觉得我需要与大家分享。以下是解决方案的摘要:

    1. 供电问题 1在设置函数中添加 50 毫秒延迟(显然是在传感器初始化之前)。这样,Vin 将有足够的时间达到传感器所需的水平,如上一条消息 (ocrdu) 中所述
    2. 供电问题 2:这个传感器比其他传感器要求更高,通常你电路板上的 5V 引脚会比 3v3 做得更好。如果同时连接了多个传感器,将它们全部断开以检查它们是否正在使用我们的 vl53l0x 所需的电源
    3. 供电问题 3:如果您使用外部电源供电,与电路板统一接地,别忘了
    4. SCL - SDA 弱信号添加一个上拉(从每个通道到 vin 的 2k2 - 4k7),这样信号会表现得更好,这可能是问题
    5. 焊接问题确保每个排针焊接良好。我发现很多焊接不良的情况。小垫子无济于事。建议使用万用表检查接头和应连接的焊盘之间的连续性
    6. XSHUT 没有启动:我的问题,这是 AZDelivery 板说它在 XSHUT 中有一个上拉(就像启用一样)。但它可能是错误的,或者实施不当。 Xshut 需要高,3v3/5v,否则传感器将无法工作。将 XSHUT 桥接到 Vin 或实现上拉,问题将得到解决。
    • 我正在使用 adafruit 的库 1.1.2,它可以工作,有上拉,没有上拉,连接到 5V,也连接到 3V3,与 50ms延迟,XSHUT接高电平(3V3/Vin)
    • 我的主板是 AZDelivery 的 vl53l0x(5 欧元亚马逊)
    • 我已经用 arduino nano 和 ESP32 测试过传感器,都可以正常工作

    希望你们觉得这个有用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-27
      • 2020-05-18
      相关资源
      最近更新 更多