完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
大家好,我是PIC18F4520单片机和MPLLABXC8外部中断的功率因数计项目。但我选择了概念,找到了V和IAS之间的角度,下面是ZCD的帮助。我的ZCD工作正常,如DSO所示。代码流:1)初始化tiMER0,EXT_INT0,EXT_INT1:2)在ISR中:(a)如果Timer0中断到来:(计数器++)b)等待直到V_INT0_ZCD:(Start Timer0[First Zero.]c)等待UntilI_INT1_ZCD:(Stop Timer0[第二Z Z]步骤b)和步骤c)d之间的增量计数器)然后使用计数器进行进一步计算。//代码如下///////////MyInter.Function//////////unsigned int.++,temp;if(TMR0IF){//11.0592MHZfor10us//Fosc for PIC=XTAL/4=11.0592MHZ/4=2.76//T=1/F=1/2.76=1/F=1/2.76=1/2.76=10.36//10us/0.36us=0.36/0.36us=27.77=27(Apporx)//65536-27=27272727757575509//65536-27=65509=65509=0xFF5T0CON=0X509=0xFF=0XCON=0x88;TMR0H=0H=0xFF;TMR0H=0xFF;TMR0H=0XFF;TMR0L=0XFL=0xE5;计数器++++++;计数器;++++++;},同时(INT0F)//电压ZCD(INT0F)//电压ZCD{TMRZCD{TMR0TMR0TMR(INT1IF)//Current ZCD{TMR0IE=0; //TIMEROFOFTMR0IFTMR0IF=0;///TMR0IF=0标志,清除=0标志,cleartemp=计数器;INT1IF=0;INT1IF=0;INT1IFIFIF=0;;/////////////////////////我的主要功能////////////////////空Timer_Ext_Ext_中断_InIt(){T0CON_Ext_Ext_Ext/////////////////////////////////////////////////IE=1;TMR0IF=0;/时间1用于扫描7-SEG T1CON=0x81;//16位预标标定TMR1H=0xC9;//负载TMR1H TMR1H TMR1H TMR1H TMR1H TMR1L=0xC9;//负载TMR1TMR1LTMR1LTMR1LTMR1IF=0;//负载TMR1L TMR1L TMR1IF=TMR1IF=0=0;TMR1IE=1;TMR1IE=1;TMR1=1;TMR1ON=1;1;INTCON2位,RBPU=0;RBPU=0;RBPU=0;INT0IE=1;INT0IE=1;INT0IE=1;INT0IE=1;INTEDG0=1;INTEDG0 INT1IF=0;PEIE=1;/周边中断GIE=1;////////////////////////////////////////////////////////////////////////////////////////////////////////////////空main主体(){长试_尝试;双重尝试;双计数__双计数_,角度;双计数尝试;角度角度;双双计数__双双计数双计数双双双_,双,双计数,角度角度;-------转换角到半径角= cos(Count);try=(long)(fabs(角度*1000.))Display(try);}/////////////////////////////////////////////////////////我的问题。PF计算是否正确?我没有得到正确的阅读。——卡兰
|
|
相关推荐
19个回答
|
|
|
这一切看起来有点疯狂:使用中断,然后停在里面…把GIE旗弄得乱七八糟……我会改写它。
|
|
|
|
|
|
谢谢Dario GreggioAny Clue,为了你的目的,重写吗?
|
|
|
|
|
|
请更新我。如果我做错了什么。谢谢。-卡兰。
|
|
|
|
|
|
|
|
|
|
|
|
嗨,角度计算错了。相移角度正比于电压过零和电流信号过零之间的时间差。缩放时间差:使用相同的定时单元计数信号波形的周期:int周期;/*波形计时器计数期间…角=(浮点)温度* 360 /(浮点)周期;/*角度度数。* /角=(浮点)TEMP * 2。* 3.14159 /(浮点)周期;/*角弧度。*/功率因数是:cos(角度)每10微秒重置定时器将使您的时间测量漂移,中断延迟时间和ISR中的处理时间,以及间隔的近似计算。rift,但是让定时器一直运行可能比较简单。然后,当电压ZCD发生时,将定时器0的值读入变量:start_time在当前ZCD发生时,将定时器0的值再次读入变量:end_time时间差将为:temp=end_time-start_time;时间差是以指令时钟周期为单位的:361.7纳秒。使用与定时器相同字长的无符号整数变量,可以正确地计算时间差,也可以在定时器从65535滚到0滚时正确地计算时间差。您还可以测量连续的时间间隔。在电压ZCD中断,以检查交流频率,以及您的时间测量的精度。我不太确定ZCD检测器的中断,您是否每半个周期或每个完整周期都会中断。测量比定时器滚动周期更长的间隔。23.7毫秒,您可以计算TMR0IF处理程序中中断的数目。
|
|
|
|
|
|
谢谢“MySILAND”诺斯古伊修改了代码。我认为下面是建议实现方式。再次感谢您提出的建议:.//////////////////char End_H,End_L;char Start_L,Start_H;unsigned int Elapsed_time;unsigned int Start_Time,End_Time;float.;//Modi.ISRTMR0H=0x00;0x00;//清除定时器用于重新加载TMR0IF=0;///清除标志位0;//清除标志位位//第一零交叉发现,同时(INT0IF){///增量自动增量自动增量自动增量自动增量自动调光TIMER 0始终运行在主Start_H=TMR0H中始终运行TIMER 0{//增量自动增量自动增量自动增量自动增量自动增量自动增量计时计时器TIMER 0始终运行在主Star_H=TMStart_H=TMR0H;////保存Star Star Star_L_L_L=TMR0L=TMR0L;///保存Star Star Star_L_L_L=TMR0L=TMRLLLLL;/重新装载TMR0L=0x00;重新装载TMR0IF=0;//重新装载TMR0IF=0;//清除定时器TMR0IF=0;//清除标志位//清除标志位//第二过零点,在(INT1IFIF){//增量自动布自动布布自动布布布布布自动布布布布布布式TIME器TIMER 0总是运行在主端_H=TMRH=TMR0H中运行;//INC+/INC+/INC+++/INC+++++++自动布线结束_结束_L L L=TMR0L=TMR0L=TMR0L=TMR0L=TMR0L;//INC+/INC++ INC++INC+TMR0L=0x00;//用于再次重新加载的清计时器TMR0H=0x00;//用于再次重新加载的清计时器TMR0H 0x00;//用于再次重新加载的清计时器//主要功能//重新加载的清计时器//主要功能{双计数,角度;System_Init(;Ext_Init_Init_Init(;Ext_中断中断_Init_Init();T0CON=0x08=0x08;TMR0ON=1;;;//计时器运行Alwayswhile(1){/计时器运行Alwayswhile(1){Start_时间={开始时间=(Start_时间=(Start_H<<;(Start_H< End_Time=(End_H<<8)+End_L;Elapsed_time=End_Time-Start_Time//这个时间差将以指令时钟周期为单位:361.7纳秒//XTAL FREQUENCY 11.0592MHZ//Fosc for PIC=XTAL/4=11.0592MHZ/4=2.761//T=1/F=1/2.761=0.3617us//361.7纳秒精子=361.7AN.GLE =(浮点)EAPSESED时间* 360 /(浮点)周期;/*角度度数。* /角度=(浮点)EclipSee时间* 2。* 3.14159 /(浮点)周期;/*角弧度。*///这是功率因数,即:COS(角)/Pf%=(长)(Fab(角×100))}
|
|
|
|
|
|
我想你误解了功率因数的含义。你所描述的(U和I之间的角度)叫做cosphi,它与功率因数有关,但不等于功率因数。要看出区别:假设你有一个传统的电源:变压器、二极管桥、电容器、调节器。当负载很小时,从AC获得的电流是导通的。在正弦波的顶部。你会得到一个在U和I之间没有角(或很小)的电流,但是它与“100%功率因数”相差很远。为了找到功率因数,你必须同时对U和I进行采样,每次正弦波的采样次数越多(越精确)。然后将每个样本U与对应的I相乘,以给出真正的幂。然后,你可以计算RMS U和I,并计算出类似的功率。真正的和无形的力量之间的比率是你所寻找的:功率因数。
|
|
|
|
|
|
谢谢Hans JonkerYes。你是对的。。但是EE中的功率因数定义为:1)超前角或滞后角的余弦[电压和电流之间的角余弦]2)比率=R/Z=电阻/阻抗3)比率=真功率/表观功率=W/VAI,使用1)方法。
|
|
|
|
|
|
你好,在只有8位数据总线的微控制器上读取16位定时器有一个技巧。参见数据表中的11.2节。我想当从定时器读取数据时,建议在读取TMR0H之前读取TMR0L寄存器。如果运行时写入定时器,则相反:在写TMR0L之前写TMR0H。HJonker,我不确定你是要纠正我,还是要纠正原来的海报。在我的理解中,功率因数是有功和无功(电感)元件之间的比率。通常解释的理论是假设电感负载,比如交流异步电动机和/或感应负载。或者使用传统的感应镇流器的荧光灯照明,假设电压和电流都保持正弦波形。我同意,对于开关电源、带有电子镇流器的灯具或者带有变频器用于速度控制的电动机,通常都是这样。关于正弦电流波形的数目不再有效,使得关于平均电流、电流幅度和RMS值之间的关系的假设无效。据我所知,具有DC中间级的功率变换器可能具有很小的相移,并且最终可能表示电容。v负载,电压和电流过零点可能无法正确检测到。去年,通过采样和数值积分,关于电流的真正有效值测量,有一段很长的路要走。对电流和电压进行采样可以更准确地计算真实功率和其他参数,但我怀疑原始海报是否已经准备好了。
|
|
|
|
|
|
注意计时器。你需要一个自由运行的计时器。你不需要重写它或者写信给它。
|
|
|
|
|
|
感谢@Mysiland@NorthGuyI再次修改了代码。但是没有在PC上获得稳定/正确读取。日志和波形作为附件。//系统化无效SystemInit(){//GPIO设置ADCON1=0x0F;TRISD=0x00;//Make Whole Port as OutputTRISE=0x00;//Make Whole Port as OutputTRISB=0x03; //Timer0 settingsT0CON=0x08;//1:1PreScaleTMR0H=0x00;TMR0L=0x00;TMR0ON=1;//TimerRuns Al.[Not Reset in Whole Program]如NorthGuyGIE=1建议的;//Globalinter..//INT0 settings...INT0IE=1;//Enable INT1INTEDG0=1;//在下降沿IN的中断T0IF=0;//clear标志//INT1设置...INT1IE=1;//enable INT1INTEDG1=1;//inter.onfalledgeINT1IF=0;//clear标志INTCON2bits.RBPU=0;//Enable Pull Up}//GlobalVariable声明art_H,End_H,Elapsed_时间;无符号字符Start_L,结束_L;浮动周期;//ISRvoid_中断中断中断(无效)//ISRvoid_中断中断中断(无效)//ISRvovovovovovovoid_中断中断_中断中断_中断_中断_中断_中断_中断_中断_中断(INT0IF){/第一零交叉建立同时(INT0IFIF){_开始_L=TMRL=TMR0L L L L TMR0L L L L L TMR0L;//读取TMRRRR0000000000000LLLLTMRRRR0LLLLLLLLLLLLL发现(INT1IF){End_L=TMR0L;._//读取TMR0L(如@Mysil所建议的)End_H=TMR0L=TMR0L(如@Mysil)End_H=TMR0H建议;INT1IF=0;//清除INT1标志标志破旗;}}}}}///用于在PC超端面形凸面凸面凸面(无符号c)(无符号c){同时在(PIR1位.TXIF=TXIF=0){(PIR1位.TXIF=TXIF==0);//CHECK传输标志TITXREG TITXREG=C;//CHECK传输标志TITXREK传输标志TITTTTTXREG每百分数;双计数,角度;Serial_Init();System_Init();System_Init();System_Init();Ext_Inter._Init();Ext_Inter._Init();Ext_Inter._Init();Init(1){Start_Time_Time_Time=(Start_Start_Time_Time_Time=(Start_H< lt lt__H<< lt;lt lt;8)+Star_L;End_End_End_End_End_L;End H<;<8)+End_L Elapsed_Elapsed_time=End_time=End_Time=End_Time-Star_Time_Time_Time=End_Time-StarTime=%drn”,End_Timeprintf("Elapsed Time=%drn""Elapsed Time=%drn""Elapsed时间);////////////////////////这个时间差将以指令时钟周期为单位存在:361.7纳秒/////////////////////////这个时间差将以指令时钟周期为单位单位:361.7纳秒:361.7纳秒//XTAL FRXTALFREQUQUENC11.0592MHCY11.0592MHZ//Fosc/Fosc,PIC=PIC=XTAC=XTAL/FoSC天使E=(浮点)EXAPSEDE时间* 360 /(浮点)周期;/*角度度数。*//这是功率因数:cos(Angle)PFPercentage=(long)(fabs(Angle*100));printf(“PF%ldrn”,PFPercentage)}请指教。
|
|
|
|
|
|
你需要确保在交叉点之间不计算停留时间。最简单的方法是在获得End_H之后立即将该部分移到中断。如果信号不是这些信号的相干光环,则这将产生不稳定的输出。如果你想处理这些情况,就需要更多的工作。
|
|
|
|
|
|
定义(1)仅在电压和电流在基频处均为正弦且电压或电流中均无谐波或失真的情况下为真。如Hans Jonker所指出的,在现实世界中有任何意义的功率因数的定义是定义(3)。
|
|
|
|
|
|
感谢“MySILAND”NordGuiy我有点接近完成这项工作。但是,还没有成功。以下是我在代码中修改过的内容。1)我还在ISR.2中使用AVG of Elapsed_time.2)在main中使用了伪延迟进行ZCD计算。3)在PF计算之前禁用中断,在主机中PF计算之后再次启用它4)也在行下移位以中断“immed”在获得End_H之后。f DSO上的ZCD.日志附件.谢谢//Global Variable--声明关注,如@Mysil)建议的,无符号int Start_Time、End_Time、Start_H、End_H、Elapsed_time;无符号char Start_L、End_L;双计数、角度;双周期=361.7;long temp=0,Avg=0;初始化temp和Avg t0char循环=0;/////ISRvoid_u中断中断中断(无效){//ISRvoid_中断中断中断中断(无效){//ISRvoid_中断中断中断_中断(无效){//ISRvovovovovovovovovovovovovovovovovo_ISRvoid_中断中断中断中断_中断中断中断(INT0IF){(INT0IF){(INT0IF{(INT0IF){Start_Start_L=TMR0IF){Start_Start_L=TMR0L=INT0IF{(INT0IF){{Start_Start_L=TMR0L=TMRlt;<8)+End_L;Start_Time=(Start_H<<8)+Start_L;Elapsed_time=End_Time-Start_Time;//如NorthGuy.++建议的;temp+=Elapsed_time;if(.==100){Avg=(long)(temp/100);//按照Mysil的建议,注意平均//类型转换=0;//为下一轮temp=0重新加载循环0;//为下一轮重新加载温度到0}INT1IF=0;//为下一轮中断清除INT1标志;}//我的主要时间(1){GIE=0;//禁用全局中断//禁用外部中断INT0IE=0;//禁用外部中断0INT1IE=0;//禁用外部中断1打印(“AvgElaped_time=%ldr”n,“avg”;计数=(浮点)AVG*2。* 3.14159 /(浮点)周期;/ /在弧度中的角度。Angle=(float)cos(Count);PFPercentage=(long)(fabs(Angle*1000.);printf(“PFPercentage=%drn”,PFPercentage);GIE=1;//EnableGlobalInter.INT0IE=1;//EnableExternalInter.0INT1IE=1;//EnableExternalInter.1//EnableExternalInter.1//EnableE10KTCYx(100);//Dummy Delay f或ZCD计算}——卡兰
|
|
|
|
|
|
嗨,你的周期错了。交流输入信号的周期与CPU指令时钟的周期不一样。如果你测量交流电网的相移,在50Hz网络中这个周期仍然是20毫秒,在60Hz电源中是16.667毫秒。以361.7毫秒为单位,20毫秒。毫秒是55294计数器,在50Hz的整个周期内递增。和以前一样,你可以测量输入电压信号的周期,就像测量相移差时间一样。对于用来在ISR和主程序之间取值的全局变量,我认为你应该ld将这些变量声明为“volatile”变量:否则,如果您有可能使用编译器的优化版本来构建程序,编译器可能会欺骗您。
|
|
|
|
|
|
谢谢@MysilYes.我正在研究50Hz频率的交流电网.F=50HZ和T=1/50=20ms并且很抱歉我在交流输入信号周期和CPU指令时钟周期之间的错误解释.我不能理解下面的线路.我的情况可能是周期?我如何计算?还是像下面这样?没有优化版本,使用免费版本编译器。代码中的其他东西是好的吗?再次感谢——卡兰
|
|
|
|
|
|
在MysIL提出的两种方法中,我认为测量连续零交叉点之间的距离更好。这是因为它不需要任何特定的时钟精度,也将在任何频率下工作。
|
|
|
|
|
|
感谢@Mysiland@NorthGuyI在DSO上查看过。它显示了ZCD_V和ZCD_I的周期为20.00ms。在代码中?@ Mysiland @ NordGuy这里我有点困惑,我怎么写它在程序中。?——卡兰
|
|
|
|
|
|
你测量轮班。你也可以测量周期,这是同一信号上连续交叉的距离的两倍。
|
|
|
|
|
只有小组成员才能发言,加入小组>>
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
475 浏览 0 评论
5794 浏览 9 评论
2334 浏览 8 评论
2224 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3530 浏览 3 评论
1124浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
1098浏览 1评论
我是Microchip 的代理商,有PIC16F1829T-I/SS 技术问题可以咨询我,微信:A-chip-Ti
873浏览 1评论
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
475浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 11:49 , Processed in 1.138024 second(s), Total 113, Slave 94 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
4429