打印
[STM32F1]

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

[复制链接]
5042|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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这几种。

后来怎么解决的?

使用特权

评论回复
5
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);  
}

使用特权

评论回复
6
mmuuss586| | 2017-11-10 12:43 | 只看该作者
换了IO,通道也要换下;

使用特权

评论回复
7
不爱说话| | 2017-11-10 12:54 | 只看该作者
at0755 发表于 2017-11-10 11:17
后来怎么解决的?

还没解决。因为我这是用的STM32 linux系统,ADC驱动是linux里的,跟STM32的固件库完全不同。

使用特权

评论回复
8
songchenping| | 2017-11-10 12:56 | 只看该作者
看一下示例代码。再改改就行了

使用特权

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

本版积分规则

12

主题

59

帖子

1

粉丝