打印

AD采样不准,抖动大

[复制链接]
6370|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
用AD1的通道15对温度传感器的上电压进行采样,通过WATCH窗口查看AD转换的结果发现采样的值总是一个大的范围的抖动,百思不得其解  温度传感的部分的电路如下 :AD部分的驱动如下:/****************ADC配置函数******************************/
/*********************************************************/
void ConfigADC()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);      //打开ADC1的时钟
   ADC_InitStruct.ADC_Mode=ADC_Mode_Independent;                      /*!< Configures the ADC to operate in independent or
                                                      dual mode.
                                                      This parameter can be a value of @ref ADC_mode */
   ADC_InitStruct.ADC_ScanConvMode=DISABLE;             /*!< Specifies whether the conversion is performed in
                                                      Scan (multichannels) or Single (one channel) mode.
                                                      This parameter can be set to ENABLE or DISABLE */
   ADC_InitStruct.ADC_ContinuousConvMode=DISABLE;       /*!< Specifies whether the conversion is performed in
                                                       Continuous or Single mode.
                                                       This parameter can be set to ENABLE or DISABLE. */
   ADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;          /*!< Defines the external trigger used to start the analog
                                                       to digital conversion of regular channels. This parameter
                                                       can be a value of @ref ADC_external_trigger_sources_for_regular_channels_conversion */
   ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;                   /*!< Specifies whether the ADC data alignment is left or right.
                                                       This parameter can be a value of @ref ADC_data_align */
   ADC_InitStruct.ADC_NbrOfChannel=1;                     /*!< Specifies the number of ADC channels that will be converted
                                                       using the sequencer for regular channel group.
                                                       This parameter must range from 1 to 16. */
ADC_Init(ADC1,&ADC_InitStruct);
ADC_RegularChannelConfig(ADC1,ADC_Channel_11,1,ADC_SampleTime_239Cycles5);
ADC_Cmd(ADC1,ENABLE);
//初始化时开启一次自动校准
ADC_ResetCalibration(ADC1);
    while(ADC_GetResetCalibrationStatus(ADC1));
     // Start ADC1 calibaration
    ADC_StartCalibration(ADC1);
     // Check the end of ADC1 calibration
    while(ADC_GetCalibrationStatus(ADC1));
}

AD的时钟为12M   RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);   
通道11的对应端口为PC1:GPIO_InitStruct.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AIN;     //模拟输入
GPIO_Init(GPIOC,&GPIO_InitStruct);
读取AD结果int16_t TemperSample()   //要关闭外部中断,启动一次AD转换,计算出温度值
{
uint16_t   T_Vaule,i;

// ADC_Cmd(ADC1,ENABLE);
  ADC_SoftwareStartConvCmd(ADC1,ENABLE);    //开启一次软件触发AD         
  while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));  
  T_Vaule=ADC_GetConversionValue(ADC1);  //取回转换值
return(T_Vaule);
}

2013-06-28 16.45.44.jpg (81.17 KB )

2013-06-28 16.45.44.jpg
沙发
程序会不会|  楼主 | 2013-6-28 17:01 | 只看该作者
VEF+ VEF值也正常 ,搞了一天了 头疼死了

使用特权

评论回复
板凳
IJK| | 2013-6-28 17:04 | 只看该作者
1.什么芯片?
2.抖动是多大?

使用特权

评论回复
地板
程序会不会|  楼主 | 2013-6-28 21:47 | 只看该作者
IJK 发表于 2013-6-28 17:04
1.什么芯片?
2.抖动是多大?

STM32F107VC    从WATCH上看  大概从0x6b0到0x7e0    用万用表量过 当时温度传感上的电压为1.51V

使用特权

评论回复
5
IJK| | 2013-7-1 10:05 | 只看该作者
程序会不会 发表于 2013-6-28 21:47
STM32F107VC    从WATCH上看  大概从0x6b0到0x7e0    用万用表量过 当时温度传感上的电压为1.51V ...

温度传感器是STM32F107VC  内部的吗?  从0x6b0到0x7e0  抖动太大。可以看看 Vref+和GND的PCB走线和滤波怎么样。

可以直接用2个1k电阻对Vref+进行分压、测量,看抖动如何。

使用特权

评论回复
6
程序会不会|  楼主 | 2013-7-1 12:51 | 只看该作者
IJK 发表于 2013-7-1 10:05
温度传感器是STM32F107VC  内部的吗?  从0x6b0到0x7e0  抖动太大。可以看看 Vref+和GND的PCB走线和滤波 ...

我用的是开发板上的AD口来检测外部的温度传感器,后来发现这个AD口本来就连接着其它东西,后来换了个AD口就好了!

使用特权

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

本版积分规则

46

主题

443

帖子

5

粉丝