求教,ADC 读数总是不对……

[复制链接]
3264|7
 楼主| grissiom 发表于 2011-11-17 10:37 | 显示全部楼层 |阅读模式
ADC, IO, pi, ADC1, gp
本帖最后由 grissiom 于 2011-11-17 10:44 编辑

直接上代码:
  1. #include <rtthread.h>

  2. #include "stm32f10x.h"

  3. void adc_entry(void *param)
  4. {
  5.         uint16_t adv = 0;
  6.         GPIO_InitTypeDef gpio_conf;
  7.         ADC_InitTypeDef adc_conf;
  8.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | \
  9.                                RCC_APB2Periph_ADC2 | \
  10.                                RCC_APB2Periph_GPIOA,
  11.                                ENABLE);
  12.         RCC_ADCCLKConfig(RCC_PCLK2_Div6);

  13.         GPIO_StructInit(&gpio_conf);
  14.         gpio_conf.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
  15.         gpio_conf.GPIO_Mode = GPIO_Mode_AIN;
  16.         GPIO_Init(GPIOA, &gpio_conf);

  17.         ADC_StructInit(&adc_conf);
  18.         adc_conf.ADC_Mode = ADC_Mode_Independent;
  19.         adc_conf.ADC_ScanConvMode = DISABLE;
  20.         adc_conf.ADC_ContinuousConvMode = DISABLE;
  21.         adc_conf.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  22.         adc_conf.ADC_DataAlign = ADC_DataAlign_Right;
  23.         adc_conf.ADC_NbrOfChannel = 1;
  24.         ADC_Init(ADC1, &adc_conf);
  25.         /* ADC1 regular channels configuration */
  26.         ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_28Cycles5);
  27.         /* Enable ADC1 DMA */
  28.         ADC_Cmd(ADC1, ENABLE);

  29.         /* Enable ADC1 reset calibration register */
  30.         ADC_ResetCalibration(ADC1);
  31.         /* Check the end of ADC1 reset calibration register */
  32.         while(ADC_GetResetCalibrationStatus(ADC1))
  33.                 ;
  34.         /* Start ADC1 calibration */
  35.         ADC_StartCalibration(ADC1);
  36.         /* Check the end of ADC1 calibration */
  37.         while(ADC_GetCalibrationStatus(ADC1))
  38.                 ;


  39.         while (1) {
  40.                 rt_thread_delay(10);
  41.                 ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
  42.                 ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  43.                 while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) != SET)
  44.                         ;
  45.                 adv = ADC_GetConversionValue(ADC1);
  46.                 rt_kprintf("got adv: %d\n\r", adv);
  47.         }

  48. }

管脚电压应该是 3.27V 左右,但是读数总是 2300 …… 请问软件哪里写错了?……

多谢~;)
香水城 发表于 2011-11-17 10:58 | 显示全部楼层
请注意AD引脚的输入阻抗。
 楼主| grissiom 发表于 2011-11-17 11:02 | 显示全部楼层
是通过运放输入的,阻抗应该没问题。附件是电路图。force_AD 是连到 PA2 口的。

电路图画的比较烂,见笑了……
无标题.png
香水城 发表于 2011-11-17 11:08 | 显示全部楼层
不好意思,我看不懂你的电路。

建议你先把这个信号断开,用2个电阻分压,看看读数差多少;请注意引脚的输入阻抗。
 楼主| grissiom 发表于 2011-11-17 14:00 | 显示全部楼层
好吧,好像是虚焊的问题…… 测量管脚电压的时候用探针戳了一下,之后 AD 值就对了…… 囧死了……
sinadz 发表于 2011-11-17 18:01 | 显示全部楼层
虚悍惹得祸啊,有过类似的经历
taitaijing 发表于 2011-11-22 19:47 | 显示全部楼层
我也有过类似的经历,跟踪,一步一步来吧。
taitaijing 发表于 2011-11-23 13:46 | 显示全部楼层
属于经典问题,一步一步来吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

84

帖子

1

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