CN / EN
CN / EN

提问

获得支持

您的项目私密技术问题如需获得一对一支持,请点击下方联系我们。

5515板子如何切换 多路adc

157***568

2022-04-17 09:32

需要miso2 口采集电压,需要 miso4采集 温度 ,查看datasheet发现只有一路adc 。读取数据的时候如何切换 采集的通道保证采集的是对应通道的数据

0收藏

0赞成

Ping

汇顶员工
2022-04-18 09:33

1. GR551X支持8通道ADC,其中5通道开放给外部使用;


2. 建议升级到最新的1.7.0版本SDK,已经集成多通道功能接口;

uint16_t app_adc_multi_channel_conversion_async(app_adc_samle_node_t *p_begin_node, uint32_t total_nodes);-------非RTOS和RTOS下都可以用

uint16_t app_adc_multi_channel_conversion_sem_sync(app_adc_samle_node_t *p_begin_node, uint32_t total_nodes);----仅RTOS下可用

入参1:指定采集的通道节点链表(里面包含通道号、通道数据buf、该通道采集数据长度);

入参2:指定一共采集多少个通道;

接口只是启动了采集功能,退出后MCU资源会释放出来;当设定的所有通道采集完毕,初始化时指定的回调函数会被调用,从而告知应用层全部采集完毕,此时应用层就可以从每个通道指定的buf里面访问数据。

1条评论

0赞成

0收藏

您的评论

Ping

汇顶员工
2022-04-18 19:24

该部分代码实现在app_adc.c文件中是开源,可以直接移植到旧版本的SDK上应用,回调函数只是通知ADC采样完成,应用示例代码如下:

回调函数:

void app_adc_evt_handler(app_adc_evt_t * p_evt)
{
if (p_evt->type == APP_ADC_EVT_CONV_CPLT)
{
covn_done = 1;
printf("DMA conversion is done.\r\n");
}
}

多通道采集示例:

void adc_multi_sample_case(void)
{
double voltage[TEST_CONV_LENGTH];

app_adc_params_t params_t = DEFAULT_PARAM_CONFIG;

app_adc_deinit();
app_adc_init(¶ms_t, app_adc_evt_handler);

app_adc_samle_node_t sample_node0;
sample_node0.channel = ADC_INPUT_SRC_IO0;
sample_node0.p_buf = &adc_channel0_buf[0];
sample_node0.len = TEST_CONV_LENGTH;

app_adc_samle_node_t sample_node1;
sample_node1.channel = ADC_INPUT_SRC_IO1;
sample_node1.p_buf = &adc_channel1_buf[0];
sample_node1.len = TEST_CONV_LENGTH;

sample_node0.next = &sample_node1;

memset(adc_channel0_buf, 0, sizeof(adc_channel0_buf));
memset(adc_channel1_buf, 0, sizeof(adc_channel1_buf));
covn_done = 0;
app_adc_multi_channel_conversion_async(&sample_node0, 2);
while(covn_done == 0);

app_adc_voltage_intern(adc_channel0_buf, voltage, TEST_CONV_LENGTH);
printf("Channel 0 value:\r\n");
for(uint32_t i = 3; i < TEST_CONV_LENGTH; i++)//ignore the first 3 abnormal values
{
printf("%0.3fV ", voltage[i]);
delay_us(1000);
}
printf("\r\n\r\n");

app_adc_voltage_intern(adc_channel1_buf, voltage, TEST_CONV_LENGTH);
printf("Channel 1 value:\r\n");
for(uint32_t i = 3; i < TEST_CONV_LENGTH; i++)//ignore the first 3 abnormal values
{
printf("%0.3fV ", voltage[i]);
delay_us(1000);
}
printf("\r\n\r\n");
}

0条评论

0赞成

1收藏

您的评论

登录后可回答问题,请 注册

我们时刻倾听您的声音
联系销售

扫描关注公众号

打开微信,使用“扫一扫”即可关注