3948|1

5

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

写了老长时间,相位差程序就是没用,以至于功率因素也搞不出来,大神们求帮忙看下程序 [复制链接]

5芯积分
#include
//#include "cry1602.c"
//#include "cry1602.h"
#include "cryfucns.h"
#include "displaydata.h"
#include
#include "BoardConfig.h"

char buf[];
float start;
float end;
int overflow;


//float pwm;

//float pwm_cha;
//int pwm_start1,pwm_end1,pwm_wide1;
//int pwm_start2,pwm_end2,pwm_wide2;
const unsigned char inaddr=0x84; //LCD第1行,输入数据地址

void int_clk()
{
    unsigned char i;
    BCSCTL1&=~XT2OFF;  //打开XT振荡器

    do
        {
        IFG1 &= ~OFIFG;                 //清除振荡错误标志
        for(i = 0; i < 100; i++)
          _NOP();                        //延时等待
        }
    while ((IFG1 & OFIFG) != 0);        //如果标志为1继续循环等待

    BCSCTL2|=SELM1+SELS;//MCLK 8M and SMCLK 8M  
    IFG1&=~OFIFG;
}
/* void mainttt()
{   

    WDTCTL = WDTPW + WDTHOLD;     //关闭看门狗
    BoardConfig(0xb2);            //关闭数码管和流水灯,4245

    int_clk();   //初始化时钟,MCLK 8M and SMCLK 8M  
    Ini_Lcd();   //初始化LCD


    Send(0,0x01);            //清屏
    Disp_SZ2(0x80, 5,0.5);
    //Disp_HZ(0x80,line1,2);  //显示3行汉字
    //Disp_HZ(0x90,line2,4);
   // Disp_HZ(0x88,line3,4);
    //Disp_HZ(0x98,line4,2);
     _EINT(); //开全局中断

    while(1);

}*/

void main(void)
{
        WDTCTL = WDTPW + WDTHOLD;
        BoardConfig(0xb2);            //关闭数码管和流水灯,4245
       int_clk();   //初始化时钟,MCLK 8M and SMCLK 8M  
       Ini_Lcd();   //初始化LCD

        //P2SEL|=BIT2;
        //P2SEL|=BIT3;



        P1SEL |= BIT2;                             //设置P1.2端口为功能模块使用
        TACTL |=TACLR;
        TACTL = TASSEL_2+TAIE+MC1;          //定时器A时钟信号选择SMCLK 8M,清计数寄存器,使能中断,同时设置定时器A计数模式为连续增计模式
        CCTL1 =CM0+SCS+CAP+CCIE;                //输入上升沿捕获,同步,capture模式 CCI0A为捕获信号源,中断使能                                 
        //TACCTL1 &=~CCIFG; //清CCR2 的标志位
        //中断允许


        /*TACTL |=TACLR;
        TACTL = TASSEL_2+TAIE+MC1;
        CCTL1 =CM0+SCS+CAP+CCIE;*/
        //CCTL1 = CCIE;                             // CCR0 interrupt enabled
        //CCR1 = 20000;
        //TACTL = TASSEL_2 + MC_2;                  // SMCLK, upmode
// _EINT();
        //TACCTL1 = CAP+CM_3+CCIS_0+SCS+CCIE;
        //TACCTL2 = CAP+CM_3+CCIS_0+SCS+CCIE;
        //TACTL = TASSEL_2+MC_2;               
        _EINT();
        LPM0;
        _NOP();

           // while(1)
        /*{
                if(pwm_end1>=pwm_start1)
                {
                        pwm_wide1=(pwm_end1-pwm_start1)*2;
                }
                else if(pwm_end1                 {
                        pwm_wide1=(pwm_start1-pwm_end1)*2;
                }
                pwm_cha=pwm_start1-pwm_start2;
                pwm=pwm_cha/pwm_wide1*360;*/


               // WDTCTL=WDT_ADLY_1000;   




                Send(0,0x01);            //清屏

                //Disp_SZ2(inaddr, (int)pwm,pwm-(int)pwm);
                Disp_SZ2(inaddr, (int)start,start-(int)start);
                Disp_HZ(0x80,line1,3);  //显示3行汉字
                while(1);
                //P6DIR|=BIT2:P6OUT|=BIT2;
                //LcdReset();
                //sprintf(buf,"%f",pwm);
                //DispNChar(3,0,4,buf);
        //}
}

/*#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A(void)
{


        switch(TAIV)
{case 2:
        if(TACCTL1 & CCI)
          pwm_start1=CCR1;
        else
          pwm_end1=CCR1;
        break;
case 4:
        if(TACCTL2 & CCI)
          pwm_start2=CCR2;
        else
          pwm_end2=CCR2;
        break;
case10:
        break;
}
LPM0_EXIT;
return;
}*/

#pragma vector=TIMERA1_VECTOR              //定时器A中断处理
__interrupt void timer_a(void)
{
switch(TAIV)                              //向量查询
  { case 2:                                //捕获中断
       if(CCTL1&CM0)                      //上升沿
         {
           CCTL1=(CCTL1&(~CM0))|CM1;       //更变设置为下降沿触发
           start=TACCR1;                      //记录初始时间
           overflow=0;                     //溢出计数变量复位
         }
       else if(CCTL1&CM1)                 //下降沿
        {  
         CCTL1=(CCTL1&(~CM1))|CM0;       //更变设置为上升沿触发           
         end=TACCR1;                        //用start,end,overflow计算脉冲宽度
         TACTL &=~TAIE;                    //不使能中断
         CCTL1 &=~CCIE;
         P1SEL &=~BIT2;
         _DINT();
         LPM0_EXIT;
        }   
       break;
    case 10:                               //定时器溢出中断
       overflow++;
       break;                              //溢出计数加1
    default:break;
  }
}

此帖出自电子竞赛论坛

最新回复

如果不要求频率,你可以用delay试试……去年我学姐就是这样移相的  详情 回复 发表于 2015-8-8 15:59
点赞 关注
 
 

回复
举报

36

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
如果不要求频率,你可以用delay试试……去年我学姐就是这样移相的
此帖出自电子竞赛论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表