OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4429|回复: 3

STM32F030 ADC不同的扫描次序得到的值不同

[复制链接]

1

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
186
金钱
186
注册时间
2018-1-23
在线时间
61 小时
发表于 2018-1-23 18:53:39 | 显示全部楼层 |阅读模式
1金钱
在使用STM32F030CT6芯片自带的ADC采样,使用输入通道4,5,6和基准电压通道。采用连续转换+DMA模式。
采用扫描次序方向不同得到的基准电压AD值不同,采用倒序转换能得到准确的VDDA输入电压值。
ADC初始化代码:
void ADC_Init(void)
{
        GPIO_InitTypeDef GPIO_InitState;
        ADC_InitTypeDef ADC_InitState;
        DMA_InitTypeDef DMA_InitState;
  NVIC_InitTypeDef NVIC_InitState;
          /* ADC1 DeInit */  
  ADC_DeInit(ADC1);
          /* ADC1 Periph clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
       
        GPIO_InitState.GPIO_Mode = GPIO_Mode_AN;
        GPIO_InitState.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_4;
        GPIO_InitState.GPIO_PuPd = GPIO_PuPd_NOPULL;
        //GPIO_InitState.GPIO_Speed = GPIO_Speed_Level_3;
        GPIO_Init(GPIOA,&GPIO_InitState);  
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5|GPIO_PinSource6|GPIO_PinSource4, GPIO_AF_1);
  ADC_StructInit(&ADC_InitState);  
           
        DMA_InitState.DMA_BufferSize = 900;                                        //单次传输数据大小
        DMA_InitState.DMA_DIR = DMA_DIR_PeripheralSRC;//源地址为外设
        DMA_InitState.DMA_M2M = DMA_M2M_Disable;
        DMA_InitState.DMA_MemoryBaseAddr = (u32)AdReadBuf;        //
        DMA_InitState.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
        DMA_InitState.DMA_MemoryInc = DMA_MemoryInc_Enable;        ////内存地址寄存器递增
        DMA_InitState.DMA_Mode = DMA_Mode_Circular;                        //循环读取
        DMA_InitState.DMA_PeripheralBaseAddr = (u32)&(ADC1->DR);
        DMA_InitState.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
        DMA_InitState.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址寄存器不变
        DMA_InitState.DMA_Priority = DMA_Priority_High;
        DMA_Init(DMA1_Channel1,&DMA_InitState);
       
  NVIC_InitState.NVIC_IRQChannel = DMA1_Channel1_IRQn;
        NVIC_InitState.NVIC_IRQChannelPriority = 2;
        NVIC_InitState.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitState);

        /* DMA1 Channel1 enable */
        DMA_Cmd(DMA1_Channel1, ENABLE);
    DMA_ClearFlag(DMA_IT_TC);
    DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE);

        /* ADC DMA request in circular mode */
        ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);

//        /* Enable ADC_DMA */
//        ADC_DMACmd(ADC1, ENABLE);  

        /* Initialize ADC structure */
       
        ADC_InitState.ADC_ContinuousConvMode = ENABLE;
        ADC_InitState.ADC_DataAlign = ADC_DataAlign_Right;
        ADC_InitState.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
        ADC_InitState.ADC_Resolution = ADC_Resolution_12b;
        ADC_InitState.ADC_ScanDirection = ADC_ScanDirection_Backward;
        ADC_Init(ADC1,&ADC_InitState);
       
        /* Convert the ADC1 temperature sensor  with 239.5 Cycles as sampling time */
        ADC_ChannelConfig(ADC1, ADC_Channel_4 , ADC_SampleTime_239_5Cycles);  
        ADC_ChannelConfig(ADC1, ADC_Channel_5 , ADC_SampleTime_239_5Cycles);
        ADC_ChannelConfig(ADC1, ADC_Channel_6 , ADC_SampleTime_239_5Cycles);
        ADC_ChannelConfig(ADC1, ADC_Channel_Vrefint , ADC_SampleTime_239_5Cycles);
  ADC_VrefintCmd(ENABLE);
        /* ADC Calibration */
        ADC_GetCalibrationFactor(ADC1);


          /* Enable ADC_DMA */
        ADC_DMACmd(ADC1, ENABLE);  


        /* Enable ADC1 */
        ADC_Cmd(ADC1, ENABLE);     

        /* Wait the ADCEN falg */
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));

        /* ADC1 regular Software Start Conv */
        ADC_StartOfConversion(ADC1);
}

把以上代码中的ADC_InitState.ADC_ScanDirection = ADC_ScanDirection_Backward;
改成ADC_InitState.ADC_ScanDirection = ADC_ScanDirection_Upward;  得到的基准电压值就不正确。大概相差10个数字量左右。
换算得到的电压大概低了0.016V左右,求解···


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2018-1-24 00:39:59 | 显示全部楼层
回复

使用道具 举报

1

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
186
金钱
186
注册时间
2018-1-23
在线时间
61 小时
 楼主| 发表于 2018-1-24 08:24:13 | 显示全部楼层
求帮助解答
回复

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
145
金钱
145
注册时间
2018-8-4
在线时间
16 小时
发表于 2020-9-9 08:44:08 | 显示全部楼层
帮顶帮顶帮顶
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-17 10:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表