本帖最后由 wenyangzeng 于 2017-4-26 20:16 编辑
方案功能: 功率因数是衡量电气设备效率高低的一个重要参数。在交流电路中,电压与电流之间的相位差(Φ)的余弦叫做功率因数,用符号cosΦ表示,在数值上,功率因数是有功功率和视在功率的比值,即cosΦ=P/S。本方案使用STM32F10X-128K-EVAL开发板实现了功率因数表的功能。 关键词:功率因数,STM32F103。 工作原理介绍 通过电压互感器和电流互感器从供电系统采样电压和电流信号,经过比较器转换成方波,连接STM32F103VB的一个定时器捕捉输入和一个外部中断输入。在定时器捕捉输入的第一个触发中断时读取TIM3的初值,并清零TIM2的计数器值,在第二个触发中断时获得交流电的周期值TIM3。外部中断获得TIM2电流与电压的相位差(Φ)。通过运算得到功率因数值在LCD屏幕上显示。 利用STM32F系列丰富的资源实施本方案很简单。STM32F103VB有多达8个定时器,可以根据实际应用灵活选择其中2个定时器来完成数据采样任务。STM32F10X-128K-EVAL已经配备TFT-LCD模块,软件稍加修改即可用于显示运行结果。 软件运行过程: 1、初始化后启动TIM2、TIM3。 2、TIM3-CC2捕捉使能,进入第一次中断清零TIM2-CNT并保存当前CNT3值 开启EXTI中断;第二次中断保存另一次CNT3值。获得一个交流电电压周期值。 3、EXTI中断读取CNT2值,获得交流电电流与电压的相位差。 4、主函数负责LCD刷新和 cosΦ运算。
流程图
STM32F10X-128K-EVAL开发板 视频:
- void TIM3_IRQHandler(void)
- {
- if(TIM_GetITStatus(TIM3, TIM_IT_CC2) == SET)
- {
- TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
- if(Capture3Number == 0)
- {
- IC3ReadValue1 = TIM_GetCapture2(TIM3);
- Capture3Number = 1;
- TIM2->CNT=0x0000;
- EXTI->IMR |=0X0002;
- }
- else if(Capture3Number == 1)
- {
- IC3ReadValue2 = TIM_GetCapture2(TIM3);
- if (IC3ReadValue2 > IC3ReadValue1)
- Cycle = (IC3ReadValue2 - IC3ReadValue1);
- else
- Cycle = ((0xFFFF - IC3ReadValue1) + IC3ReadValue2);
-
-
-
- TIM_ITConfig(TIM3, TIM_IT_CC2, DISABLE);
- Number_Swap();
- Capture3Number = 0;
- }
- }
- }
- void EXTI1_IRQHandler(void)
- {
- if(EXTI_GetITStatus(EXTI_Line1) != RESET)
- { EXTI_ClearITPendingBit(EXTI_Line1);
- EXTI->IMR &=~0X0002;
- Capture= TIM2->CNT;
- }
- }
- void Number_Swap(void)
- { uint8_t DispBuf[6];
- static double temp=0;
- a=(double)Cycle/360.0;
- b=(double)Capture/a;
- if(b >=180) b -=181;
- if(b<=90.0)
- DispBuf[0]=' ';
- else
- DispBuf[1]='-';
- a = (float)cos((b*3.1415)/180.0)*100.0;
- if(a<0)
- {
- a = a-0.499;
- a=(float)a*(-1);
- }
- else
- {
- a = a+0.499;
- }
- temp=temp+a;
- i++;
- if(i==10)
- {
- data =temp*10;
- temp=0;
- i=0;
- DispBuf[0]=' ';
- DispBuf[2]=data%100000/10000+0x30;;
- DispBuf[3]='.';
- DispBuf[4]=data%10000/1000+0x30;
- DispBuf[5]=data%1000/100+0x30;
- refcolumn = 219;
- LCD_DisplayStringLine(Line5,DispBuf);
- }
- TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);
- }
- int main(void)
- {
- SystemInit();
- RCC_Configuration();
- SysTick_Init();
- BSP_init();
- refcolumn = 249;
- LCD_DisplayStringLine(Line3,"Power factor:");[media=swf,500,375]http://player.youku.com/player.php/sid/XMTcwNjE3OTIyNA==/v.swf[/media]
- LCD_DrawRect(20,300,200,280);
-
- while (1)
- {
- }
- }
复制代码
http://player.youku.com/player.php/sid/XMTcwNjE3OTIyNA==/v.swf
|