打印

求助:为什么我STM32L152的单通道连续AD采集 数据不稳定

[复制链接]
7143|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yeluojin|  楼主 | 2011-2-24 10:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题两次数据有时候正好是1024 可能是丢位
但是具体还不清楚是怎么回事
请高人指教
沙发
yeluojin|  楼主 | 2011-2-24 10:09 | 只看该作者
void ADCInit(void)
{
   ADC_InitTypeDef ADC_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
   /* ADC Configuration -------------------------------------------------------*/
   
  RCC_HSICmd(ENABLE); // Enable HSI Clock
   
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);  // Enable the AHB peripheral clock
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); // Enable the APB2 peripheral clock
  
  GPIO_InitStructure.GPIO_Speed= GPIO_Speed_40MHz;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  ADC_StructInit(&ADC_InitStructure);
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//精度为12位
  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_5, 1, ADC_SampleTime_96Cycles ); // ADC1 regular channel20 configuration

  //ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE); //中断使能

  //ADC_EOCOnEachRegularChannelCmd(ADC1, ENABLE);

  ADC_TempSensorVrefintCmd(ENABLE);//温度传感器

  //ADC_DelaySelectionConfig(ADC1,ADC_DelayLength_Freeze);

  ADC_Cmd(ADC1, ENABLE); //Enable ADC1
                                  
  while (ADC_GetFlagStatus(ADC1, ADC_FLAG_ADONS) == RESET)          // Wait until ADC1 ON status 设置完成
  {
  }

  ADC_SoftwareStartConv(ADC1);
}


//采集电压值//
uint16_t Get_Battery_voltage(void)
{
     __IO uint16_t ADCdata = 0;        //转换完的结果

         while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET)// Wait until ADC Channel 20 end of conversion
    {
    }
         
         ADCdata = ADC_GetConversionValue(ADC1);             // Read ADC conversion result

                  if(ADCdata>4000||ADCdata<3000)
             wrong1++;

                         wrong3++;



   //ADC12_Off();
   //ADC12_DeInit();//复位
//        while(ADC_GetFlagStatus(ADC1, ADC_FLAG_ADONS) == RESET)
//        {
//        }

         
  return ADCdata;
}

以上是我的初始化函数,和读取函数~请各位帮忙看看

使用特权

评论回复
板凳
yeluojin|  楼主 | 2011-2-24 14:36 | 只看该作者
哪位高人指点我一下……………………苦求…………

使用特权

评论回复
地板
IJK| | 2011-2-24 14:53 | 只看该作者
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//是否连续转换

使用 连续转换的方式?

使用特权

评论回复
5
yeluojin|  楼主 | 2011-2-24 15:15 | 只看该作者
无论使用哪种转换模式 都会产生很大的波动

使用特权

评论回复
6
IJK| | 2011-2-24 17:43 | 只看该作者
无论使用哪种转换模式 都会产生很大的波动
yeluojin 发表于 2011-2-24 15:15


很大的波动,有多大?
使用STM32的 AD,需要注意一下阻抗匹配。保险起见,可以设置最大的采样时间。

使用特权

评论回复
7
yeluojin|  楼主 | 2011-2-25 09:05 | 只看该作者
正常采样的数据是3300——3400之间
但是波动的值能到1000多~~这个让我很郁闷~怎么匹配阻抗?

使用特权

评论回复
8
zhaoyu2005| | 2011-2-25 09:48 | 只看该作者
本帖最后由 zhaoyu2005 于 2011-2-25 09:50 编辑

LZ,注意你的信号源内阻,STM32的AD输入阻抗不是固定的,采样率高,阻抗低,采样率低,阻抗高,这个其实很好理解,采样电路,相当于对一个电容充电,想采样的快,就需要充电速度快,也就是充电电流大,所以需要信号源内阻小,如果信号源内阻大,充电电流小,充电速度慢,在启动AD转换时,电容还没充到信号电压,转换后的值就小了。所以在AD输入之前加缓冲驱动还是比较好的

