📄 main.c
字号:
//***************************************************************
// File Name : main.c
// Author : Steaven
// Created : 2008-07-26
// Modified :
// Revision : V0.0
//***************************************************************
#include "includes.h"
//constant definition
#define cLineRatio 9333
//global variables definition
INT8U bLine_Event = 0; //Line Calculation Event
INT8U bLineCnt = 0; //Line Sampling Count
INT8U bLineCntTemp = 0; //Line Sampling Count(temporary)
INT16S wLineVoltSample = 0; //Line Sampling Value
INT16S wLineVoltReal = 0; //Line Instant Value
INT16S wLineVoltRMS = 0; //Line RMS Value
INT16U wLinePeriod = 0; //Line Period
INT16U wLinePeriodTemp = 0; //Line Period(temporary)
INT16U wLineCaptureTime = 0; //Line Capature Time
INT16U wLineCaptureTimeLast = 0; //Line Last Capature Time
INT32U dwLineVoltSum = 0; //Line S-I Accumulation
INT32U dwLineVoltSumTemp = 0; //Line S-I Accumulation(temporary)
//local function declaration
INT16U swRoot(INT32U dwNumber);
void main(void)
{
Hardware_Init();
Init_UART();
while(1)
{
if(bLine_Event == 1)
{
bLine_Event = 0;
if(bLineCnt != 0)
{
wLineVoltRMS = swRoot(dwLineVoltSum/bLineCnt);
}
}
}
}
//***************************************************************
// Function : wTimeCountr0_Interrupt
// Input : none
// Output : none
// Description : ATmega16 T/C0 ISR
//***************************************************************
#pragma interrupt_handler TimeCountr0_Interrupt:20
void TimeCountr0_Interrupt(void)
{
INT16U temp1,temp2;
//Clear wTimeCountr0 OCIF Flag
TIFR |= 0x02;
TCNT0 = 0x00;
//Read ADC Conversion
temp1 = (INT16U)ADCL;
temp2 = (INT16U)ADCH;
wLineVoltSample = (temp2 << 8) | temp1;
wLineVoltReal = (INT16S)(((INT32S)(wLineVoltSample - 512) * cLineRatio) >> 10);
if(wLineVoltReal < 0)
{
wLineVoltReal = -wLineVoltReal;
}
dwLineVoltSumTemp += (INT32S)wLineVoltReal * (INT32S)wLineVoltReal;
bLineCntTemp++;
/*
if(bLineCntTemp >= 40)
{
dwLineVoltSum = dwLineVoltSumTemp;
dwLineVoltSumTemp = 0;
bLineCnt = bLineCntTemp;
bLineCntTemp = 0;
bLine_Event = 1;
}
*/
}
//***************************************************************
// Function : Timer1Capture_Interrupt
// Input : none
// Output : none
// Description : ATmega16 T/C1-Capature ISR
//***************************************************************
#pragma interrupt_handler Timer1Capture_Interrupt:6
void Timer1Capture_Interrupt(void)
{
INT16U temp1,temp2;
//Clear Interrupt Flag
TIFR |= 0x20;
//Calculate Line Period
wLineCaptureTimeLast = wLineCaptureTime;
wLineCaptureTime = ICR1;
wLinePeriodTemp = wLineCaptureTime - wLineCaptureTimeLast;
if((wLinePeriodTemp >= 14285) && (wLinePeriodTemp <= 25000))
{
wLinePeriod = wLinePeriodTemp;
}
//Acquire Line Volt Accumulation
dwLineVoltSum = dwLineVoltSumTemp;
dwLineVoltSumTemp = 0;
bLineCnt = bLineCntTemp;
bLineCntTemp = 0;
bLine_Event = 1;
}
//***************************************************************
// Function : swRoot
// Input : dwNumber
// Output : Square Root of input
// Description : Square Root Calculate
//***************************************************************
INT16U swRoot(INT32U dwNumber)
{
INT8U ii;
INT32U dwSquareRoot;
if(dwNumber == 0)
{
return (0);
}
if(dwNumber <= 4194304)
{
dwSquareRoot = dwNumber / 1024 + 63;
}
else if(dwNumber <= 134217728)
{
dwSquareRoot = dwNumber / 4096 + 255;
}
else
{
dwSquareRoot = dwNumber / 16384 + 1023;
}
for (ii = 0;ii < 5;ii++)
{
dwSquareRoot = (dwSquareRoot + dwNumber / dwSquareRoot) / 2;
}
return((INT16U)dwSquareRoot);
}
//=========================END OF FILE=========================//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -