-
GD32F470双ADC采集问题
[i=s] 本帖最后由 小炎宇 于 2024-9-30 12:38 编辑 [/i] 在使用GD32F470的ADC0和ADC2分别采集数据,并使能DMA传输数据时,发现采集到4个通道的数据,总会有一个通道的数据是0.但每次采集数据为0的通道并不固定,于是放大了DMA存储数据的目标地址缓冲区大小,发现,通道数据为0的位置已经固定且很有规律,不知道是哪里配置的问题,adc初始化时选择的模式是“全部ADC规则并行模式”(因为工程的宏中没有ADC0与ADC2规则并行模式),想请问出现这种情况是否是,把未使能的ADC1的通道数据也算上了,导致每次采集数据,三个通道轮番采集了一遍,还是说数据存储格式有问题,烦请各位大佬帮忙查看一下,下面是初始化代码和采集到的数据的现象。代码: uint16_t ga_adc_dmabuf[ADC_SAMPLE_CH_BUTT] = {0}; //ADC_SAMPLE_CH_BUTT原本为4,现在为6 void dma_config (void) { /* ADC_DMA_channel configuration */ dma_single_data_parameter_struct dma_data_parameter; /* enable DMA1 clock */ rcu_periph_clock_enable (RCU_DMA1); dma_deinit (DMA1, DMA_CH0); /* initialize DMA single data mode */ dma_data_parameter.periph_addr = (uint32_t) (&ADC_SYNCDATA); dma_data_parameter.periph_inc = DMA_PERIPH_INCREASE_DISABLE; dma_data_parameter.memory0_addr = (uint32_t)ga_adc_dmabuf; dma_data_parameter.memory_inc = DMA_MEMORY_INCREASE_ENABLE; dma_data_parameter.periph_memory_width = DMA_PERIPH_WIDTH_16BIT; dma_data_parameter.circular_mode = DMA_CIRCULAR_MODE_ENABLE; dma_data_parameter.direction = DMA_PERIPH_TO_MEMORY; dma_data_parameter.number = ADC_SAMPLE_CH_BUTT;//现在扩大为6,原本只采集4个 dma_data_parameter.priority = DMA_PRIORITY_HIGH; dma_single_data_mode_init (DMA1, DMA_CH0, &dma_data_parameter); /* DMA channel 0 peripheral select */ dma_channel_subperipheral_select (DMA1, DMA_CH0, DMA_SUBPERI0); /* enable DMA channel */ dma_channel_enable (DMA1, DMA_CH0); } int cal_adc_init (void) { rcu_periph_clock_enable (RCU_GPIOB); rcu_periph_clock_enable (RCU_GPIOF); cal_gpio_init (GPIOB, GPIO_PIN_0, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, 0); cal_gpio_init (GPIOB, GPIO_PIN_1, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, 0); cal_gpio_init (GPIOF, GPIO_PIN_6, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, 0); cal_gpio_init (GPIOF, GPIO_PIN_7, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, 0); /* enable ADC clock */ rcu_periph_clock_enable (RCU_ADC0); rcu_periph_clock_enable (RCU_ADC2); adc_clock_config (ADC_ADCCK_PCLK2_DIV4); adc_deinit(); adc_sync_mode_config (ADC_ALL_ROUTINE_PARALLEL); adc_sync_dma_config(ADC_SYNC_DMA_MODE0); adc_sync_dma_request_after_last_enable(); /* ADC data alignment config */ adc_data_alignment_config (ADC0, ADC_DATAALIGN_RIGHT); adc_data_alignment_config (ADC2, ADC_DATAALIGN_RIGHT); /* ADC SCAN function enable */ adc_special_function_config (ADC0, ADC_SCAN_MODE, ENABLE); adc_special_function_config (ADC2, ADC_SCAN_MODE, ENABLE); /* ADC channel length config */ adc_channel_length_config (ADC0, ADC_ROUTINE_CHANNEL, 2); adc_channel_length_config (ADC2, ADC_ROUTINE_CHANNEL, 2); /* ADC routine channel config */ adc_routine_channel_config(ADC0, 0, ADC_CHANNEL_8, ADC_SAMPLETIME_15); adc_routine_channel_config(ADC0, 1, ADC_CHANNEL_9, ADC_SAMPLETIME_15); adc_routine_channel_config(ADC2, 0, ADC_CHANNEL_4, ADC_SAMPLETIME_15); adc_routine_channel_config(ADC2, 1, ADC_CHANNEL_5, ADC_SAMPLETIME_15); /* ADC external trigger enable */ adc_external_trigger_config(ADC0,ADC_ROUTINE_CHANNEL,EXTERNAL_TRIGGER_RISING); adc_external_trigger_config(ADC2,ADC_ROUTINE_CHANNEL,EXTERNAL_TRIGGER_DISABLE); adc_external_trigger_source_config(ADC0,ADC_ROUTINE_CHANNEL,ADC_EXTTRIG_ROUTINE_T1_CH1); /* enable ADC interface */ adc_enable(ADC0); /* wait for ADC stability */ cal_time_system_sleep_ms(1); /* ADC calibration and reset calibration */ adc_calibration_enable(ADC0); /* enable ADC interface */ adc_enable(ADC2); /* wait for ADC stability */ cal_time_system_sleep_ms(1); /* ADC calibration and reset calibration */ adc_calibration_enable(ADC2); return 0; } 采集出来的数据现象: [img]file:///C:/Users/z01454/Documents/WXWork/1688857742517246/Cache/Image/2024-09/企业微信截图_17276583127832.png[/img]
2449浏览量 5回复量 关注量 -
GD32E230低功耗唤醒后ADC采集问题
GD32E230的片子做低功耗的时候,进入低功耗重新配置外设后ADCDMA采集通道数据直接错乱了乱了。比如原来肯能dmA通道一置换的数据是电池电压数据,2通道是传感器电压值。但是低功耗唤醒后重新配了一遍外设,采集数据可能就错乱了。请问论坛的大佬有遇到这个问题嘛?该如何解决?
3019浏览量 1回复量 关注量 -
求 3.7V锂电池供电,5V模拟信号 16位ADC采集电路 赏3000家园币
求 3.7V锂电池供电,5V模拟信号 16位ADC采集电路搜索 [align=left]复制[/align]
18127浏览量 2回复量 关注量