[已解决]ADC低功耗唤醒后不工作

蓝牙 BLE设备、蓝牙 MESH设备、蓝牙 Beacon设备、Sub-G设备等


Bryan Guo
Posts: 13

你好,麻烦看一下什么问题:BTU模组,SDK从3.9.0切换到3.11.0,发现ADC通道6采集电压的时候,没有进入低功耗前正常,进入低功耗后,再唤醒,采集的电压值始终为0. 硬件使用的是BTU的引脚B6.
TUYA_ADC_BASE_CFG_T batt_detect_adc = {
.ch_list.data = (1 << 6),
.width = 10,
.type = TUYA_ADC_EXTERNAL_SAMPLE_VOL,
};
void batt_voltage_sample(uint16_t* batt_value) {
uint32_t res = 0;
uint32_t adc_value = 0;
static uint16_t log_cnt = 0;

Code: Select all

tal_adc_init(TUYA_ADC_NUM_0, &batt_detect_adc);
res = (uint32_t)tal_adc_read_voltage(TUYA_ADC_NUM_0, &adc_value, 1);
TAL_PR_INFO("adc_value read value = %d mV.", adc_value);
if (res == OPRT_OK) {
    *batt_value = (uint16_t)((adc_value + BATT_SAMPLE_COMPSATE_MV) * BATT_RESISTOR_COEF);
}

}[/font][/font][/syntax]

Last edited by Bryan Guo on 2025年 Jul 28日 09:40, edited 2 times in total.

Tags:
jinyuan
Posts: 92

Re: ADC低功耗唤醒后不工作

  • 唤醒后ADC需要重新初始化。
  • 每次休眠唤醒后程序会再执行一次 tuya_init_third,可以将代码放在这里
jinyuan
Posts: 92

Re: ADC低功耗唤醒后不工作

Image

测试代码参考上图

Bryan Guo
Posts: 13

Re: ADC低功耗唤醒后不工作

你好,我目前应用是这样的:我需要测量两个电压。 一个是电池电压BAT, 用于低电压报警,正常大概是4.5 - 6V,经过电阻分压,此时大概1.7V; 另一个是BTU的VCC电压,3.2V,恒定, VCC电压是从BAT经过DCDC得到。 用BTU的C4(通道8)来测量BAT电压,用BTU的B6(通道6)来测量VCC电压。
我根据你的方法,把ADC初始化放在tuya_init_third(). 进入低功耗前,测试得到BAT的电压大概1700mV, 从低功耗唤醒后,测试得到大概3200mV,感觉像是VCC电压。 如果把BATT_CHECK_ENABLE = 0, 则唤醒后,测试得到BAT的电压大概0mV,还是不正常。
请帮忙分析一下什么原因。是不是两个通道混了?

OPERATE_RET tuya_init_third(VOID_T) {
#if defined(TUYA_SDK_TEST) && (TUYA_SDK_TEST == 1)
app_key_init();

Code: Select all

TUYA_WAKEUP_SOURCE_BASE_CFG_T wakeup_cfg = {
    .source                          = TUYA_WAKEUP_SOURCE_GPIO,
    .wakeup_para.gpio_param.gpio_num = BOARD_KEY_PIN,
    .wakeup_para.gpio_param.level    = TUYA_GPIO_LEVEL_LOW,
};
tkl_wakeup_source_set(&wakeup_cfg);

TUYA_IIC_BASE_CFG_T iic_cfg = {
    .role       = TUYA_IIC_MODE_MASTER,
    .speed      = TUYA_IIC_BUS_SPEED_400K,
    .addr_width = TUYA_IIC_ADDRESS_7BIT,
};
tal_i2c_init(TUYA_I2C_NUM_0, &iic_cfg);

#endif
tal_adc_deinit(TUYA_ADC_NUM_0);
tal_adc_init(TUYA_ADC_NUM_0, &voltage_detect_adc);

return OPRT_OK;
}

jinyuan
Posts: 92

Re: ADC低功耗唤醒后不工作

BTU 芯片的ADC只有1个,这一个ADC有若干通道 , 每个通道使用前都需要进行相应的初始化。在这个应用场景下可以看作是一个ADC外设的分时复用。

Bryan Guo
Posts: 13

Re: ADC低功耗唤醒后不工作

1.我每次采集前都有用初始化函数,然后再读值,比如这样:
tal_adc_init(TUYA_ADC_NUM_0, &voltage_detect_adc);
res = (uint32_t)tal_adc_read_voltage(TUYA_ADC_NUM_0, &adc_value, 1);
2.你前面图片测试的情况,有没有BATT_CHECK_ENABLE = 0? 如果没有使能采集电池电压--其实就是VCC电压, 从低功耗唤醒后,还是可以采集到正常的电压吗?

Bryan Guo
Posts: 13

Re: ADC低功耗唤醒后不工作

你可以帮我在这个SDK=3.11.0版本基础上,写一个样例吗,轮询采集两个通道的电压,然后,从低功耗唤醒后,采集也正常。我把他移植到我的项目。

jinyuan
Posts: 92

Re: ADC低功耗唤醒后不工作

Bryan Guo 2025年 Jul 23日 17:23

1.我每次采集前都有用初始化函数,然后再读值,比如这样:
tal_adc_init(TUYA_ADC_NUM_0, &voltage_detect_adc);
res = (uint32_t)tal_adc_read_voltage(TUYA_ADC_NUM_0, &adc_value, 1);
2.你前面图片测试的情况,有没有BATT_CHECK_ENABLE = 0? 如果没有使能采集电池电压--其实就是VCC电压, 从低功耗唤醒后,还是可以采集到正常的电压吗?

不用关注BATT_CHECK_ENABLE 这个宏,不要动他, 休眠唤醒的时候以及调用tal_adc_init的时候底层会处理。

jinyuan
Posts: 92

Re: ADC低功耗唤醒后不工作

Bryan Guo 2025年 Jul 23日 17:34

你可以帮我在这个SDK=3.11.0版本基础上,写一个样例吗,轮询采集两个通道的电压,然后,从低功耗唤醒后,采集也正常。我把他移植到我的项目。

修改如下图:

Image

Bryan Guo
Posts: 13

Re: ADC低功耗唤醒后不工作

你的通道5实际电压多少,0肯定不对吧?

Post Reply