打印

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

[复制链接]
2541|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
grissiom|  楼主 | 2011-11-17 10:37 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
ADC, IO, pi, ADC1, gp
本帖最后由 grissiom 于 2011-11-17 10:44 编辑

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

#include "stm32f10x.h"

void adc_entry(void *param)
{
        uint16_t adv = 0;
        GPIO_InitTypeDef gpio_conf;
        ADC_InitTypeDef adc_conf;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | \
                               RCC_APB2Periph_ADC2 | \
                               RCC_APB2Periph_GPIOA,
                               ENABLE);
        RCC_ADCCLKConfig(RCC_PCLK2_Div6);

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

        ADC_StructInit(&adc_conf);
        adc_conf.ADC_Mode = ADC_Mode_Independent;
        adc_conf.ADC_ScanConvMode = DISABLE;
        adc_conf.ADC_ContinuousConvMode = DISABLE;
        adc_conf.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
        adc_conf.ADC_DataAlign = ADC_DataAlign_Right;
        adc_conf.ADC_NbrOfChannel = 1;
        ADC_Init(ADC1, &adc_conf);
        /* ADC1 regular channels configuration */
        ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_28Cycles5);
        /* Enable ADC1 DMA */
        ADC_Cmd(ADC1, ENABLE);

        /* Enable ADC1 reset calibration register */
        ADC_ResetCalibration(ADC1);
        /* Check the end of ADC1 reset calibration register */
        while(ADC_GetResetCalibrationStatus(ADC1))
                ;
        /* Start ADC1 calibration */
        ADC_StartCalibration(ADC1);
        /* Check the end of ADC1 calibration */
        while(ADC_GetCalibrationStatus(ADC1))
                ;


        while (1) {
                rt_thread_delay(10);
                ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
                ADC_SoftwareStartConvCmd(ADC1, ENABLE);
                while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) != SET)
                        ;
                adv = ADC_GetConversionValue(ADC1);
                rt_kprintf("got adv: %d\n\r", adv);
        }

}

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

多谢~;)
沙发
香水城| | 2011-11-17 10:58 | 只看该作者
请注意AD引脚的输入阻抗。

使用特权

评论回复
板凳
grissiom|  楼主 | 2011-11-17 11:02 | 只看该作者
是通过运放输入的,阻抗应该没问题。附件是电路图。force_AD 是连到 PA2 口的。

电路图画的比较烂,见笑了……

无标题.png (36.54 KB )

无标题.png

使用特权

评论回复
地板
香水城| | 2011-11-17 11:08 | 只看该作者
不好意思,我看不懂你的电路。

建议你先把这个信号断开,用2个电阻分压,看看读数差多少;请注意引脚的输入阻抗。

使用特权

评论回复
5
grissiom|  楼主 | 2011-11-17 14:00 | 只看该作者
好吧,好像是虚焊的问题…… 测量管脚电压的时候用探针戳了一下,之后 AD 值就对了…… 囧死了……

使用特权

评论回复
6
sinadz| | 2011-11-17 18:01 | 只看该作者
虚悍惹得祸啊,有过类似的经历

使用特权

评论回复
7
taitaijing| | 2011-11-22 19:47 | 只看该作者
我也有过类似的经历,跟踪,一步一步来吧。

使用特权

评论回复
8
taitaijing| | 2011-11-23 13:46 | 只看该作者
属于经典问题,一步一步来吧。

使用特权

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

本版积分规则

0

主题

84

帖子

1

粉丝