打印

GD32F407片子模拟转换精度无法切换始终是12位

[复制链接]
856|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xibowen|  楼主 | 2021-4-12 11:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题描述:
调试ADC过程中,调用如下库函数设置转换精度,调用的是用10位AD转换精度:
adc_resolution_config(ADC0, ADC_RESOLUTION_10B);//10位精度
但是在线调试后,AD转换的结果最大值始终是4092,也就是12位精度.
通过程序读寄存器ADC_CTL0(ADC0)的值,显示bit(24:25)设置正常,也试着设置成8位精度,但是始终是12位。求大神给解读一下。
/*!
    \brief      configure ADC resolution
    \param[in]  adc_periph: ADCx,x=0,1,2
    \param[in]  resolution: ADC resolution
                only one parameter can be selected which is shown as below:
      \arg        ADC_RESOLUTION_12B: 12-bit ADC resolution
      \arg        ADC_RESOLUTION_10B: 10-bit ADC resolution
      \arg        ADC_RESOLUTION_8B: 8-bit ADC resolution
      \arg        ADC_RESOLUTION_6B: 6-bit ADC resolution
    \param[out] none
    \retval     none
*/
void adc_resolution_config(uint32_t adc_periph , uint32_t resolution)
{
    ADC_CTL0(adc_periph) &= ~((uint32_t)ADC_CTL0_DRES);
    ADC_CTL0(adc_periph) |= (uint32_t)resolution;
}

使用特权

评论回复
沙发
weifeng90| | 2021-4-12 21:11 | 只看该作者
设置没成功?

使用特权

评论回复
板凳
单片小菜| | 2021-4-12 22:17 | 只看该作者
怎么会不成功呢?没有道理呀。

使用特权

评论回复
地板
xibowen|  楼主 | 2021-4-13 16:47 | 只看该作者
单片小菜 发表于 2021-4-12 22:17
怎么会不成功呢?没有道理呀。

您有简单的10位AD转换精度的程序吗分享一个不

使用特权

评论回复
5
xibowen|  楼主 | 2021-4-13 16:47 | 只看该作者

读寄存器在线调试显示设置没问题啊

使用特权

评论回复
6
嵌入小菜菜| | 2021-4-13 23:05 | 只看该作者
12AD的芯片在若干年前,真的很难买到。

使用特权

评论回复
7
guijial511| | 2021-4-14 07:21 | 只看该作者
配置失效了?

使用特权

评论回复
8
QQ2224043166| | 2021-12-17 20:11 | 只看该作者

/* Definition of ADCx conversions data table size */
#define ADC_CONVERTED_DATA_BUFFER_SIZE   ((uint32_t)   2)

/* Variables for ADC conversion data */
__IO uint16_t aADCxConvertedData[ADC_CONVERTED_DATA_BUFFER_SIZE]; /* ADC group regular conversion data */

void GD_DMA_Init(void)
{
  /* DMA controller clock enable */
        rcu_periph_clock_enable(RCU_DMA1);

  /* DMA interrupt init */
    /* ADC_DMA_channel configuration */
    dma_single_data_parameter_struct dma_single_data_parameter;
   
    /* ADC DMA_channel configuration */
    dma_deinit(DMA1, DMA_CH0);
   
    /* initialize DMA single data mode */
    dma_single_data_parameter.periph_addr = (uint32_t)(&ADC_RDATA(ADC0));
    dma_single_data_parameter.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
    dma_single_data_parameter.memory0_addr = (uint32_t)(aADCxConvertedData);
    dma_single_data_parameter.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
    dma_single_data_parameter.periph_memory_width = DMA_PERIPH_WIDTH_16BIT;
    dma_single_data_parameter.direction = DMA_PERIPH_TO_MEMORY;
    dma_single_data_parameter.number = 2;
    dma_single_data_parameter.priority = DMA_PRIORITY_LOW;
    dma_single_data_mode_init(DMA1, DMA_CH0, &dma_single_data_parameter);
    dma_channel_subperipheral_select(DMA1, DMA_CH0, DMA_SUBPERI0);

    /* enable DMA circulation mode */
    dma_circulation_enable(DMA1, DMA_CH0);
  
    /* enable DMA channel */
    dma_channel_enable(DMA1, DMA_CH0);
}

void GD_ADC_Init(void)
{       
        GD_ADC_MspInit();
       
    /* config ADC clock */
    adc_clock_config(ADC_ADCCK_PCLK2_DIV4);         
       
    /* ADC mode config */
    adc_sync_mode_config(ADC_SYNC_MODE_INDEPENDENT);
    /* ADC contineous function disable */
    adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE);
    /* ADC scan mode disable */
    adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);
    /* ADC data alignment config */
    adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);       

    /* ADC channel length config */
    adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 2);
    /* ADC regular channel config */
    adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_0, ADC_SAMPLETIME_144);
    adc_regular_channel_config(ADC0, 1, ADC_CHANNEL_10, ADC_SAMPLETIME_144);
       
    /* ADC trigger config */
    adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC_EXTTRIG_REGULAR_T0_CH0);
    adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, EXTERNAL_TRIGGER_DISABLE);

        adc_end_of_conversion_config(ADC0, ADC_EOC_SET_CONVERSION);
       
    /* ADC DMA function enable */
    adc_dma_request_after_last_enable(ADC0);
    adc_dma_mode_enable(ADC0);
   
    /* enable ADC interface */
    adc_enable(ADC0);
       
    /* wait for ADC stability */
    delay_ms(1);
       
    /* ADC calibration and reset calibration */
    adc_calibration_enable(ADC0);
   
    /* enable ADC software trigger */
    adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);       
}

void GD_ADC_MspInit(void)
{
    /* enable ADC clock */
    rcu_periph_clock_enable(RCU_ADC0);       
       
    /* config the GPIO as analog mode */
    gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_0);
    gpio_mode_set(GPIOC, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_0);
}

void GD_ADC_MspDeInit(void)
{
        rcu_periph_clock_disable(RCU_ADC0);
       
    gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_0);
    gpio_mode_set(GPIOC, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_0);
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

8

帖子

0

粉丝