Tuyaos版本:
问题描述:
参考你们官方文档里面的那篇微博去实现了两路ADC采样并定义了一个10ms的软件定时器去获取两路通道的ADC值。但是在软件定时器里面去获取ADC值会影响我的定时器值定时不准。
参考微博:viewtopic.php?t=2426&hilit=phy6222+ADC
相关波形:见附件
相关代码:
tal_adc_deinit(TUYA_ADC_NUM_0); //++1027
Code: Select all
TUYA_ADC_BASE_CFG_T Func_adc_cfg[2] = {
[0]={.ch_list.data = 1<<0,
.width = 12,
.type = TUYA_ADC_EXTERNAL_SAMPLE_VOL,},
[1]={.ch_list.data = 1<<3,
.width = 12,
.type = TUYA_ADC_EXTERNAL_SAMPLE_VOL,}
};
tal_adc_init(TUYA_ADC_NUM_0, &Func_adc_cfg[0]);
hal_timer_init(Func_timer_int_process);
hal_timer_mask_int(AP_TIMER_ID_5,1);
hal_timer_set(AP_TIMER_ID_5,125);
void Func_timer_int_process(uint8_t evt)
{
switch(evt)
{
case HAL_EVT_TIMER_5:
Code: Select all
if(TestVarII==0)
{
TestVarII = 1;
tal_gpio_write(TUYA_GPIO_NUM_33,1);
}
else
{
TestVarII = 0;
tal_gpio_write(TUYA_GPIO_NUM_33,0);
}
break;
case HAL_EVT_TIMER_6:
LOG("t6\n");
break;
case HAL_EVT_WAKEUP:
LOG("wakeup\n");
LOG("timer will disable when sleep,so if you want it work please init it when wakeup");
break;
case HAL_EVT_SLEEP:
LOG("sleep\n");
break;
default:
LOG("err ");
break;
}
}
OPERATE_RET tkl_adc_read_voltage(TUYA_ADC_NUM_E port_num, INT32_T *buff, UINT16_T len)
{
if (port_num != TUYA_ADC_NUM_0) {
return OPRT_NOT_SUPPORTED;
}
Code: Select all
if (buff == NULL) {
return OPRT_INVALID_PARM;
}
if (len == 0) {
return OPRT_INVALID_PARM;
}
hal_adc_config_channel(sg_adc_cfg[0], tkl_adc_evt_handler);
hal_adc_start(INTERRUPT_MODE);
WaitUs(300);
UINT32_T adc_mv = (UINT32_T)(sg_adc_value[0] * 1000);
UINT32_T adc_mv1 = (UINT32_T)(sg_adc_value[1] * 1000);
buff[0] = adc_mv;
buff[1] = adc_mv1;
return OPRT_OK;
}
static void FunctionI_timeout_handler(TIMER_ID timer_id, void *arg)
{
Code: Select all
tal_adc_read_voltage(TUYA_ADC_NUM_0,GetHandleAndBarkAD,1);
if(TestVar==0)
{
TestVar = 1;
tal_gpio_write(TUYA_GPIO_NUM_34,1);
}
else
{
TestVar = 0;
tal_gpio_write(TUYA_GPIO_NUM_34,0);
}
}