Page 1 of 2

【已解决】按外设示例ad采樣的数据一直不准,要怎么解决?

Posted: 2022年 Dec 14日 13:44
by wqvbdcb123

下面示示例代码,按这个原封不动的代码,采集的ad数据不准?电压实际是1500左右(1.5V),现在读出来ad值一直在1200左右。这问题主要出现在哪里?求高手帮忙解答?,谢谢!

应用示例
示例中初始化了 TUYA_ADC2,也就是模组上丝印为 ADC (P23) 的引脚。初始化完成后会通过日志口每隔 1S 打印一次采集到的值(实际输出的值为转换后的值,实际电压值的 1000 倍)。

#include "tuya_adc.h"
#include "tuya_driver.h"
#include "uni_log.h"

tuya_adc_t *adc_init(tuya_adc_port_t adc_port);
uint16_t get_adc_value(tuya_adc_t *adc_handle);

/**

  • @brief application initialization interface
    *
  • @param[in] none
  • @return none
    */
    void app_init(void)
    {
    return;
    }

/**

  • @brief thread demo task handle
    *

  • @param[in] none

  • @return none
    */
    void device_init(void)
    {
    uint16_t volt = 0;
    tuya_adc_t *adc0_handle = NULL;

    adc0_handle = adc_init(TUYA_ADC2);
    for (;;) {
    volt = get_adc_value(adc0_handle);
    PR_NOTICE("adc voltage: %d", volt);
    tuya_hal_system_sleep(1000);
    }

    return;
    }

/**

  • @brief init adc driver
    *

  • @param[in] adc_port: this parameter must be a value of @ref TUYA_ADCx.

  • TUYA_ADC0 --- P26

  • TUYA_ADC1 --- P24

  • TUYA_ADC2 --- P23

  • @return adc handle
    */
    tuya_adc_t *adc_init(tuya_adc_port_t adc_port)
    {
    tuya_adc_t *adc_handle = NULL;
    adc_handle = (tuya_adc_t *)tuya_driver_find(TUYA_DRV_ADC, adc_port);
    if (NULL == adc_handle) {
    PR_ERR("find adc failed");
    return;
    }

    TUYA_ADC_CFG(adc_handle, adc_port, 0);
    tuya_adc_init(adc_handle);

    return adc_handle;
    }

/**

  • @brief get adc value
    *

  • @param[in] adc_handle: adc handle

  • @return voltage value
    */
    uint16_t get_adc_value(tuya_adc_t *adc_handle)
    {
    uint16_t voltage = 0;
    uint16_t adc_value = 0;

    tuya_adc_convert(adc_handle, &adc_value, 1);
    voltage = (float)adc_value * 2400 / 4096;

    return voltage;
    }


Re: 按外设示例ad采樣的数据一直不准,要怎么解决?

Posted: 2022年 Dec 14日 16:46
by chaser

从代码上看,是没什么问题的。 麻烦提供下你当前使用的sdk版本信息。确认下是不是特殊品类使用的sdk,有个传感使用的sdk,adc采样电压范围是0-3.3v。且adc的采样误差和芯片供电电压直接相关。


Re: 按外设示例ad采樣的数据一直不准,要怎么解决?

Posted: 2022年 Dec 14日 21:42
by wqvbdcb123

SDK: ty_iot_sdk_bk7231nl_BK7231NL_2.3.1-beta.14. 芯片供电是3.1V左右,ADC (P23)口的电压用万用表测试出电压是1.5左右,现在实际1200(1.2V左右)。


Re: 按外设示例ad采樣的数据一直不准,要怎么解决?

Posted: 2022年 Dec 15日 08:06
by chaser

你的sdk是传感品类特殊分支。adc需要采集误差小,要求模组供电电压一定是3.3v, 同时采样范围变为0-3.3v。 采样值转换成电压值公式改为:voltage = (float)adc_value * 3300 / 4096;


Re: 按外设示例ad采樣的数据一直不准,要怎么解决?

Posted: 2022年 Dec 15日 08:23
by wqvbdcb123

因为我们产品是两节碱性电池供电,给模组的电压最大3.1V左右,有办法将模组内部ADC的参考电压变为2.4V左右吗,我们想满足电压值公式:voltage = (float)adc_value * 2400 / 4096。


Re: 按外设示例ad采樣的数据一直不准,要怎么解决?

Posted: 2022年 Dec 15日 08:54
by wqvbdcb123

电池低功耗温湿度类产品,是不是我们用的SDK: ty_iot_sdk_bk7231nl_BK7231NL_2.3.1-beta.14不对?若不对要下载哪个版本的SDK开发?,谢谢!


Re: 按外设示例ad采樣的数据一直不准,要怎么解决?

Posted: 2022年 Dec 16日 18:05
by chaser

如果需求要求 adc 采样误差小,且采样范围在0-2.4v。 建议切换到 bk7231nl 平台。 该平台就是为了解决 adc 采样误差大 给传感类产品使用的芯片平台。 目前 bk7231n 没有adc 采样误差小,且采样范围在0-2.4v 的sdk。

目前使用bk7231n 这个传感分支sdk:ty_iot_sdk_bk7231nl_BK7231NL_2.3.1-beta.14 的客户,有adc 误差小需求。都是外部电路设计了升压稳压电路。

bk7231nl sdk 下载地址:https://maven.tuya-inc.top/nexus/conten ... 0.5.tar.gz

注意:bk7231nl sdk 使用要对应 bk7231nl 模组。 bk7231nl 与 bk7231n 不兼容。


Re: 按外设示例ad采樣的数据一直不准,要怎么解决?

Posted: 2022年 Dec 18日 20:09
by wqvbdcb123

bk7231nl sdk 下载地址:https://maven.tuya-inc.top/nexus/conten ... 0.5.tar.gz 这个下载不了?能否直接发给我吗?


Re: 按外设示例ad采樣的数据一直不准,要怎么解决?

Posted: 2022年 Dec 19日 18:37
by 愚者千虑必有一得

Re: 【已解决】按外设示例ad采樣的数据一直不准,要怎么解决?

Posted: 2022年 Dec 20日 00:21
by wqvbdcb123

谢谢了!