[STM32F1] ADC采集,数据只有0和4095,是什么问题?

[复制链接]
 楼主| at0755 发表于 2017-11-10 09:23 | 显示全部楼层 |阅读模式


STM32F103VET6,ADC+DMA采集,电压是16.8V电池电阻6分压的电压
接上电池AD数据就是4095,不接就是0,IO口量过电压是2点多伏

程序在RET6上正常使用,到VET6上由IO口由C口换到了PB1,仔细检查过很多遍了
估计可能是什么原因?帮我指点下方向我再检查
一路向北lm 发表于 2017-11-10 10:25 | 显示全部楼层
程序的问题,再检查下你的程序。
不爱说话 发表于 2017-11-10 10:57 | 显示全部楼层
ADC+DMA 我也遇到了这个现象读回来的数不是0就是4095或者1023,2047这几种。
 楼主| at0755 发表于 2017-11-10 11:17 | 显示全部楼层
不爱说话 发表于 2017-11-10 10:57
ADC+DMA 我也遇到了这个现象读回来的数不是0就是4095或者1023,2047这几种。

后来怎么解决的?
 楼主| at0755 发表于 2017-11-10 11:31 | 显示全部楼层
初始化程序很简单,用的引脚是PA0,PA1和PB1


void  Adc_Init(void)
{        
        ADC_InitTypeDef ADC_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB |RCC_APB2Periph_ADC1,ENABLE );       
        RCC_ADCCLKConfig(RCC_PCLK2_Div6);   
       
                        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;               
        GPIO_Init(GPIOA, &GPIO_InitStructure);       
                               
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;               
        GPIO_Init(GPIOB, &GPIO_InitStructure);       

        ADC_DeInit(ADC1);  

            ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
            ADC_InitStructure.ADC_ScanConvMode = ENABLE;//DISABLE;            
            ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;                            
            ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;  
            ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;  
            ADC_InitStructure.ADC_NbrOfChannel = 5;
            ADC_Init(ADC1, &ADC_InitStructure);   
   
          ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5 );   
           ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_239Cycles5 );   
           ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 3, ADC_SampleTime_239Cycles5 );   
        ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 4, ADC_SampleTime_239Cycles5 );
        ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 5, ADC_SampleTime_239Cycles5 );   

            ADC_Cmd(ADC1, ENABLE);     
            ADC_DMACmd(ADC1, ENABLE);      
   
        ADC_TempSensorVrefintCmd(ENABLE);
            ADC_ResetCalibration(ADC1);                 
            while(ADC_GetResetCalibrationStatus(ADC1));        
            ADC_StartCalibration(ADC1);      
            while(ADC_GetCalibrationStatus(ADC1));   

        ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}                                  



void DMA_Config(void)
{  
    DMA_InitTypeDef DMA_InitStructure;   
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);   
     
    DMA_DeInit(DMA1_Channel1);  
    DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;  
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&AD_Value;  
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  
   
    DMA_InitStructure.DMA_BufferSize = 5;  
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;  
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;  
   
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;  
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;  
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  
    DMA_Init(DMA1_Channel1, &DMA_InitStructure);  
     
    DMA_Cmd(DMA1_Channel1, ENABLE);  
}
mmuuss586 发表于 2017-11-10 12:43 | 显示全部楼层
换了IO,通道也要换下;
不爱说话 发表于 2017-11-10 12:54 | 显示全部楼层
at0755 发表于 2017-11-10 11:17
后来怎么解决的?

还没解决。因为我这是用的STM32 linux系统,ADC驱动是linux里的,跟STM32的固件库完全不同。
songchenping 发表于 2017-11-10 12:56 | 显示全部楼层
看一下示例代码。再改改就行了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

59

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部