打印
[STM32F0]

030F4ADC使用遇问题

[复制链接]
838|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mcuatmel|  楼主 | 2017-5-19 16:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ADC, DMA, DM, ni, IO
我用了4个通道,DMA方式采样,现在问题是:有时上电后030F4的AD部分运行不正常,在没有外界信号的情况下,AD通道对应引脚电压会近2V,至少要到1.5V或以上,出来的AD码也很大,而有时是正常的,不知为什么,求指点,程序如下:
void ADC1_DMA_Init(void)
{
        ADC_InitTypeDef     ADC_InitStruct;
        DMA_InitTypeDef     DMA_InitStruct;
        GPIO_InitTypeDef    GPIO_InitStruct;
          /* ADC1 DeInit */  
        ADC_DeInit(ADC1);
        /* ADC1 Periph clock enable */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
        /* DMA1 clock enable */
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 , ENABLE);

        /* Configure PA.01  as analog input */
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN;
        GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL ;
        GPIO_Init(GPIOA, &GPIO_InitStruct);       

        /* Configure PB.00 PB.01  as analog input */
        GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_0|GPIO_Pin_1;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN;
        GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL ;
        GPIO_Init(GPIOB, &GPIO_InitStruct);       

        /* DMA1 Channel1 Config */
        DMA_DeInit(DMA1_Channel1);
        DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_Address;
        DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)&RegularConvData_Tab;
        DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;
        DMA_InitStruct.DMA_BufferSize =4;
        DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
        DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
        DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
        DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;
        DMA_InitStruct.DMA_Priority = DMA_Priority_High;
        DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;
        DMA_Init(DMA1_Channel1, &DMA_InitStruct);
        /* DMA1 Channel1 enable */
        DMA_Cmd(DMA1_Channel1, ENABLE);
        /* ADC DMA request in circular mode */
        ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
        /* Enable ADC_DMA */
        ADC_DMACmd(ADC1, ENABLE);  
        /* Initialize ADC structure */
        ADC_StructInit(&ADC_InitStruct);
        /* Configure the ADC1 in continous mode withe a resolutuion equal to 12 bits  */
        ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b;
        ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;
        ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
        ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
        ADC_InitStruct.ADC_ScanDirection = ADC_ScanDirection_Backward;
        ADC_Init(ADC1, &ADC_InitStruct);

//   /* Convert the ADC1 temperature sensor  with 55.5 Cycles as sampling time */
//   ADC_ChannelConfig(ADC1, ADC_Channel_TempSensor , ADC_SampleTime_55_5Cycles);  
//   ADC_TempSensorCmd(ENABLE);
  
        /* Convert the ADC1 Vref  with 55.5 Cycles as sampling time */
        ADC_ChannelConfig(ADC1, ADC_Channel_0  , ADC_SampleTime_55_5Cycles);
        ADC_ChannelConfig(ADC1, ADC_Channel_1  , ADC_SampleTime_55_5Cycles);
        ADC_ChannelConfig(ADC1, ADC_Channel_8  , ADC_SampleTime_55_5Cycles);
        ADC_ChannelConfig(ADC1, ADC_Channel_9  , ADC_SampleTime_55_5Cycles);
//   ADC_VrefintCmd(ENABLE);
        /* ADC Calibration */
        ADC_GetCalibrationFactor(ADC1);
        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);
}
沙发
mcuatmel|  楼主 | 2017-5-20 13:35 | 只看该作者
自己顶一下

使用特权

评论回复
板凳
mcuatmel|  楼主 | 2017-5-20 15:56 | 只看该作者
现在发现,如果不连续转换,还算好用,但跳动的厉害,另外,零飘也大,没信号时有230个码上一,不知为什么。
AD初始化要改成这样,才能用,但还不算好用。
        ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b;
        ADC_InitStruct.ADC_ContinuousConvMode = DISABLE; //不连续转换,只转换一次
        ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
        ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
        ADC_InitStruct.ADC_ScanDirection = ADC_ScanDirection_Backward;
        ADC_Init(ADC1, &ADC_InitStruct);

使用特权

评论回复
地板
1988020566| | 2017-5-20 23:05 | 只看该作者
030F4ADC是什么

使用特权

评论回复
5
1988020566| | 2017-5-20 23:06 | 只看该作者
前端电路测量的电压是多大

使用特权

评论回复
6
huangcunxiake| | 2017-5-21 18:10 | 只看该作者
AD不要悬空。

使用特权

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

本版积分规则

512

主题

1456

帖子

2

粉丝