微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 计算功率因数的编程问题

计算功率因数的编程问题

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

你要清楚51单片机的能力,它虽然支持浮点数运算,但是效果很差。你可能还没算完一组数据,下一个中断又到来了,结果可想而知。所以采用别的方法来取代浮点数,例如定点数,三角函数可以用查表。编程不是生搬硬套。不是会几个数学公式就可以直接套进去的,你要考虑cpu的能力,量力而行

直接用TH0,TL0查表得到功率因数不是非常快吗,直接拿它们两个数与某一个数进行比较,不就可以知道电流是超前还是滞后了?一个浮点数都不需要,就能很轻松的完成任务。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top