计算功率因数的编程问题

2019-07-15 19:36发布

向各位大神求助:我的毕设题目为基于单片机的低压无功补偿装置的研究我大概想法是:把电压电流信号经过过零比较器变换成与之同相位的方波信号,然后用其下降沿作为外部中断控制定时器的启停,用采集到的时间值求得相位差,进而计算出功率因数,但编程这块有点问题老是有问题,具体编程如下:

//利用外部中断控制定时器计时//
#include <reg51.h>
#include <math.h>//cos函数头文件
#define uchar unsigned char
#define uint unsigned int
sbit led1=P1^0;//计时指示灯
sbit led2=P1^1;//电容器投入指示灯
sbit relay=P1^7;//电容器控制端
float pi,t,pfact,fi;
void main()
{
        TMOD=0x01;//选定时器0的工作方式1
        TH0=0;//定时器0初始化
        TL0=0;
        EA=1;//开启总中断
        IT0=1;//外部中断选择下降沿触发
        IT1=1;
        EX0=1;//开启外部中断
        EX1=1;
        pi=3.141592653;
        while(1);//等待中断响应
}
//外部中断0响应后定时器首先清零,然后开启定时器开始计时//
void X0() interrupt 0
{
        TH0=0;//定时器清零
        TL0=0;
        TR0=1;//开启定时器
        led1=0;//点亮计时指示灯
}
//外部中断1响应时,关断定时器,计算出定时时间t,并调用cos函数计算出功率因数赋给pfact,进行比较操作//
void X1() interrupt 2
{
        TR0=0;//关断定时器0
        led1=1;//熄灭计时指示灯
        t=(256*TH0+TL0)/1000000;
        fi=100*pi*t;//计算相位差
        pfact=cos(fi);//计算功率因数
        if(t>0.01)      //如果电流超前,补偿过量则
        {
                relay=1;//切除电容器
                led2=1;//熄灭电容器投入指示灯
        }
        else        if(t>0.005&&t<0.01)//如果电流滞后电压超过90度
        {
            relay=0;//投入电容
                led2=0;//点亮电容器投入指示灯
        }
        else        if(t<0.005)
        {
                if(pfact<0.8)//如果功率因数小于设定值
                {        
                        relay=0;//投入电容
                        led2=0;
                }
        }
}


求各位大神指点迷津,不胜感激!!另外,如果要把计算出的浮点型数据pfact在液晶上显示,怎样才能将其转换成字符型????我的qq:350429119

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
2条回答
1522495332
2019-07-15 20:05
你要清楚51单片机的能力,它虽然支持浮点数运算,但是效果很差。你可能还没算完一组数据,下一个中断又到来了,结果可想而知。所以采用别的方法来取代浮点数,例如定点数,三角函数可以用查表。编程不是生搬硬套。不是会几个数学公式就可以直接套进去的,你要考虑cpu的能力,量力而行

评分

参与人数 1积分 +10 收起 理由 zhou2sheng + 10 感谢您的参与,您的支持是我们最大的动力.

查看全部评分

一周热门 更多>