打印

为什么STM32 ADC读出来的数值大于4096?是否需要位移,求教!!!

[复制链接]
6249|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Angel3598|  楼主 | 2012-12-18 14:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
为什么STM32 ADC读出来的数值大于4096?是否需要位移,求教!!!
沙发
uet_cache| | 2012-12-18 15:05 | 只看该作者
你看你是设置成左对齐模式还是右对齐模式。右对齐模式下,数值应该不会超过4095.

使用特权

评论回复
板凳
Angel3598|  楼主 | 2012-12-18 15:15 | 只看该作者
是右对齐啊 我测了一下Vref2.5 ad口处电压是1.25,但是读出来的数据超过4096,是否是程序配置问题呢?

使用特权

评论回复
地板
Angel3598|  楼主 | 2012-12-18 15:26 | 只看该作者
uet_cache 发表于 2012-12-18 15:05
你看你是设置成左对齐模式还是右对齐模式。右对齐模式下,数值应该不会超过4095. ...

是右对齐啊 我测了一下Vref2.5 ad口处电压是1.25,但是读出来的数据超过4096,是否是程序配置问题呢?

使用特权

评论回复
5
uet_cache| | 2012-12-18 16:08 | 只看该作者
你把电压调低里,AD读是不是也是变小。或者把电压调大,此值最大又是多少。也就是你的输入范围对应的数据分别为多少。还有可以把你的程序AD配置部分帖出来撒。。。。

使用特权

评论回复
6
Angel3598|  楼主 | 2012-12-18 16:20 | 只看该作者

                ADC_InitTypeDef       ADC_InitStructure;
          ADC_CommonInitTypeDef ADC_CommonInitStructure;
        
          ADC_DeInit();

                /* ADC Common Init */
          ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
          ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
          ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
          ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
          ADC_CommonInit(&ADC_CommonInitStructure);
         
        
          /* ADC1 Init */
          ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
          ADC_InitStructure.ADC_ScanConvMode =DISABLE;
          ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
          ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
          ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
          ADC_InitStructure.ADC_NbrOfConversion = 1;
          ADC_Init(ADC1, &ADC_InitStructure);
          //ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 1, ADC_SampleTime_3Cycles);
                                       
          /* Enable ADC1 */
          ADC_Cmd(ADC1, ENABLE);
         
          /*使能ADC1中断*/
          ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);
         
          /*启动ADC1转换*/
          //ADC_SoftwareStartConv(ADC1);
unsigned char loopi;
        //设置指定ADC的规则组通道,设置它们的转化顺序和采样时间
        ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_480Cycles);//ADC1,ADC通道3,规则采样顺序值为1,采样时间为239.5周期                                      
       delayms(100);
             ADC_SoftwareStartConv(ADC1);                //使能指定的ADC1的软件转换启动功能      
            advalue=0x00;
            for(loopi=0x00;loopi<128;loopi++)
            {
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束       
                                adtemp=ADC_GetConversionValue(ADC1);
        advalue=advalue+adtemp;        //返回最近一次ADC1规则组的转换结果
                                ADC_SoftwareStartConv(ADC1);   
                        }       
                        adref=advalue>>7;
}
这样的转换结果adref在0X8070左右一直这样 大哥 帮帮忙 刚刚接触单片机 啥也不懂

使用特权

评论回复
7
Angel3598|  楼主 | 2012-12-18 16:27 | 只看该作者
uet_cache 发表于 2012-12-18 16:08
你把电压调低里,AD读是不是也是变小。或者把电压调大,此值最大又是多少。也就是你的输入范围对应的数据分 ...


                ADC_InitTypeDef       ADC_InitStructure;
          ADC_CommonInitTypeDef ADC_CommonInitStructure;
        
          ADC_DeInit();

                /* ADC Common Init */
          ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
          ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
          ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
          ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
          ADC_CommonInit(&ADC_CommonInitStructure);
         
        
          /* ADC1 Init */
          ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
          ADC_InitStructure.ADC_ScanConvMode =DISABLE;
          ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
          ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
          ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
          ADC_InitStructure.ADC_NbrOfConversion = 1;
          ADC_Init(ADC1, &ADC_InitStructure);
          //ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 1, ADC_SampleTime_3Cycles);
                                       
          /* Enable ADC1 */
          ADC_Cmd(ADC1, ENABLE);
         
          /*使能ADC1中断*/
          ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);
         
          /*启动ADC1转换*/
          //ADC_SoftwareStartConv(ADC1);
unsigned char loopi;
        //设置指定ADC的规则组通道,设置它们的转化顺序和采样时间
        ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_480Cycles);//ADC1,ADC通道3,规则采样顺序值为1,采样时间为239.5周期                                      
       delayms(100);
             ADC_SoftwareStartConv(ADC1);                //使能指定的ADC1的软件转换启动功能      
            advalue=0x00;
            for(loopi=0x00;loopi<128;loopi++)
            {
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束        
                                adtemp=ADC_GetConversionValue(ADC1);
        advalue=advalue+adtemp;        //返回最近一次ADC1规则组的转换结果
                                ADC_SoftwareStartConv(ADC1);   
                        }        
                        adref=advalue>>7;
}
这样的转换结果adref在0X8070左右一直这样 大哥 帮帮忙 刚刚接触单片机 啥也不懂

使用特权

评论回复
8
uet_cache| | 2012-12-18 16:30 | 只看该作者
你的advalue的值是求了个128份平均值。那得要保证advalue的数据至少能够达到4095的128倍。你看是不是定义的u32数据类型。

使用特权

评论回复
9
Angel3598|  楼主 | 2012-12-18 16:37 | 只看该作者
uet_cache 发表于 2012-12-18 16:30
你的advalue的值是求了个128份平均值。那得要保证advalue的数据至少能够达到4095的128倍。你看是不是定义的 ...

没有用啊 我重新定义了一下,即使不是advalue  主要是adtmp他采样出来就是0x8070左右啊 单次采样的就不对

使用特权

评论回复
10
uet_cache| | 2012-12-18 16:41 | 只看该作者
哎,你也没分给。我懒得答了。反正提醒你的都提醒了。自己找问题吧。

使用特权

评论回复
11
Angel3598|  楼主 | 2012-12-18 16:45 | 只看该作者
uet_cache 发表于 2012-12-18 16:41
哎,你也没分给。我懒得答了。反正提醒你的都提醒了。自己找问题吧。

额,不是吧大哥,第一次在这里弄啊,不知道怎么给分啊,大哥帮帮忙吧,怎么给分不懂啊,真是新手。。

使用特权

评论回复
12
uet_cache| | 2012-12-18 16:47 | 只看该作者
你看大家都不理你,就是没分。。 分多了,一大堆人就理你了。
呵呵,,,,

使用特权

评论回复
13
uet_cache| | 2012-12-18 16:48 | 只看该作者
发帖时,有提示输入分值的嘛。我前些日子第一次用,也是白白浪费了20分。自动扣的,当时我没看到修改的地方。

使用特权

评论回复
14
Angel3598|  楼主 | 2012-12-18 16:51 | 只看该作者
uet_cache 发表于 2012-12-18 16:48
发帖时,有提示输入分值的嘛。我前些日子第一次用,也是白白浪费了20分。自动扣的,当时我没看到修改的地方 ...

那要不 我重发一次 可以吗

使用特权

评论回复
15
uet_cache| | 2012-12-18 16:56 | 只看该作者
你发一次,也让别人看看。我一人力有限啊。

使用特权

评论回复
16
明月小厨| | 2012-12-18 22:21 | 只看该作者
为什么STM32 ADC读出来的数值大于4096?
......到此已经错的离谱了;
例说你开车去加油,油箱只有60升,却加了90升的油,奇怪不奇怪啊?

使用特权

评论回复
17
明月小厨| | 2012-12-18 22:29 | 只看该作者
建议你只转换一次,然后看看结果对不对;ADC模拟端输入为0V;然后再接Vref,应该是满量程4096;
有的器件第一次转换会出现偏差,可以弃掉结果,再重新转换一次;

使用特权

评论回复
18
明月小厨| | 2012-12-18 22:31 | 只看该作者
0X8070;
最高位始终是1;你是不是设数据类型时设成有符号数了;

使用特权

评论回复
19
airwill| | 2012-12-19 12:47 | 只看该作者
楼上的分析有道理,  还有可能是 128 次累加的溢出问题.
楼主提供 advalue, adtemp 变量的定义.

使用特权

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

本版积分规则

8

主题

24

帖子

0

粉丝