📄 sample.c
字号:
/*************************************************************
WPD800 采样中断模块 采用定时器0
修改历史 2007-9-25 zaken create version 1.0
*************************************************************/
#include "config.h"
#include "target.h"
#include "main.h"
#include "timer.h"
#include "intctrl.h"
#include "sample.h"
#define SAM_INT_NUM 4 //定时器0中断号
volatile int16 nSam[SAM_BUF_LEN][SAM_AI_NUM];//采样数据区
volatile int16 wSamCnt=0; //采样指针
volatile WORD Time_Flag;
WORD wFtCnt=0; //数据指针
int32 lFt[SAM_BUF_LEN][24]; //递归富氏缓冲区,实、虚部分量 多出来的4个用来存开入量
int32 lFt0[32]; //递归富氏暂存值
volatile DWORD dTCounter=0;//计数器
static bool SamCalcEnable=0;//是否允许采样计算(上电先等待缓冲满再开放计算)
void Sample_Int(void);
void ft(void);
//采样初始化
bool Sam_Init(void)
{
//清除采样缓冲区
IO0SET |= (1<<7); /* 关闭BEEP */
wSamCnt=0;
wFtCnt=0;
SamCalcEnable=0;
dTCounter=0;
Time_Flag=0;
//定时器0设置
T0TC=0;
T0PR=0;
T0MCR=0x03;
T0MR0=Fpclk/1000; //1ms 一个点 该数字是否加1是取决于小数点后一位的值大小
T0TCR=0x01;//启动定时器
dTCounter=0xffffffff;
Int_Setup(SAM_INT_NUM,(uint32)Sample_Int,0,1);//优先级最高,FIQ
return OK;
}
extern WORD rpt_time;
void Clock_Deal()
{
if( g_tDate.ms >= 59999 )
{
if( g_tDate.min >= 59 )
{
if( g_tDate.hour >= 23 )
{
//置读取RTC标志
rpt_time=(g_tDate.day)|(g_tDate.month<<6)|((g_tDate.year % 100)<<8);
Time_Flag|=TIME_DAY|TIME_HOUR;
g_bNeed_Get_Time=TRUE;
}
else
{
Time_Flag|=TIME_HOUR;
g_tDate.hour++;
}
g_tDate.min=0;
}
else
{
g_tDate.min++;
}
Time_Flag|=TIME_MIN;
g_tDate.ms=0;
}
else
{
g_tDate.ms++;
}
}
void Sample_Int(void)
{
dTCounter++;
if((dTCounter % 1000)==0)
{
if ((IO0SET & (1<<7)) == 0)
IO0SET = (1<<7); /* 关闭BEEP */
else
IO0CLR = (1<<7);
}
//计算时间
Clock_Deal();
//采样...
if(SamCalcEnable)
{
//滤波计算
ft();
}
else
{
if(dTCounter>SAM_BUF_LEN)
SamCalcEnable=1;
}
T0IR=0x01;//clear int flag
VICVectAddr=0;//中断处理结束
}
//3点差分半波递归傅立叶算法
//公式=s(k)-s(k-3)+s(k-10)-s(k-13)
WORD wFtCftCnt=0;//递归中系数计数器
//实部系数
const long FAFre[20]=
{
0,+1115,+2121,+2920,+3432,+3609,+3432,+2920,+2121,+1115,
0,-1115,-2121,-2920,-3432,-3609,-3432,-2920,-2121,-1115,
};
//虚部系数
//Im(i)=(Cos(18*i)*65536/5)/(2*sin(27))
const long FAFim[20]=
{
+3609,+3432,+2920,+2121,+1115,0,-1115,-2121,-2920,-3432,
-3609,-3432,-2920,-2121,-1115,0,+1115,+2121,+2920,+3432,
};
void ft(void)
{
volatile int16 *pSam0,*pSam3,*pSam10,*pSam13;
int32 *pFtRe,*pFtIm,ltemp;
int8 i;
pSam0=&nSam[wSamCnt][0];//s[k]
pSam3=&nSam[(wSamCnt-3)&(SAM_BUF_MOD)][0];//s(k-3)
pSam10=&nSam[(wSamCnt-10)&(SAM_BUF_MOD)][0];//s(k-10)
pSam13=&nSam[(wSamCnt-13)&(SAM_BUF_MOD)][0];//s(k-13)
pFtRe=&lFt0[0];//实部指针
pFtIm=&lFt0[SAM_AI_NUM];//虚部指针
for(i=0;i<SAM_AI_NUM;i++)//计算各路采样
{
ltemp=(*pSam0++)-(*pSam3++)+(*pSam10++)-(*pSam13++);
(*pFtRe++)+=ltemp*FAFre[wFtCftCnt];//实部
(*pFtIm++)+=ltemp*FAFim[wFtCftCnt];//虚部
}
pFtIm=&lFt[wFtCnt][0];
//把暂存实虚部移到傅氏缓冲区
for(i=0;i<(SAM_AI_NUM<<1);i++)
{
(*pFtIm++)=(*pFtRe++);
}
wFtCnt=(wFtCnt+1)&(SAM_BUF_MOD);
wSamCnt=(wSamCnt+1)&(SAM_BUF_MOD);
wFtCftCnt++;//系数递增
if(wFtCftCnt>=SAM_CYCLE_NUM)
wFtCftCnt=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -