打印

如何用单片机直接采集220v交流市电信号?

[复制链接]
楼主: Harvard
手机看帖
扫描二维码
随时随地手机跟帖
21
风过芦苇| | 2012-9-13 10:39 | 只看该作者 回帖奖励 |倒序浏览
跑过

使用特权

评论回复
22
zhuyi2576| | 2012-9-13 11:19 | 只看该作者
我比较菜,你这个电路和还没看懂.麻烦讲讲

使用特权

评论回复
23
Wxy8030| | 2012-9-13 12:24 | 只看该作者
这样做可就误差太大了,真有效值采样的意义就失去了。
yewuyi 发表于 2012-9-13 09:34


误差是大,可楼主的要求不会那么高的 —— 一个低成本的设备,顺带监控一下频率和电压,超出207-253报警 ...... 很显然精度不会太高,更何谈还要去计算“真有效值”?普通万用表都没算真有效值,还不是大家都在用。

使用特权

评论回复
24
Harvard|  楼主 | 2012-9-13 13:25 | 只看该作者
呵呵 感谢楼上各位. 应该说问题得到了很好的解决. RMS用在此确实有些大材小用 ,但是还算OK ,昨天经过试验已经很好的采集了电压 .通过此c8051f的在线调试,把207和253对应的ad值,已经捕捉到, 后来用电压源发生器调试 ,已经能够做到207以下和253以上报警了.感谢各位,之前不准的地方在于,延时函数,有问题.20ms 32点,间隔625us,软件延时误差较大,后改成Timer2定时采集模式. 较好的达到了要求.另外把平方的过程独立到采集过程外,32点采集时,直接采集进入ad队列. 20ms结束后,才进行平方运算,再累加,开方..

使用特权

评论回复
25
Harvard|  楼主 | 2012-9-13 13:30 | 只看该作者
代码在此:
        /* 连续 AC220_AVG_CNT RMS采样 ,取平均值*/
         SYS_rms_total =0;
     for( j=0; j< AC220_AVG_CNT; j++ )
         {
                SYS_ad_total =0;  
                /* 等间隔采样 32点 */

                /* 启动定时器2 ,设置溢出间隔为SYS_delta_T
                *  设置ad由定时器2的溢出来启动
                */
                /* ******************************定时器2的启动 ,初始化*/
                T2SPLIT = 0;    //工作在16位自动重装模式
                T2XCLK =0;      // SYSCLK/12 . 约为1us一个
                TR2=0;
                TF2H=0;
                /* 625us 每次中断溢出 自动重载计数器 */
                TMR2H= (65535 - SYS_delta_T )/255;
                TMR2L = (65535 - SYS_delta_T )%255;
                TMR2RLH = (65535 - SYS_delta_T )/255;
                TMR2RLL = (65535 - SYS_delta_T )%255;

                TR2 = 1;
                ET2 = 1;
                EA =1;
                /*初始ad队列标记 及指针 */
                f_ad_done = 0;
                ad_index=0;
                /* ******************************定时器2的启动 ,初始化*/

                /* 等待一个周期采集完成 */
                while(1)
                {
                           wdt_reset        (   );
                        if( f_ad_done ==YES)
                        {
                                break;
                        }
                }
                 /*  挨个处理,计算RMS */
                for( i=0; i< AC220_CNT; i++ )
                {
                         SYS_ad_total += (u32)SYS_ad_buf[i]*SYS_ad_buf[i]        ;                  
                          wdt_reset        (   );
                }


                SYS_rms_total += KitFastSqrt(SYS_ad_total/32);         
         }
                 SYS_rms_total =          SYS_rms_total/AC220_AVG_CNT;

使用特权

评论回复
26
Harvard|  楼主 | 2012-9-13 13:31 | 只看该作者
/* AD定时采集: 自动采集32点数据, 625us间隔,*/
void T2_ISR( void ) interrupt 5
{
    /* 软件清除溢出标记 */
        if( TF2H )  TF2H =0;
        if( TF2L )  TF2L =0;
        if( f_ad_done == 0)
        {
                if(ad_index<32)
                {
                        SYS_ad_buf[ ad_index ] = ad_read(0);
                }
                ad_index++         ;

                if(ad_index ==32 )
                {
                        f_ad_done = YES;
                        ad_index =0;
                        ET2 =0;
                        TR2 =0;
                        TMR2H= 0;
                        TMR2L = 0;
                }
        }
}

