急:谁有用单片机测量交流电压的程序?

2020-02-06 09:46发布

谁有用单片机测量交流电压的程序?220V电压经过处理,电压抬高了2.5V,问各位大侠客有类似的经验。

我现在做的测量的很不准确。
电压一会是220,一会是250,一会是180,一会是012V
我很头疼?
下午大侠帮忙。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
98条回答
jacky1982512
2020-02-08 01:03
void        Deal_AD(void)
{
        unsigned        char        HI,Low,i;
        //static      uchar        k;
        unsigned        long        data,j,a,b;
        unsigned        int            c,m1,Adresult_avg;
        //float       m2;
//        double            m;

       
//        for(i=0;i<20;i++)                   // 20
//                AD_Reseve=AD_Sample;            // 读采样值,以免在计算时被新的采样值覆盖
       
        ///*       
        for(i=0;i<20;i++)                   // 读采样值,以免在计算时被新的采样值覆盖
                {
                        if(AD_Sample>512)
                        {
                                AD_Reseve=AD_Sample-512;
                        }
                       
                        else
                        {
                                AD_Reseve=512-AD_Sample;
                        }
                }
        //*/       
        data=0;                             // data先清零
        for(i=0;i<20;i++)                                        // 计算16[20]点采样值平方和
                {
                        HI=AD_Reseve>>8;                    // 高2位
                        Low=AD_Reseve&0xff;            // 低8位,隐形转换Low=AD_Reseve;
                        a=HI*HI;               
                        a=a<<16;
                        b=(HI*Low);
                        b=b<<9;
                        c=Low*Low;
                        j=a+c+b;
                    /* a为高2位,b为低8位,j=(a<<8+b)*(a<<8+b)= (a*a)<<16+2*(a<<8*b)+b*b=(a*a)<<16+(a*b)<<9+b*b.  */
                        data+=j;                    // 累加平方和
                }

        data=data*0.05;                                        // data除以20
       
        //data=262144;       
        //m=sqrt(data);                                        // 开平方根
        //m=576.123;
        //m=data*0.001953125;
        //data=2600;
       
        data=(data*10000);                  // 放大一万倍
        m1=sqrt_16(data);                   // m1是unsigned int类型数据,等于扩大了100倍
       
        //m2=m1*0.01;                       // 缩小一百倍
        //m1=Adresult;
        //Adresult=(unsigned int)m;             // 转换为整形数据
        //Adresult=(unsigned int)m2;             // 转换为整形数据
       
        Adresult=(m1*5)>>10;                    /* 将AD采样结果转换为两位数表示的值,即放大10倍,乘以满该度值5V,除以满刻度转换值10位(1024) */
/*

    //取采样值的平均值
        for(k=0;k<20;k++)
        {
                AD_Reseve_Average=Adresult;
                AD_Average_Point++;
        }

        if(AD_Average_Point>20)
        {
                AD_Average_Point=0;
                AD_Average_Finish_Flag=1;
        }
       
//=================================================
       
        for(k=0;k<20;k++)
        {
                AD_Average_Reseve_Progression+=Adresult;//累加AD采样值
                AD_Average_Point++;
        }

        if(AD_Average_Point>20)
        {
                AD_Average_Point=0;
                AD_Average_Finish_Flag=1;
        }
       
*/

//=====================================

/*
        for(k=0;k<20;k++)
        {
                AD_Average_Reseve_Progression+=Adresult;//累加AD采样值
                AD_Average_Point++;
                break;
        }

        if(AD_Average_Point>20)
        {
                k=0;
                AD_Average_Point=0;
                AD_Average_Finish_Flag=1;
        }
*/
        //for(k=0;k<20;k++)
        //{
                AD_Average_Reseve_Progression+=Adresult;//累加AD采样值
                AD_Average_Point++;
        //        break;
        //}

        if(AD_Average_Point>32)
        {
                //k=0;
                AD_Average_Point=0;
                AD_Average_Finish_Flag=1;
        }
        //Adresult=(((Adresult/10)<<4)&0xf0)+(Adresult % 10);/* 转换为带一位小数的BCD码实际值如25表示2.5V */
                                                       
}

/*         **************************************************************
**        函 数 名: AD_Average_Deal()
**        功    能:AD转换完成结果取平均值处理数据子程序
**        编    制: 大兵
**        日    期: 2010-5-29
****************************************************************** */
void AD_Average_Deal(void)
{
        //AD_Average_Reseve_End = (AD_Average_Reseve_Progression>>5);
        AD_Average_Reseve_End = (AD_Average_Reseve_Progression/32);
        AD_Average_Reseve_End_Transfer=AD_Average_Reseve_End;
        AD_Average_Reseve_Progression = 0;
        AD_Average_Reseve_End=0;
}

一周热门 更多>