打印

关于STM32的ADC求解

[复制链接]
2120|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Lxiao|  楼主 | 2013-6-5 17:01 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
今天发现STM32的ADC有个很费解的现象:VDD、VDDA和VREF均接3.3V,电路如下图:

1、ADC端口输入3.3V的时候,采集输出结果只有4060。
2、把470电阻换成0欧姆,结果为4070。
3、去掉104后,结果竟然变成2550。

怎么才能使输入3.3V时,输出也为满幅?
沙发
IJK| | 2013-6-5 17:55 | 只看该作者
跟阻抗匹配有关系。
另外,虽然号称:VDD、VDDA和VREF均接3.3V,但这几个点的电平肯定还是略有差异---LZ如果用好点的万用表(4位半以上)看应该能看出差异,这跟PCB布线有一定关系。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
Lxiao + 2 有道理,我的万用表确实精度一般!这个速度.
板凳
hawksabre| | 2013-6-5 18:35 | 只看该作者
二极管   本身就有0.7V的偏差   这个   误差还是有的

使用特权

评论回复
评论
logokfu 2013-6-5 18:40 回复TA
人家这个是钳位,不影响吧 
评分
参与人数 1威望 +1 收起 理由
Lxiao + 1
地板
logokfu| | 2013-6-5 18:42 | 只看该作者
去掉104变成2550?,可能么这个?

使用特权

评论回复
评论
Lxiao 2013-6-6 13:44 回复TA
确实是这个现象! 
评分
参与人数 1威望 +1 收起 理由
Lxiao + 1
5
lcdi| | 2013-6-5 22:22 | 只看该作者
ADC使用前软件校准一下,内部也有Vref通道,测一下能否到满幅度。
第3个现象奇怪,可能是采样速度太快,把采样保持时间设置为较长。

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
Lxiao + 3
6
Lxiao|  楼主 | 2013-6-6 13:37 | 只看该作者
void ADC_Configuration(void)
{
        ADC_InitTypeDef ADC_InitStructure;

        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
        ADC_InitStructure.ADC_ScanConvMode = ENABLE;
        ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
        ADC_InitStructure.ADC_NbrOfChannel = 1;
        ADC_Init(ADC1, &ADC_InitStructure);
        ADC_Cmd(ADC1, ENABLE);
        ADC_ResetCalibration(ADC1);//允许ADC校准复位
        while(ADC_GetResetCalibrationStatus(ADC1));//待ADC校准复位完成*
        ADC_StartCalibration(ADC1);        //启动ADC校准
        while(ADC_GetCalibrationStatus(ADC1));         
}         
u16 ADC_GetOneChannelAINValue(u8 adc_channel_num)                 
{
        u16 adc_valuedat = 0;
  
        ADC_RegularChannelConfig(ADC1, adc_channel_num, 1, ADC_SampleTime_71Cycles5);
        ADC_Cmd(ADC1, ENABLE);
        ADC_ResetCalibration(ADC1);//允许ADC校准复位

//        while(ADC_GetResetCalibrationStatus(ADC1));//待ADC校准复位完成*         
        ADC_StartCalibration(ADC1);        //启动ADC校准
        while(ADC_GetCalibrationStatus(ADC1));          
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);
        adc_valuedat = ADC_GetConversionValue(ADC1);
        return adc_valuedat;
}
这是我的程序,每次转换前都会调用ADC_GetOneChannelAINValue(u8 adc_channel_num)。
       

使用特权

评论回复
7
Lxiao|  楼主 | 2013-6-6 13:41 | 只看该作者
本帖最后由 Lxiao 于 2013-6-6 13:43 编辑

我的万用表确实精度一般!这个速度PCB也会影响吗?万用表测得2脚电压是3.29V

使用特权

评论回复
8
huangxz| | 2013-6-6 14:25 | 只看该作者
不知道楼主设计这个电路的用意,但是按照一般的设计规则来是有问题的,104电容不应该在电阻前面
另外如果楼主出现奇怪的现象,可能是楼主电源的纹波比较大

使用特权

评论回复
9
Lxiao|  楼主 | 2013-6-6 14:45 | 只看该作者
J5那里要接个电阻型传感器的,电源LDO用的是LM1117,后面接有10V/16V钽电容,CPU的每个电源脚都有104,有的还有10V/16V钽电容。
感觉5楼讲的比较有道理,我试了使用内部Vref,结果无变化;到是用不同的采样时间,结果会不同,现在改了一个时间,输出可以到4083了。

使用特权

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

本版积分规则

个人签名:做人要厚道!

5

主题

70

帖子

0

粉丝