GD32F103VET6 ADC读取数据跳动
adc读取压力传感器(MP3V5050V)值,当压力值缓慢上升时,stm32f103vet6读取的压力值是类似0.20.4 0.60.81.01.2 .......
这样比较平稳的接近线性的很丝滑的上升。
使用GD32f103vet6读取时是类似 1, 4,6, 10, 15,18 ......这样的跳跃性很大的上升。
ADC 预分频器的值和采样时间都试了一遍也没有任何好转,有知道这是什么原因么
会不会是参考电压造成的???我不知道,我乱猜的。 分辨率是不是没设置,哈哈 本帖最后由 liupk 于 2022-1-19 20:56 编辑
laocuo1142 发表于 2022-1-19 15:13
分辨率是不是没设置,哈哈
我用的是GD32F103vet6,没有找到类似adc_resolution_config(ADC_RESOLUTION_12B);这样能配置分辨率的函数,所以没有配置分辨率,但是我使用函数信号发生器发出1hz的三角波,使用GD32F103vet6的adc2读取发现也是数据跳动不光滑,但是结果是能够从0读取到4095的,应该是默认就是12位,我在查下手册,看看能不能单独配置这个分辨率 void ADCx_Init(void)
{
dma_parameter_struct dma_data_parameter;
rcu_periph_clock_enable(RCU_GPIOC);
gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_0);
gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_1);
gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_2);
gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_3);
rcu_periph_clock_enable(RCU_ADC2);
rcu_periph_clock_enable(RCU_AF);
rcu_periph_clock_enable(RCU_DMA1);
rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV16);
adc_deinit(ADC2);
adc_mode_config(ADC_MODE_FREE);
adc_special_function_config(ADC2, ADC_CONTINUOUS_MODE, ENABLE);
/* ADC scan mode disable */
adc_special_function_config(ADC2, ADC_SCAN_MODE, ENABLE);
/* ADC data alignment config */
adc_data_alignment_config(ADC2, ADC_DATAALIGN_RIGHT);
/* ADC channel length config */
adc_channel_length_config(ADC2, ADC_REGULAR_CHANNEL, NOFCHANEL);//常规通道长度配置
/* ADC regular channel config */
adc_regular_channel_config(ADC2, 0, ADC_CHANNEL_10, ADC_SAMPLETIME_239POINT5);
adc_regular_channel_config(ADC2, 1, ADC_CHANNEL_11, ADC_SAMPLETIME_239POINT5);
adc_regular_channel_config(ADC2, 2, ADC_CHANNEL_12, ADC_SAMPLETIME_239POINT5);
adc_regular_channel_config(ADC2, 3, ADC_CHANNEL_13, ADC_SAMPLETIME_239POINT5);
/* ADC trigger config */
adc_external_trigger_source_config(ADC2,ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);
adc_external_trigger_config(ADC2, ADC_REGULAR_CHANNEL, ENABLE);
/* ADC DMA function enable */
adc_dma_mode_enable(ADC2);//使能 DMA 模式
/* enable ADC interface */
adc_enable(ADC2);
delay_ms(2);
/* ADC calibration and reset calibration */
adc_calibration_enable(ADC2);
/* ADC_DMA_channel configuration */
/* ADC DMA_channel configuration */
dma_deinit(DMA1,DMA_CH4);
/* initialize DMA single data mode */
dma_data_parameter.periph_addr = (uint32_t)(&ADC_RDATA(ADC2)); //外设地址
dma_data_parameter.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
dma_data_parameter.memory_addr = (uint32_t)(&ADC_ConvertedValue); //搬运目标地址
dma_data_parameter.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
dma_data_parameter.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;
dma_data_parameter.memory_width = DMA_MEMORY_WIDTH_16BIT;
dma_data_parameter.direction = DMA_PERIPHERAL_TO_MEMORY;
dma_data_parameter.number = 4;
dma_data_parameter.priority = DMA_PRIORITY_HIGH;
dma_init(DMA1, DMA_CH4, &dma_data_parameter);
/* enable DMA circulation mode */
dma_circulation_enable(DMA1, DMA_CH4);
/* enable DMA channel */
dma_channel_enable(DMA1, DMA_CH4);
adc_software_trigger_enable(ADC2,ADC_REGULAR_CHANNEL);
} yljon 发表于 2022-1-18 18:50
会不会是参考电压造成的???我不知道,我乱猜的。
参考电压用的是REF3033AIDBZR,目前还没找到原因,等我在测试看看 GD32F103系列 今年不主推了哦,建议测试GD32F303系列 这个波动有点大啊
这个跳动太有规律了
绝对是程序的问题
我怀疑这些数据是假的
实际给的数据是多少啊
解决了,是时钟问题,我做了如下设置希望大家能参考到
RCC_PCLK2Config(RCC_HCLK_Div16); //设置APB2外设时钟
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);//9倍频
rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV16);
adc_regular_channel_config(ADC2, 0, ADC_CHANNEL_10, ADC_SAMPLETIME_239POINT5);
adc_regular_channel_config(ADC2, 1, ADC_CHANNEL_11, ADC_SAMPLETIME_239POINT5);
adc_regular_channel_config(ADC2, 2, ADC_CHANNEL_12, ADC_SAMPLETIME_239POINT5);
adc_regular_channel_config(ADC2, 3, ADC_CHANNEL_13, ADC_SAMPLETIME_239POINT5); 这几路输入都接了吗?有没有悬空的。这几个通道间如果有一路输入电压小于0V,会影响其他路ADC的
页:
[1]