打印
[STM32F1]

STM32F103的ADC出现诡异结果

[复制链接]
1178|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我使用的是STM32F103VCT6
VDD,VDDA,VREF+都是直接连接到板上的3.3V供电,实测在3.27V
只有一个需要测量的外部信号,连接到PA2
使用ADC1+DMA方式采样
以下是我的ADC和DMA的初始化代码
PA2引脚已经配置为Analog IN,不是floating
ADC的时钟频率为7M
void ADC_DMA_Init (void)
{
        ADC_InitTypeDef ADC_InitStructure;
        DMA_InitTypeDef DMA_InitStructure;
        
        ADC_DeInit(ADC1);

        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
        ADC_InitStructure.ADC_ScanConvMode = ENABLE;
        ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
        ADC_InitStructure.ADC_NbrOfChannel = 10;
        ADC_Init(ADC1, &ADC_InitStructure);

        ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_239Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_239Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_239Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 4, ADC_SampleTime_239Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 5, ADC_SampleTime_239Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 6, ADC_SampleTime_239Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 7, ADC_SampleTime_239Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 8, ADC_SampleTime_239Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 9, ADC_SampleTime_239Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 10, ADC_SampleTime_239Cycles5);

        ADC_DMACmd(ADC1, ENABLE);

        //DMA_DeInit(DMA1_Channel1);
        DMA_InitStructure.DMA_PeripheralBaseAddr = 0x4001244C;
        DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&AD_Value[0];
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
        DMA_InitStructure.DMA_BufferSize = 10;
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
        DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
        DMA_Init(DMA1_Channel1, &DMA_InitStructure);
        DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE);
        DMA_Cmd(DMA1_Channel1,ENABLE);

        ADC_Cmd (ADC1, ENABLE);
        ADC_TempSensorVrefintCmd( ENABLE );
        
        p=0;
        while(p<10000)p++;
        ADC_ResetCalibration(ADC1);
        while(ADC_GetResetCalibrationStatus(ADC1)==SET)__NOP();
        ADC_StartCalibration(ADC1);
        while(ADC_GetCalibrationStatus(ADC1)==SET)__NOP();
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}


以下是采样以后的结果
外部信号加的是1.38V的直流信号
AD_Value[10]是对AD_Value[0]~[7]进行平均值运算以后的结果


根据这样的话,VREF+ = 1.38/(0x436)*(0xFFF) = 5.24V !!!
而内部的1.2V基准电压,仅仅只有 1.38/(0x436)*(0x336)=1.05V !!!


请问这样为什么会出现这样奇怪的结果?
沙发
mmuuss586| | 2016-8-7 13:02 | 只看该作者
差这么多,是不是电源和输入部分不稳啊;

软件多几次平均值滤波,硬件的电源部分,参考电压等多加些电容滤波看看;

采样这么多路AD数据,模拟和数字电源最好分开;

使用特权

评论回复
板凳
xiaoyuxiaoyu|  楼主 | 2016-8-7 14:50 | 只看该作者
mmuuss586 发表于 2016-8-7 13:02
差这么多,是不是电源和输入部分不稳啊;

软件多几次平均值滤波,硬件的电源部分,参考电压等多加些电容滤 ...

额,电源是用线性稳压器供电的,对应的引脚上都是就近接了4.7uF钽电容和0.1uF陶瓷电容的。
我采集的外部信号只有IN2这一路数据啊,我本来是想要过采样然后取均值的。
现在看下来采样的稳定性还不错啊,0~7的数据之间误差并不大啊。要是供电不稳,应该是数据和数据之间出现比较大的跳动吧?

使用特权

评论回复
地板
airwill| | 2016-8-7 16:51 | 只看该作者
如果不采用 DMA 的方法接收数据, 这问题就没有了吗

使用特权

评论回复
5
changle11sdo5| | 2016-8-7 17:22 | 只看该作者
0xFFF?

使用特权

评论回复
6
yklstudent| | 2016-8-7 21:20 | 只看该作者
也许是楼主算法处理上有问题,应该直接观察ADC转换后的值,而不是平均处理后的

使用特权

评论回复
7
icecut| | 2016-8-7 21:36 | 只看该作者
换个输入值,看变化.先确定数值来源于 adc

使用特权

评论回复
8
xiaoyuxiaoyu|  楼主 | 2016-8-8 13:12 | 只看该作者
yklstudent 发表于 2016-8-7 21:20
也许是楼主算法处理上有问题,应该直接观察ADC转换后的值,而不是平均处理后的 ...

数组0~7的数据就是原始的采样数据,同一个通道连续采样的

使用特权

评论回复
9
xiaoyuxiaoyu|  楼主 | 2016-8-8 13:12 | 只看该作者
icecut 发表于 2016-8-7 21:36
换个输入值,看变化.先确定数值来源于 adc

改变信号电压,AD转换的结果是会出现明显变化的

使用特权

评论回复
10
Aeman| | 2016-8-8 15:03 | 只看该作者
调试状态下单步执行,看单次转换的结果,然后进行分析!

使用特权

评论回复
11
quray1985| | 2016-8-8 16:31 | 只看该作者
有可能是这个算法有些问题,内部基准电压不可能达到这么高的啊

使用特权

评论回复
12
xmshao| | 2016-8-8 17:48 | 只看该作者
不妨检查下电路板的电源及相关线路。

电源波动大不大,电源相关脚该接的是否都接好了。

使用特权

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

本版积分规则

1

主题

4

帖子

0

粉丝