⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sample.c

📁 lpc2136芯片的硬件全部功能示例程序
💻 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 + -