[STM32L1]

【急求!STM32L151C8T6关于ADC采样的问题,解决后私信红包】

[复制链接]
1473|9
手机看帖
扫描二维码
随时随地手机跟帖
Woodstockers|  楼主 | 2017-9-12 20:30 | 显示全部楼层 |阅读模式
求教各大神一个问题,我这边是想利用ADC1,ADC channel 0单通道,不利用DMA模式,来采样电压数值
Woodstockers|  楼主 | 2017-9-12 20:33 | 显示全部楼层
以下是我定义的ADC初始化函数

void ADC_Config(u8 ADC_Channel)
{
        ADC_InitTypeDef ADC_InitStructure;                                                                                                                       
       
        RCC_HSICmd(ENABLE);                                             //
       
        while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);            //

        ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;         
       
        ADC_InitStructure.ADC_ScanConvMode = DISABLE;            
       
        ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;            
       
        ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
       
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;         
       
        ADC_InitStructure.ADC_NbrOfConversion = 1;                     
       
        ADC_Init(ADC1, &ADC_InitStructure);                       
       
  ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1 ,ADC_SampleTime_4Cycles);
       
        ADC_DelaySelectionConfig(ADC1, ADC_DelayLength_Freeze);

  ADC_PowerDownCmd(ADC1, ADC_PowerDown_Idle_Delay, ENABLE);      
       
        ADC_Cmd(ADC1,ENABLE);                                       
       
  while (ADC_GetFlagStatus(ADC1, ADC_FLAG_ADONS) == RESET)
  {
  }

}

使用特权

评论回复
Woodstockers|  楼主 | 2017-9-12 20:35 | 显示全部楼层
这边是我写的电压采样函数,目的是采样692个点,然后用方均根法求出有效值

u16 ADC_DataAcquire(void)
{
        double c=0;                                 
       
        double adc_value=0;                                                                                                                               
       
        u16 sample_counter;                  
       
        ADC_Config(ADC_Channel_0);                    
       
//        ADC_SoftwareStartConv(ADC1);
       
        for (sample_counter=0;sample_counter<692;sample_counter++)
        {

//                ADC_Config(ADC_Channel_0);
               
          ADC_SoftwareStartConv(ADC1);                  
               
               
                while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET)//
                {
                }       
                adc_value=ADC_GetConversionValue(ADC1);     
       
          adc_value=adc_value*adc_value;         
               
                c=adc_value+c;                           
       
        }
       
    c=c/692;
       
          c=sqrt(c);
       
                adc_value=(3300*c)/4095;
               
       
        return adc_value;
       

}

使用特权

评论回复
Woodstockers|  楼主 | 2017-9-12 20:41 | 显示全部楼层
现在的问题是,第一次运行采样函数得到的值是正确的,但是第二次我用断点模式运行采样函数时时,ADC_GetConversionValue(ADC1)的返回值变得异常大,为302800左右(第一次的正确值在2048),不知道是初始化程序这边出问题了还是其他地方写的有问题,还请大神们指教,感激不尽!!!!

使用特权

评论回复
feelhyq| | 2017-9-12 21:15 | 显示全部楼层
疑点如下
1: adc_value=ADC_GetConversionValue(ADC1); 这个函数返回的应该是整形值,你的adc_value为什么要定义成 double ,从你踩完AD数据后进行计算来看,你的确想用double,那么应该从新定义一个double变量。
2: adc_value = adc_value * adc_value是否考虑到乘积溢出的问题。
3:既然开启了连续模式,为什么在for 循环里面还要调用这个函数ADC_SoftwareStartConv(ADC1);在for循环之前调用就可以了,但是你给注释掉了。
4: 在ADC连续采样的时候不要打断点,可以在for循环完了后面打断点。   

使用特权

评论回复
Woodstockers|  楼主 | 2017-9-12 23:59 | 显示全部楼层
feelhyq 发表于 2017-9-12 21:15
疑点如下
1: adc_value=ADC_GetConversionValue(ADC1); 这个函数返回的应该是整形值,你的adc_value为什 ...

您好,关于第三点,我在config函数里只是将连续转换使能,所以后来我在采样函数里面重新调用了它;关于第二点,我确定两个ADC_GetConversionValue(ADC1)返回值相乘(即我定义的 adc_value * adc_value)不会溢出,两次相乘的值最大在十进制的100左右。

第一点是我比较怀疑也是比较模糊的地方,但是当第一次调用采样函数时返回值是完全正确的,第二次调用时问题就出在ADC_GetConversionValue(ADC1);这里,不晓得为什么会突然变得很大,我是觉得是不是存放AD转换值的寄存器这边出了问题,第一次转换结束后没有清零之类的。

关于第四点您提到的打断点,是指 while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET){}这句么,我觉得很有可能是这句出了问题
               
         

使用特权

评论回复
feelhyq| | 2017-9-13 10:05 | 显示全部楼层
Woodstockers 发表于 2017-9-12 23:59
您好,关于第三点,我在config函数里只是将连续转换使能,所以后来我在采样函数里面重新调用了它;关于第 ...

既然你设置的是右对齐,12bit数据转换结果,那么获取的值应该是小于4096的

使用特权

评论回复
feelhyq| | 2017-9-13 10:06 | 显示全部楼层
Woodstockers 发表于 2017-9-12 23:59
您好,关于第三点,我在config函数里只是将连续转换使能,所以后来我在采样函数里面重新调用了它;关于第 ...

建议在写代码的时候,先把软件因素排除干净,因为软件因素是可控的,可以被确定解决的。解决软件因素后,再去排查硬件因素

使用特权

评论回复
Woodstockers|  楼主 | 2017-9-14 21:29 | 显示全部楼层
好吧 我后来是把不统一的类型都改掉了 貌似就好了

使用特权

评论回复
feelhyq| | 2017-9-15 12:09 | 显示全部楼层
Woodstockers 发表于 2017-9-14 21:29
好吧 我后来是把不统一的类型都改掉了 貌似就好了

结帖光荣

使用特权

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

本版积分规则

2

主题

17

帖子

0

粉丝