打印
[STM8]

STM8 的AD采集值有时会不变

[复制链接]
2427|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一语天涯|  楼主 | 2013-8-11 10:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 一语天涯 于 2013-8-12 16:41 编辑

遇到的问题:AD采集的值有时不变,即下面代码中的per_value的值,它的数据类型是float
我AD是采集灰尘传感器输出的电压值的,用万用表测AD的电压,是变化的,但AD读到的值却是不变的,并且不是一直都这样,时好时坏!!
求高手帮忙解决。
现在将代码贴在下面
/*******AD初始化函数*******/
void AD_init(void)
{
                ADC1->CR1=0x00;//预分屏,单次转换模式
                ADC1->CR2=0x00;//数据左对齐
                ADC1->CSR=0x03;//选择通道3
                ADC1->TDRH=0x80;//禁止使用施密特触发器(高)
                //ADC1->TDRL=0x80;//禁止使用施密特触发器(低)
                //ADC1->CR1|=0x01;//第一次开AD,把AD从低功耗模式下唤醒
                //Delayms(1);
                //ADC1->CR1|=0x01;//第二次开AD,启动AD转换
}
/***********AD采集函数***************/
void AD_read(void)
{
                u8 i;
                float ad_data=0;
                u16 temp_ad=0;//必须清零,否者会累加
                for(i=0;i<10;i++)
                {
                                ADC1->CR1|=0x01;//启动ADC,把AD从低功耗模式下唤醒
                                delay_ms(1);
                                ADC1->CR1|=0x01;//再次启动ADC,启动AD转换
                                while((ADC1->CSR & 0x80)!=0x80);
                                ADC1->CR1&=0xfe;
                                ad_value=ADC1->DRH;//因为是左对齐,所以要先多高八位
                                ad_value<<=2;//左移两位,因为STM8的AD是10位的
                                ad_value|=ADC1->DRL;//后读低八位
                                temp_ad+=ad_value;//求和
                }
                ad_data=temp_ad/10;//取十次的均值
                ad_data=ad_data*5/1024;//将AD值转化为电压值
                if(ad_data<0.5)//小于0.5V
                {
                                per_value=0;
                                shi=0;
                                ge=0;
                }
                if((ad_data>=0.5)&&(ad_data<2.0))//0.5V~2.0V之间
                {
                                //per_value=(1900*(ad_data-0.5)/1.5)/50.5;
                                per_value=(7600*ad_data-3800)/303;
                                per_value=(int)(per_value+0.5);//四舍五入
                                shi=(int)per_value/10;//分离出10位,强制转换为整型
                                ge=(int)per_value%10;//分离出个,强制转换成整型
                }
                if((ad_data>=2.0)&&(ad_data<3.5))//2.0v~3.5V??
                {
                                //per_value=((2100*(ad_data-2.0)/1.5)+1900)/50.5;
                                per_value=(2800*ad_data-1800)/101;
                                per_value=(int)(per_value+0.5);
                                shi=(int)per_value/10;
                                ge=(int)per_value%10;
                }
                if((ad_data>=3.5)&&(ad_data<3.8))//3.5V~3.8V之间
                {
                                //per_value=((1000*(ad_data-3.5)/0.3)+4000)/50.5;
                                per_value=(20000*ad_data-46000)/303;
                                per_value=(int)(per_value+0.5);
                                shi=(int)per_value/10;
                                ge=(int)per_value%10;
                }
                if(ad_data>=3.8)//大于3.8V时,显示99
                {
                                per_value=99;
                                shi=9;
                                ge=9;
                }
}





沙发
一语天涯|  楼主 | 2013-8-11 10:06 | 只看该作者
自己帮自己顶起,不能沉下去啊!!!

使用特权

评论回复
板凳
一语天涯|  楼主 | 2013-8-11 10:06 | 只看该作者
咋没人回复啊?

使用特权

评论回复
地板
hzpj01| | 2013-8-12 09:16 | 只看该作者
不变也不一定是错啊,你采集的是啥东西呢?

使用特权

评论回复
5
haitao10086| | 2013-8-12 11:59 | 只看该作者
不变是怎样不变?

使用特权

评论回复
6
一语天涯|  楼主 | 2013-8-12 16:27 | 只看该作者
hzpj01 发表于 2013-8-12 09:16
不变也不一定是错啊,你采集的是啥东西呢?

灰层传感器,我用万用表测量AD口的电压了,是变化的,但读到的AD值不变!

使用特权

评论回复
7
一语天涯|  楼主 | 2013-8-12 16:32 | 只看该作者
haitao10086 发表于 2013-8-12 11:59
不变是怎样不变?

我AD测量的是灰尘传感器输出的电压值,我用万用表测量AD口的电压是变化的,但读到的AD值却是不变的,并且这不是一直都这样,时好时坏!

使用特权

评论回复
8
一语天涯|  楼主 | 2013-8-12 16:33 | 只看该作者
自己再次顶一下,望高手帮忙解决下!!!

使用特权

评论回复
9
chuangpu| | 2013-8-12 19:30 | 只看该作者
帮楼主  顶一个  看看别人的意见  应该有办法解决

使用特权

评论回复
10
一语天涯|  楼主 | 2013-8-14 08:22 | 只看该作者
chuangpu 发表于 2013-8-12 19:30
帮楼主  顶一个  看看别人的意见  应该有办法解决

谢谢!

使用特权

评论回复
11
一语天涯|  楼主 | 2013-8-14 09:28 | 只看该作者
顶起,顶起!

使用特权

评论回复
12
xiaochun_gao| | 2013-8-14 11:08 | 只看该作者
AD_read() 函数是怎么调用的?
“时好时坏”说法应该更明确,是在一直上电过程中时好时坏,还是有时候上电之后好,有时候上电之后不好?

使用特权

评论回复
13
一语天涯|  楼主 | 2013-8-16 15:45 | 只看该作者
还是自己来回答吧!
while((ADC1->CSR & 0x80)!=0x80);
ADC1->CR1&=0xfe;
应该改为:
while((ADC1->CSR & 0x80)!=0x80);
ADC1->CSR=~0x80;
CSR是被硬件置位,需要软件清零,如果不清零,有可能就死在while里了,所以AD值会不变。
但有个疑问我还是没搞明白,如果不清零的话应该一直都不变的,为什么会出现有时候是正常的情况呢?继续等待大神来解答!!!

使用特权

评论回复
14
一语天涯|  楼主 | 2013-8-19 10:21 | 只看该作者
只有自己顶自己啊!!

使用特权

评论回复
15
食肉狼| | 2013-8-29 16:28 | 只看该作者
xiaochun_gao 发表于 2013-8-14 11:08
AD_read() 函数是怎么调用的?
“时好时坏”说法应该更明确,是在一直上电过程中时好时坏,还是有时候上电 ...

这个大神说的很清楚了
你不回答
没人能帮你

使用特权

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

本版积分规则

1

主题

17

帖子

1

粉丝