打印
[STM8]

STM8L051F3的AD转换问题

[复制链接]
10619|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
asd046012|  楼主 | 2014-6-24 11:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 asd046012 于 2014-6-24 11:53 编辑


电压采样原理图


STM8L的ADC转换一直读不出正确的值。就是读出的值和预期的值相差很大。采用的是连续转换模式,电池是3V,由于分压,采集的电压最大值为1.5V,当低于1.05V时,我们认为电池没电,LED亮,采集的值都是66。程序如下:
void ADC_BaseInit(void)
{
        uint8_t i;
        uint16_t adc_number[3];
        GPIO_Init(GPIOD,GPIO_Pin_0,GPIO_Mode_Out_PP_High_Slow);                      //PD0 输出高电平
        GPIO_Init(GPIOB,GPIO_Pin_0,GPIO_Mode_In_FL_No_IT);                               //PB0 设置浮空输入
        GPIO_Init(GPIOB,GPIO_Pin_1,GPIO_Mode_Out_PP_Low_Slow);                     //PB1 输出低电平
        GPIO_SetBits(GPIOD,GPIO_Pin_0);
        GPIO_ResetBits(GPIOB,GPIO_Pin_1);
        
        CLK_PeripheralClockConfig(CLK_Peripheral_ADC1,ENABLE);
        ADC_DeInit(ADC1);
        
        ADC_Init(ADC1,ADC_ConversionMode_Continuous,ADC_Resolution_12Bit,ADC_Prescaler_2);
        ADC_SamplingTimeConfig(ADC1,ADC_Group_SlowChannels,ADC_SamplingTime_384Cycles);
        ADC_VrefintCmd(ENABLE);
        ADC_DMACmd(ADC1,DISABLE);        
        ADC_Cmd(ADC1,ENABLE);
        ADC_ChannelCmd(ADC1,ADC_Channel_18,ENABLE);
        for(i=0;i<3;i++)
        {
           ADC_SoftwareStartConv(ADC1);  
          while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==0);
          adc_number=ADC_GetConversionValue(ADC1);
ADC_ClearFlag(ADC1,ADC_FLAG_EOC);

              }
adc_number[0] = (adc_number[1] + adc_number[2])/2;
        if(adc_number[0] <  2866)
        {
                GPIO_ResetBits(GPIOD, GPIO_Pin_0);
                Delay_ms(40);
        }
        ADC_Cmd(ADC1,DISABLE);
}

QQ图片20140624113345.jpg (37.52 KB )

电压检测电路图

电压检测电路图
沙发
IJK| | 2014-6-24 11:49 | 只看该作者
LZ的问题是什么?

使用特权

评论回复
板凳
asd046012|  楼主 | 2014-6-24 11:54 | 只看该作者
IJK 发表于 2014-6-24 11:49
LZ的问题是什么?

ADC采集转换的值和预期的值相差很大。也就是说ADC采集的值不正确。

使用特权

评论回复
地板
mmuuss586| | 2014-6-24 12:07 | 只看该作者
相差多少?
怎么换算的?

使用特权

评论回复
5
asd046012|  楼主 | 2014-6-24 14:12 | 只看该作者
本帖最后由 asd046012 于 2014-6-24 15:32 编辑
mmuuss586 发表于 2014-6-24 12:07
相差多少?
怎么换算的?

ADC采集的值应该和1,5V相对应。参考电压3V。换算后的值2048差不多吧!我上面说了读出的值是66,相差太大

使用特权

评论回复
6
mmuuss586| | 2014-6-24 19:03 | 只看该作者
asd046012 发表于 2014-6-24 14:12
ADC采集的值应该和1,5V相对应。参考电压3V。换算后的值2048差不多吧!我上面说了读出的值是66,相差太大 ...

参考官方的程序试下
main.rar (2.42 KB)

使用特权

评论回复
7
IJK| | 2014-6-25 10:03 | 只看该作者
要注意阻抗是否匹配,可以试着把R5、R6从100k改为1k。虽然用了比较慢的ADC_SamplingTime_384Cycles,但R5/R6用100k看上去仍然大了。

使用特权

评论回复
8
asd046012|  楼主 | 2014-6-25 15:21 | 只看该作者
IJK 发表于 2014-6-25 10:03
要注意阻抗是否匹配,可以试着把R5、R6从100k改为1k。虽然用了比较慢的ADC_SamplingTime_384Cycles,但R5/R ...

行  我试试

使用特权

评论回复
9
qiqi131493| | 2014-12-23 14:58 | 只看该作者
您好,stm8l051不是没有固件库吗?那你是用哪个的固件库进行修改了呢,怎么修改呢能教下我不?2191941460我QQ。

使用特权

评论回复
10
monkeypony| | 2014-12-30 21:57 | 只看该作者
学习学习

使用特权

评论回复
11
周董| | 2014-12-30 22:57 | 只看该作者
感觉挺好的呀,怎么会转换一直读不出正确的值呢

使用特权

评论回复
12
liuxynzy| | 2015-4-2 13:56 | 只看该作者
你怎么做的呢?我也读不出正确的值!

使用特权

评论回复
13
liuxynzy| | 2015-4-2 13:56 | 只看该作者
周董 发表于 2014-12-30 22:57
感觉挺好的呀,怎么会转换一直读不出正确的值呢

你怎么做的呢?我也读不出正确的值!

使用特权

评论回复
14
周董| | 2015-4-7 19:20 | 只看该作者
liuxynzy 发表于 2015-4-2 13:56
你怎么做的呢?我也读不出正确的值!

我觉得lz做的挺好的啊。不知道问题哪里呀!!

使用特权

评论回复
15
liuxynzy| | 2015-4-10 21:48 | 只看该作者
我的问题解决了,谢谢大家!是没有把DMA关掉!!!使用库函数 ADC_DMACmd(ADC1,ENABLE); 才是关掉DMA,而不是DISABLE !!!  另外谁做过STM8L051F3的HALT模式,我的电流还是大了些300uA多,不知道怎么降下来,看专门介绍降功耗的文档也没明显变化。有哪位大神指导下,TKS。

使用特权

评论回复
16
1314一路向前| | 2015-10-13 17:10 | 只看该作者
楼主你好,我也是在用到STM8L051F3的AD转换出现了问题。在未接分压电阻的情况下,测得的值每次都不一样。vdd=4v,在接1M,2M分压电阻的情况下,实测电压为2v,理论应该是2.67v。换成10k,20k后实测电压为1.33v。请问问题出在哪,方便的话参考一下你的程序,谢谢:'(  Q1312521617

使用特权

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

本版积分规则

4

主题

10

帖子

1

粉丝