请问一下,我用PIC单片机的AD转换来测直流电压(0~5V),然后用数码管来显示(三位)
出现的问题是,数码管最后一位值在不挺的变化,我推测应该是AD每次的转换值不一样导致的结果,因为我把第一次和第二次转换之间加上延时的话数码管最后一位的变化速度就和延时的时间...
出现的问题是,数码管最后一位值在不挺的变化,我推测应该是AD每次的转换值不一样导致的结果,因为我把第一次和第二次转换之间加上延时的话数码管最后一位的变化速度就和延时的时间差不多,不知道该怎么解决啊?
请高手帮忙一下 展开
请高手帮忙一下 展开
展开全部
加个数字滤波程序,理论就是:采AD值N次(如20次),存在内存里,然后程序将这20个数从低到高排列,取中间一位作为算出的AD值,每0.5s(或其它延时时间)进行一次数字滤波,这样得出的AD值就稳定了,这是中值滤波法,当然还有限幅滤波(就是设电压上下限)、平均数(去最大值和最小值,再求平均值)等数字滤波法,单片机做检测电压值一般都要用数字滤波。
给你个C语言的中值滤波法:
#define N 10
typedef unsigned int u16;
u16 voltage_filter(void)
{
char count,i,j;
static u16 value_buf[N];
u16 sum=0,temp;
for(count=0;count<N;count++)
{
value_buf[count] = GetADCValue(5);
}
for(j=0;j<N-1;j++)
{
for(i=0;i<N-j;i++)
{
if(value_buf[i]>value_buf[i+1])
{
temp = value_buf[i];
value_buf[i]=value_buf[i+1];
value_buf[i+1]=temp;
}
}
}
for(count=1;count<N-1;count++)
sum+=value_buf[count];
return (sum/(N-2));
}
给你个C语言的中值滤波法:
#define N 10
typedef unsigned int u16;
u16 voltage_filter(void)
{
char count,i,j;
static u16 value_buf[N];
u16 sum=0,temp;
for(count=0;count<N;count++)
{
value_buf[count] = GetADCValue(5);
}
for(j=0;j<N-1;j++)
{
for(i=0;i<N-j;i++)
{
if(value_buf[i]>value_buf[i+1])
{
temp = value_buf[i];
value_buf[i]=value_buf[i+1];
value_buf[i+1]=temp;
}
}
}
for(count=1;count<N-1;count++)
sum+=value_buf[count];
return (sum/(N-2));
}
2011-11-20
展开全部
明显是“AD每次的转换值不一样导致的结果”,可以用多次采样平均的简单的办法解决,就是不要每采一次都显示,可以采8、16、32、64次相加后平均再输出显示,这样就不会抖了,而且多次采样平均也符合统计学原则。(采8、16、32、64次是为了平均时方便用右移3、4、5、6位方式实现,速度快)
追问
你说的这个应该就是中位值滤波法是吧?
,还有就是你说的“(采8、16、32、64次是为了平均时方便用右移3、4、5、6位方式实现,速度快) ”
我不是很明白,我刚学单片机,你能说清楚一点吗?
谢谢
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
变化很正常,可能是电压本身就在变化,可以加一个判断,就是判断最后一个数码管显示的数值如果发生了多大的变化,你才更新它显示的内容,否则不更新最后一个数码管现实的内容。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你发个电路图看看
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询