同时使用两个ADC通道问题

Viewed 80

一、描述你遇到的问题

使用两个ADC通道时读取数据有误,按理说是先读取0通道的数据,打印,再隔两秒读取2通道的数据,打印,但是0通道和2通道数据是同时打印的,且当2通道输入改变时,数据有误

二、你具体做的所有步骤结果截图

三、当前开发板状态全景照片

#include "pinctrl.h"
#include "soc_osal.h"
#include "adc.h"
#include "adc_porting.h"
#include "osal_debug.h"
#include "cmsis_os2.h"
#include "app_init.h"

#define ADC_TASK_STACK_SIZE 0x1000
#define ADC_TASK_PRIO (osPriority_t)(17)
#define ADC_AUTO_SAMPLE_TEST_TIMES 1000

void test_adc_callback(uint8_t ch, uint32_t *buffer, uint32_t length, bool *next)
{
UNUSED(next);
printf("channel: %d, voltage: %dmv\r\n", ch, buffer[1]);

}
void test_adc_callbackk(uint8_t ch, uint32_t *buffer, uint32_t length, bool *next)
{
UNUSED(next);
printf("channel: %d, voltage: %dmv\r\n", ch, buffer[1]);

}
static void *adc_task(const char *arg)
{
UNUSED(arg);
osal_printk("start adc sample test");
uapi_adc_init(ADC_CLOCK_500KHZ);
uapi_adc_power_en(AFE_SCAN_MODE_MAX_NUM, true);
adc_scan_config_t config = {
.type = 0,
.freq = 1,
};

while (1)
{
    uapi_adc_auto_scan_ch_enable(ADC_CHANNEL_0, config, test_adc_callback);
    uapi_adc_auto_scan_ch_disable(ADC_CHANNEL_0);
    osal_msleep(2000);
    uapi_adc_auto_scan_ch_enable(ADC_CHANNEL_2, config, test_adc_callbackk);
    uapi_adc_auto_scan_ch_disable(ADC_CHANNEL_2);
    osal_msleep(2000);
}

return NULL;

}

static void adc_entry(void)
{
osThreadAttr_t attr;

attr.name = "ADCTask";
attr.attr_bits = 0U;
attr.cb_mem = NULL;
attr.cb_size = 0U;
attr.stack_mem = NULL;
attr.stack_size = ADC_TASK_STACK_SIZE;
attr.priority = ADC_TASK_PRIO;

if (osThreadNew((osThreadFunc_t)adc_task, NULL, &attr) == NULL) {
    /* Create task fail. */
}

}

/* Run the adc_entry. */
app_run(adc_entry);

四、开发板串口所有日志

通道2数据输入改变时

通道0数据改变时

请在此处粘贴串口日志

1 Answers

void test_adc_callback(uint8_t ch, uint32_t *buffer, uint32_t length, bool *next)
这里有个参数是 ch,通道,那么也就是说这个回调方法,不只一个通道使用,也就是说所有的ADC采样共用一个回调方法,buffer有128字节,这个可能是所有ADC通道共用的空间。