使用特权

评论回复
27
yewuyi| | 2012-9-13 17:29 | 只看该作者
误差是大,可楼主的要求不会那么高的 —— 一个低成本的设备,顺带监控一下频率和电压,超出207-253报警 ...... 很显然精度不会太高,更何谈还要去计算“真有效值”?普通万用表都没算真有效值,还不是大家都在用 ...
Wxy8030 发表于 2012-9-13 12:24


呵呵,要谈成本那就没办法了,那是真金白银,只有老板才能说了算。
但现在百十块的万用表多数都应该是真有效值检测的,当然,这种万用表的响应速度一般比较慢,精度也比较低,至于不是真有效值的万用表,估计只能是那种电子市场的30多块的产品了吧!

使用特权

评论回复
28
joyme| | 2012-9-13 18:33 | 只看该作者
我觉得把电容电阻参数算好,做个最大值检测电路来判断也可以,这种产品应该精确度在5%以内可以接受的

使用特权

评论回复
29
09电气| | 2012-9-13 21:40 | 只看该作者
这个我做过,做的全自动交流直流双用电压表,电阻分压,LM324运放进行电平转换(抬高电位,使采样值没有负值),MAX232给运放盒模拟开关提供电压,CD4052模拟开关量程切换,ATmega32定时器触发采样10KHZ采样,误差1%左右。量程0~250V。改一下分压电阻可以扩大,300~400没问题。最大问题没有高低压隔离。

使用特权

评论回复
30
huaizhi1985| | 2012-9-13 22:21 | 只看该作者
最好加个互感器隔离,不然片子很可能会烧掉。

使用特权

评论回复
31
yewuyi| | 2012-9-13 22:41 | 只看该作者
我觉得把电容电阻参数算好,做个最大值检测电路来判断也可以,这种产品应该精确度在5%以内可以接受的
joyme 发表于 2012-9-13 18:33

峰值检测就保证不了精度了

使用特权

评论回复
32
Harvard|  楼主 | 2012-9-17 20:41 | 只看该作者
峰值检测难以保证精度.有道理

使用特权

评论回复
33
borrow1988| | 2015-6-7 11:08 | 只看该作者
我现在做的是 电压互感器 输出电流 *电阻 = V 交流电,  我用STM32内置ADC采集,请问算法上如何做,比如我采集多少个点比较好,采集后怎么处理,能得到电压

使用特权

评论回复
34
qqwudi| | 2020-8-19 10:58 | 只看该作者
楼主,膜拜你,我权限太低了,不能给你留言,怎么加你QQ和微信,我想向你拜师交流电检测的问题

使用特权

评论回复
35
madboy21| | 2020-8-19 15:50 | 只看该作者
非常老的贴子了,也不知道楼主还在不在。所有解决问题上面都有网友回复过,我这里再做个小小的总结:
1、采用均方根算法
2、采样周期应该是50Hz与60Hz公交点。
3、采样点数越多精度越高(我通常采样500-1000个点)
4、8位机算力够不够?当然够,因为采样周期是50mS,在一个采样周期内完全可以完成开方运算。

使用特权

评论回复
36
qqwudi| | 2020-8-20 02:34 | 只看该作者
但我硬件有一点和他不一样,我是半波整流,就一个二级管,但他是全波整流

使用特权

评论回复
37
qqwudi| | 2020-8-20 02:35 | 只看该作者
madboy21 发表于 2020-8-19 15:50
非常老的贴子了,也不知道楼主还在不在。所有解决问题上面都有网友回复过,我这里再做个小小的总结:
1、采 ...

我是半波整流,还可以用楼主的软件算法去做吗?

使用特权

评论回复
38
steelen| | 2020-8-20 09:44 | 只看该作者
谁说精度差
可以做到1%甚至更好的精度
不过,你的设计有问题

使用特权

评论回复
39
qqwudi| | 2020-8-23 13:01 | 只看该作者
楼主,频率和电压检测是在单片机两个不同的引脚吗?麻烦把原理图截出来,谢谢

使用特权

评论回复
40
qqwudi| | 2020-8-23 13:09 | 只看该作者
09电气 发表于 2012-9-13 21:40
这个我做过,做的全自动交流直流双用电压表,电阻分压,LM324运放进行电平转换(抬高电位,使采样值没有负 ...

可以教一下我这个交流电压值用单片机采集出来,有偿请教

使用特权

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

本版积分规则