本帖最后由 一语天涯 于 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;
}
}
|