打印
[AVR单片机]

交流电压测量探讨

[复制链接]
8254|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qhcmcu|  楼主 | 2009-5-7 12:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
测交流电压(10HZ~1KHZ)的有效值和平均值。采样频率1K.
原理:等信号一个周期到计算有效值和平均值,如果把这个值直接去显示,则跳动很大。因此我做了个1S显示周期延迟,显示值将显示1秒内的平均值。效果好很多,但末位还是有在跳。ATMEGA8的单片机。(硬件没问题,主要是软件的滤波效果)。请各位指点有没有错误,或采用什么更好的方法?

相关帖子

沙发
mxh0506| | 2009-5-9 22:55 | 只看该作者

采样频率1K去测最高1KHz的交流电?

没搞错吧?不知跳动的时候被测交流电频率是多少

使用特权

评论回复
板凳
ayb_ice| | 2009-5-10 20:29 | 只看该作者

一般是先转成DC再测量

使用特权

评论回复
地板
qhcmcu|  楼主 | 2009-5-11 12:36 | 只看该作者

跳动的时候被测交流电频率是50hz

采样频率已改成2K.
以微处理器为核心的电工测量仪表可以直接对交流电的波形进行采样,并通过计算信号在一个或若干个信号周期内采样数据的方均根来求信号的有效值。

如果显示周期延迟是0.1S,则跳动也比较大?1S显示周期延迟可以达到要求(响应慢,我想要快点,但跳动比较大)
我现在一个或若干(4)个信号周期,也试不出好效果。

信号一个周期(50HZ)可以采40点.1KHZ信号一个周期只能采2点。这样行吗?
以这样的采样原理ATMEGA8单片机采样频率可以做到多少呢?
理论上:采样频率=2倍被测信号频率

请高手们指教!!!谢!

使用特权

评论回复
5
xjavr| | 2009-5-19 14:08 | 只看该作者

采样率太低

如果你真要测1KHZ的信号,不要说2KHZ采样,10KHZ采样也难符合要求...

这样就引来了另外一个问题就是,采样率高了,计算的速度可能就跟不了...

使用特权

评论回复
6
qhcmcu|  楼主 | 2009-5-19 17:27 | 只看该作者

楼上这样行吗?测50HZ的信号采样频率2K

先不说测1KHZ的信号。
我现在采样频率2K,测50HZ的交流电信号一个周期(20ms)可以采40点,通过计算一个信号周期内采样数据的方均根得到有效值,采用0.1S显示周期延迟(显示值将显示0.1秒内有效值的平均值)。显示数据跳动还是比较大(不知道是什么问题(硬件没问题))

使用特权

评论回复
7
xjavr| | 2009-5-20 17:43 | 只看该作者

可以这样测

你可以把数据保存下来,发出来分析

步骤:
1:用信号发生器,输出一标准50HZ正弦信号
2:用MEGA8采样后,保存,通过串口发出来,人工分析

主要是看采样后的数据变化,如果两次采样相差很大,应该是硬件没做好

如果相差不大,应该是程序有问题,或者程序滤波效果不好...

还有就是,你说的跳动较大,是有多大?

使用特权

评论回复
8
mxh0506| | 2009-5-22 11:40 | 只看该作者

采样频率提高后, S/H部分的时间常数考虑了吗?

使用特权

评论回复
9
西门吹血| | 2009-5-23 16:38 | 只看该作者

有没有找到过零点?如果不找的话你要做变换的!频率也要

使用特权

评论回复
10
qhcmcu|  楼主 | 2009-5-26 17:27 | 只看该作者

电压跳动

电压负半周通过硬件翻转成正半周得到连续的正的半波,接到ADC7。
电压通过LM311转成频率信号接INT0。
频率显示正常。
0.1S显示周期延迟,显示的电压末位变化很快(一直在变),随电压升高跳的字变多最大大概6,7个字(变化很快)。
1S显示周期延迟,显示的电压末位变化1个字。
(硬件是有决对OK的,大家不需要考虑)
我的软件滤波方法是:把每一个周期信号计算的均方根值相加,0.1S显示周期延迟时间到计算显示值=均方根和/信号周期数。

