打印

如何用MCU测交流电的电压?

[复制链接]
2871|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
JohnOx|  楼主 | 2007-11-29 20:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我有以下方案,但都有不理想的地方:
1。过零点后5mS采样一次峰值
   好处资源占用少,但若频率有偏差或波形失真大时测不准。

2。在过零点检测电路两次上升(或下降)沿间采样N次,求出平均值,再换算成有效值
    好处是得到的数据没干扰时很稳定,但在过零点附近有毛刺时数据就乱了。

3。 连续在100mS采样200点以上计算
    好处是抗干扰强,但即使恒定输入,但采样后的计算结果会有1%-2%左右的波动。

    大家还有什么好办法,拿出来分享下?

相关帖子

沙发
JohnOx|  楼主 | 2007-11-29 20:34 | 只看该作者

补充第3

如果增加采样时间和点数,结果会很好, 但出结果太慢。

使用特权

评论回复
板凳
qihao| | 2007-11-29 23:55 | 只看该作者

我也正考虑呢

万用表的电路--RC--》RC 后进行AD  但必然相应速度慢
你提的这个好像也不错的办法。!

有进展还望留言再此。

使用特权

评论回复
地板
xwj| | 2007-11-30 00:08 | 只看该作者

算法问题,去搜索“十种数字滤波方法”

使用特权

评论回复
5
qihao| | 2007-11-30 11:56 | 只看该作者

呵呵 搜到了 ,谢 XWJ

看了XWJ 的两个鸟~ 再请教一个问题:

   咋自然界都是公的漂亮,唯独人是母的漂亮呢?

不解中,   搜哪个关键字? 反正10种滤波器算法里我看找不到答案~

使用特权

评论回复
6
gxs64| | 2007-11-30 12:38 | 只看该作者

re

30MS内采样N次,求得Vpp,共求16个Vpp,排序,取中间 8个求平均。

使用特权

评论回复
7
JohnOx|  楼主 | 2007-11-30 17:39 | 只看该作者

谢谢楼上三位!

6楼雪松兄俺久闻大名,现在还在上海吧!

您的方法不错,得到的数据会很稳定;但在波形切顶时似乎无法得到有效值,还有每得到一个数据大约要500mS,似乎太长了。

使用特权

评论回复
8
JohnOx|  楼主 | 2007-11-30 17:41 | 只看该作者

是不是这些算法? 俺还没找到合用的。

 
 1、限副滤波 
/*  A值可根据实际情况调整 
   value为有效值,new_value为当前采样值   
   滤波程序返回有效的实际值  */ 
#define A 10  



char value; 



char filter() 

  char  new_value; 
  new_value = get_ad(); 
  if ( ( new_value - value > A ) || ( value - new_value > A ) 
     return value; 
  return new_value; 
         




2、中位值滤波法 
/*  N值可根据实际情况调整 
   排序采用冒泡法*/ 
#define N  11 



char filter() 

  char value_buf[N]; 
  char count,i,j,temp; 
  for ( count=0;count<N;count++) 
  { 
     value_buf[count] = get_ad(); 
     delay(); 
  } 
  for (j=0;j<N-1;j++) 
  { 
     for (i=0;i<N-j;i++) 
     { 
        if ( value_buf>value_buf[i+1] ) 
        { 
           temp = value_buf; 
           value_buf = value_buf[i+1];  
            value_buf[i+1] = temp; 
        } 
     } 
  } 
  return value_buf[(N-1)/2]; 
}      



3、算术平均滤波法 
/* 
*/ 



#define N 12 



char filter() 

  int  sum = 0; 
  for ( count=0;count<N;count++) 
  { 
     sum + = get_ad(); 
     delay(); 
  } 
  return (char)(sum/N); 




4、递推平均滤波法(又称滑动平均滤波法) 
/* 
*/ 
#define N 12  



char value_buf[N]; 
char i=0; 



char filter() 

  char count; 
  int  sum=0; 
  value_buf[i++] = get_ad(); 
  if ( i == N )   i = 0; 
  for ( count=0;count<N,count++) 
     sum = value_buf[count]; 
  return (char)(sum/N); 




5、中位值平均滤波法(又称防脉冲干扰平均滤波法) 
/* 
*/ 
#define N 12 



char filter() 

  char count,i,j; 
  char value_buf[N]; 
  int  sum=0; 
  for  (count=0;count<N;count++) 
  { 
     value_buf[count] = get_ad(); 
     delay(); 
  } 
  for (j=0;j<N-1;j++) 
  { 
     for (i=0;i<N-j;i++) 
     { 
        if ( value_buf>value_buf[i+1] ) 
        { 
           temp = value_buf; 
           value_buf = value_buf[i+1];  
            value_buf[i+1] = temp; 
        } 
     } 
  } 
  for(count=1;count<N-1;count++) 
     sum += value[count]; 
  return (char)(sum/(N-2)); 




6、限幅平均滤波法 
/* 
*/   
略 参考子程序1、3 



7、一阶滞后滤波法 
/* 为加快程序处理速度假定基数为100,a=0~100 */ 



#define a 50 



char value; 



char filter() 

  char  new_value; 
  new_value = get_ad(); 
  return (100-a)*value + a*new_value;  




8、加权递推平均滤波法 
/* coe数组为加权系数表,存在程序存储区。*/ 



#define N 12 



char code coe[N] = {1,2,3,4,5,6,7,8,9,10,11,12}; 
char code sum_coe = 1+2+3+4+5+6+7+8+9+10+11+12; 



char filter() 

  char count; 
  char value_buf[N]; 
  int  sum=0; 
  for (count=0,count<N;count++) 
  { 
     value_buf[count] = get_ad(); 
     delay(); 
  } 
  for (count=0,count<N;count++) 
     sum += value_buf[count]*coe[count]; 
  return (char)(sum/sum_coe); 




9、消抖滤波法 



#define N 12 



char filter() 

  char count=0; 
  char new_value; 
  new_value = get_ad(); 
  while (value !=new_value); 
  { 
     count++; 
     if (count>=N)   return new_value; 
      delay(); 
     new_value = get_ad(); 
  } 
  return value;     

 
 

使用特权

评论回复
9
JohnOx|  楼主 | 2007-11-30 17:44 | 只看该作者

可能俺没说清,准备做个交流稳压器。

使用特权

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

本版积分规则

1

主题

9

帖子

0

粉丝