[STM8] STM8L051F3的AD转换问题

[复制链接]
11182|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);
}

电压检测电路图

电压检测电路图
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 | 显示全部楼层
相差多少?
怎么换算的?
 楼主| asd046012 发表于 2014-6-24 14:12 | 显示全部楼层
本帖最后由 asd046012 于 2014-6-24 15:32 编辑
mmuuss586 发表于 2014-6-24 12:07
相差多少?
怎么换算的?

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

参考官方的程序试下
main.rar (2.42 KB, 下载次数: 191)
IJK 发表于 2014-6-25 10:03 | 显示全部楼层
要注意阻抗是否匹配,可以试着把R5、R6从100k改为1k。虽然用了比较慢的ADC_SamplingTime_384Cycles,但R5/R6用100k看上去仍然大了。
 楼主| asd046012 发表于 2014-6-25 15:21 | 显示全部楼层
IJK 发表于 2014-6-25 10:03
要注意阻抗是否匹配,可以试着把R5、R6从100k改为1k。虽然用了比较慢的ADC_SamplingTime_384Cycles,但R5/R ...

行  我试试
qiqi131493 发表于 2014-12-23 14:58 | 显示全部楼层
您好,stm8l051不是没有固件库吗?那你是用哪个的固件库进行修改了呢,怎么修改呢能教下我不?2191941460我QQ。
monkeypony 发表于 2014-12-30 21:57 | 显示全部楼层
学习学习
周董 发表于 2014-12-30 22:57 | 显示全部楼层
感觉挺好的呀,怎么会转换一直读不出正确的值呢
liuxynzy 发表于 2015-4-2 13:56 | 显示全部楼层
你怎么做的呢?我也读不出正确的值!
liuxynzy 发表于 2015-4-2 13:56 | 显示全部楼层
周董 发表于 2014-12-30 22:57
感觉挺好的呀,怎么会转换一直读不出正确的值呢

你怎么做的呢?我也读不出正确的值!
周董 发表于 2015-4-7 19:20 | 显示全部楼层
liuxynzy 发表于 2015-4-2 13:56
你怎么做的呢?我也读不出正确的值!

我觉得lz做的挺好的啊。不知道问题哪里呀!!
liuxynzy 发表于 2015-4-10 21:48 | 显示全部楼层
我的问题解决了,谢谢大家!是没有把DMA关掉!!!使用库函数 ADC_DMACmd(ADC1,ENABLE); 才是关掉DMA,而不是DISABLE !!!  另外谁做过STM8L051F3的HALT模式,我的电流还是大了些300uA多,不知道怎么降下来,看专门介绍降功耗的文档也没明显变化。有哪位大神指导下,TKS。
1314一路向前 发表于 2015-10-13 17:10 | 显示全部楼层
楼主你好,我也是在用到STM8L051F3的AD转换出现了问题。在未接分压电阻的情况下,测得的值每次都不一样。vdd=4v,在接1M,2M分压电阻的情况下,实测电压为2v,理论应该是2.67v。换成10k,20k后实测电压为1.33v。请问问题出在哪,方便的话参考一下你的程序,谢谢:'(  Q1312521617
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

10

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部