这种方法是否可行,有什么更好的滤波效果大家说说看?
要找过零点,怎么做呢,请赐教?

使用特权

评论回复
11
cool_coder| | 2009-5-26 23:26 | 只看该作者

“硬件是有决对OK的,大家不需要考虑”:何以见得?

如果方向走错了,就需要退回原地重来。

使用特权

评论回复
12
nizhenyuchina| | 2014-12-23 17:30 | 只看该作者
//此程序运行在60HZ,采样频率在20KHZ 将结果转化为ADC为Q15的格式
//*********** Structure Init Function ****//
void SINEANALYZER_DIFF_IQ_init(SINEANALYZER_DIFF_IQ *v){
        v->Vin=_IQ15(0.0);
        v->SampleFreq=_IQ15(0.0);
        v->Threshold=_IQ15(0.0);
        v->Vrms=_IQ15(0.0);
        v->Vavg=_IQ15(0.0);
        v->Vema=_IQ15(0.0);
        v->SigFreq=_IQ(0.0);
        v->ZCD=0;
        v->Vacc_avg=_IQ15(0.0);
        v->Vacc_rms=_IQ15(0.0);
        v->Vacc_ema=_IQ15(0.0);
        v->curr_sample_norm=_IQ15(0.0);
        v->prev_sign=1;
        v->curr_sign=1;
        v->nsamples=0;
        v->nsamplesMin=0;
        v->nsamplesMax=0;
        v->inv_nsamples=_IQ15(0.0);
        v->inv_sqrt_nsamples=_IQ15(0.0);
}

//*********** Function Definition ********//
void SINEANALYZER_DIFF_IQ_FUNC(SINEANALYZER_DIFF_IQ *v)
{
        if ( v->Vin > v->Threshold)//比较阀值做过零检测用
        {
                v->curr_sample_norm = v->Vin;//保存输入电压
                v->curr_sign = 1;//方向为正
        }
        else
        {
                v->curr_sample_norm = _IQ15abs(v->Vin);//低于阀值保存输入电压
                v->curr_sign = 0;//方向为负值
        }
        //发生信号改变
        if((v->prev_sign != v->curr_sign) && (v->curr_sign == 1))//方向改变且此时方向向上
        {
            v->ZCD=1;//检测到过零点
                v->inv_nsamples = _IQ15div(_IQ15(1.0), (v->nsamples<<15));//1/N  N为半周期采样个数
                v->inv_sqrt_nsamples = _IQ15isqrt(v->nsamples<<15);//1/N开方
            if(v->nsamplesMin < v->nsamples < v->nsamplesMax)//若采样数在范围内
            {
                        v->Vavg = _IQ15mpy(v->Vacc_avg, v->inv_nsamples);//求平均数
                        v->Vrms = _IQ15mpy(_IQ15sqrt(v->Vacc_rms), _IQ15isqrt(v->nsamples<<15));//求RMS
                        v->Vema = v->Vacc_ema;//求EMA
            }
            else//范围外复位
            {
                    v->Vavg = 0;
                    v->Vrms = 0;
                    v->Vema = 0;
            }
            v->SigFreq = (_IQ15mpy(v->SampleFreq, v->inv_nsamples));//频率为采样频率乘以1/N
            v->prev_sign = v->curr_sign;//更新
            v->Vacc_avg = 0;//复位采样数据
            v->Vacc_rms = 0;//复位采样数据
            v->Vacc_ema = 0;//复位采样数据
            v->nsamples=0;//复位采样个数
        }
        else//若没发生跳变
        {
                v->nsamples++;//计数
                v->Vacc_avg = v->Vacc_avg+v->curr_sample_norm;//求和
                v->Vacc_rms = v->Vacc_rms+_IQ15mpy(v->curr_sample_norm,v->curr_sample_norm);//求和
                v->Vacc_ema = v->Vacc_ema+_IQ15mpy(_IQ15(0.01), (v->curr_sample_norm - v->Vacc_ema));
                v->ZCD=0;//归零
                v->prev_sign = v->curr_sign;//更新方向标识
        }
}

使用特权

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

本版积分规则

45

主题

86

帖子

1

粉丝