查看:
1655
|
回复:
1
|
立创梁山派GD32F470ZGT6--使用DMA实现多通道ADC采集
|
|
发表于2023-06-15 19:43:22
|
显示全部楼层
1#
电梯直达
测试发现ADC的引脚配置为浮空之后,如果没有接入东西,其读取的ADC值是不确定的,所以在测试的时候,一定要把对应的电压接入ADC引脚,测量的值才是准确的。
如果单独使用ADC多通道,会有通道错乱的问题,实际查看数据手册,发现ADC采集完的规则组数据只保存在一个16位的寄存器中,如果没有及时取出数据,就会被后面的数据覆盖,导致数据错误,或者数据的通道错乱,比如通道1的数据跑到通道2。
所以使用直接使用DMA将采集完成的数据给搬运出去,这样就没有数据错乱问题。 上代码。 adc.c adc.h
主函数 见帖子一楼 实际效果 对PC1和PC3接入3.3V,因为ADC是12位的,所以最大采集数为4096,实际采集也接近了4096。 对PC2和PC4接入GND,实际采集也接近0。注意!引脚不能浮空进行采集!不然数据是不确定的!
代码链接:https://pan.baidu.com/s/15G_t-jW82Ms6FLD_fTCBqw?pwd=1234 提取码:1234 |
|
发表于2023-06-15 19:59:36
|
显示全部楼层
2#
main.c
#include "gd32f4xx.h" #include "systick.h" #include "usart0.h" #include "stdio.h" #include "adc.h" int main(void) { unsigned char temp_buff[200]; unsigned int show_buff[4]; nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2); // 优先级分组 systick_config(); //系统滴答定时器 定时1MS USART1_Init(); ADC_DMA_Init(); USART0_send_String((unsigned char *)"--开始--"); while(1) { /* 获取数据 */ show_buff[0] = Get_Adc_Dma_Value(0); //根据扫描顺序得知数组[0] = PC1的数据 show_buff[1] = Get_Adc_Dma_Value(1); //根据扫描顺序得知数组[1] = PC2的数据 show_buff[2] = Get_Adc_Dma_Value(2); //根据扫描顺序得知数组[2] = PC3的数据 show_buff[3] = Get_Adc_Dma_Value(3); //根据扫描顺序得知数组[3] = PC4的数据 /* 串口显示数据 */ sprintf((char *)temp_buff, "PC1=%d\r\n", show_buff[0]); USART0_send_String(temp_buff); sprintf((char *)temp_buff, "PC2=%d\r\n", show_buff[1]); USART0_send_String(temp_buff); sprintf((char *)temp_buff, "PC3=%d\r\n", show_buff[2]); USART0_send_String(temp_buff); sprintf((char *)temp_buff, "PC4=%d\r\n", show_buff[3]); USART0_send_String(temp_buff); /* 串口显示刷新太快,加个延时 */ delay_1ms(1000); } } |
|