烦请楼主回答下:这个芯片的百片价格,看中了LCD驱动,但是带usb,估计比较贵,在网上没查到价格,请LZ答疑

使用特权

评论回复
9
yeluojin|  楼主 | 2011-2-25 13:38 | 只看该作者
芯片是我们公司直接订购的,具体的内容我也不是特别了解。我现在在这家公司实习,所以也不太方便去打听。真是抱歉。

这个AD转换 我们主要用来转换电池电压。

我在错误数据中,找到了一些规律。 就是采集的结果可能丢失了 最高位或者其他位。

例如采集到的错误结果是 1000    正确的采样值应该是3048    希望大家能帮我找处这个问题的所在。

使用特权

评论回复
10
zhaoyu2005| | 2011-2-25 13:53 | 只看该作者
你还是先交叉验证是哪儿的问题吧,比如用低内阻的信号源验证是否是信号源内阻的原因,用稳定的电压验证是否是被测电压存在毛刺,用稳定的参考电压验证电压基准源,这些弄完了基本上就知道是硬件的还是软件的问题了,然后再针对地处理
顺便说下,一般AD转换值需要进行数字滤波再用

使用特权

评论回复
11
yeluojin|  楼主 | 2011-2-25 14:45 | 只看该作者
我估计是软件问题

使用特权

评论回复
12
IJK| | 2011-2-25 14:50 | 只看该作者
我估计是软件问题
yeluojin 发表于 2011-2-25 14:45


建议LZ用 ST提供的例程,先试试

使用特权

评论回复
13
IJK| | 2011-2-25 14:52 | 只看该作者
芯片是我们公司直接订购的,具体的内容我也不是特别了解。我现在在这家公司实习,所以也不太方便去打听。真是抱歉。

这个AD转换 我们主要用来转换电池电压。

我在错误数据中,找到了一些规律。 就是采集的结果可能 ...
yeluojin 发表于 2011-2-25 13:38


如果AD直接 接电池,应该阻抗匹配不成问题。
如果电池通过电阻分压接AD,应该检查阻抗匹配问题

使用特权

评论回复
14
IJK| | 2011-2-25 14:53 | 只看该作者
烦请楼主回答下:这个芯片的百片价格,看中了LCD驱动,但是带usb,估计比较贵,在网上没查到价格,请LZ答疑 ...
zhaoyu2005 发表于 2011-2-25 09:48


印象里,STM32L在淘宝上有卖。
另外,印象里ST官方的STM32L发布价格,在2$左右。

使用特权

评论回复
15
yeluojin|  楼主 | 2011-2-25 15:54 | 只看该作者
通过实验 进一步发现就是丢失了最高位~~导致数据错误 但是不知道为什么会丢失最高位

电路方面,我并没有直接连接电源,而是做了一个简单的分压电路,并且通过示波器  发现波形还是很稳定的………


弱弱的问一下 哪里有例程?

使用特权

评论回复
16
yeluojin|  楼主 | 2011-2-25 16:05 | 只看该作者
找到例程…………………………里面的方法 我都试过了~~还是一样的不给力啊

使用特权

评论回复
17
hzj8300| | 2011-2-27 22:16 | 只看该作者
把ADC_SoftwareStartConv(ADC1);去掉试下

使用特权

评论回复
18
yeluojin|  楼主 | 2011-3-2 18:02 | 只看该作者
问题终于解决了,秀娥该了PMW里一个选项,变成1.2v就搞定了

使用特权

评论回复
19
zhj1163979310| | 2019-9-29 17:13 | 只看该作者
yeluojin 发表于 2011-3-2 18:02
问题终于解决了,秀娥该了PMW里一个选项,变成1.2v就搞定了

楼主是怎么解决的,我用STM32L151 采样时也经常跳出一个很大的值

使用特权

评论回复
20
caoenq| | 2019-9-30 09:18 | 只看该作者
当AD采集管脚用时,不要配置IO速度

使用特权

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

本版积分规则

0

主题

22

帖子

0

粉丝